Agent (TypeScript)
์ญํ
Agent๋ Starnion์ AI ๋๋์ ๋๋ค. TypeScript/Node.js๋ก ์์ฑ๋์์ผ๋ฉฐ Anthropic AI SDK v6์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. Gateway๋ก๋ถํฐ gRPC ์์ฒญ์ ๋ฐ์ AI ์ถ๋ก , ์คํฌ ์คํ์ ์ํํ๊ณ ์ต์ข ์๋ต์ ๋ฐํํฉ๋๋ค.
ํต์ฌ ์ญํ :
- ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ๋ถ์ํ์ฌ ์๋ ํ์
- ์ ์ ํ ์คํฌ(Tool)์ ์ ํํ๊ณ ์คํ (diary, finance, goals, image)
- Anthropic Claude ๋ชจ๋ธ๋ก ์๋ต ์์ฑ
- gRPC ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์ค์๊ฐ ์๋ต ์ ๋ฌ
AI SDK v6 ์ํคํ ์ฒ
Agent๋ Anthropic AI SDK v6์ Tool Use ํจํด์ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ์ ๋ฉ์์ง
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ AI SDK v6 ์ฒ๋ฆฌ ๋ฃจํ โ
โ โ
โ โโโโโโโโโโโโโโโโ ์คํฌ ์ ํ โ
โ โ Claude ๋ชจ๋ธ โโโโโโโโโโโโโโโโโโโโ โ
โ โ (Anthropic) โ โ โ
โ โโโโโโโโโโโโโโโโ โผ โ
โ โฒ โโโโโโโโโโโโโโโโโโโโ
โ โ ๊ฒฐ๊ณผ ๋ฐํ โ ์คํฌ ์คํ โโ
โ โ โ (diary/finance/ โโ
โ โโโโโโดโโโโโโโโ โ goals/image) โโ
โ โ ์คํฌ ๊ฒฐ๊ณผ โโโโโโโโ โ
โ โโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SSE ์คํธ๋ฆฌ๋ฐ ์๋ต
โผ
gRPC ์คํธ๋ฆฌ๋ฐ โ Gateway โ ํด๋ผ์ด์ธํธ
๋์ ํ๋ฆ ์์ฝ
- ์ ๋ ฅ ์์ : Gateway๋ก๋ถํฐ gRPC ์์ฒญ ์์ (์ฌ์ฉ์ ๋ฉ์์ง + ์ธ์ ID)
- ์ปจํ ์คํธ ๋ก๋ฉ: ๋ํ ์ด๋ ฅ ๋ฐ ์ฌ์ฉ์ ์ค์ ๋ก๋
- LLM ์ถ๋ก : ์์คํ ํ๋กฌํํธ + ๋ํ ์ด๋ ฅ์ Claude ๋ชจ๋ธ์ ์ ๋ฌ
- ์คํฌ ์คํ: ๋ชจ๋ธ์ด ํ์ํ ์คํฌ์ ์ ํํ๋ฉด ํด๋น ํจ์ ์คํ
- ์๋ต ์คํธ๋ฆฌ๋ฐ: SSE ํ์์ผ๋ก gRPC ์คํธ๋ฆผ์ ํตํด ์ค์๊ฐ ์ ์ก
๋ฉ์์ง ์ฒ๋ฆฌ ํ๋ฆ
์ฌ์ฉ์ ์
๋ ฅ: "์ด๋ฒ ๋ฌ ์๋น๊ฐ ์ผ๋ง์ผ?"
โ
โผ
[์๋ ํ์
]
โ "๊ฐ๊ณ๋ถ ์กฐํ" ์๋ ๊ฐ์ง
โ
โผ
[๋ฉ๋ชจ๋ฆฌ ๊ฒ์]
โ ๊ด๋ จ ๊ฐ๊ณ๋ถ ๋ฐ์ดํฐ ๊ฒ์ (Layer 4: SQL)
โ ์ด์ ์ ์ฌ ์ง๋ฌธ ๊ธฐ์ต ๊ฒ์ (Layer 1: pgvector)
โ
โผ
[์คํฌ ์ ํ]
โ get_finance_summary(category="์๋น", period="this_month") ํธ์ถ
โ
โผ
[์คํฌ ์คํ]
โ DB์์ ์ด๋ฒ ๋ฌ ์๋น ํธ๋์ญ์
์ง๊ณ
โ ๊ฒฐ๊ณผ: {"total": 234500, "transactions": [...]}
โ
โผ
[LLM ์ต์ข
์๋ต ์์ฑ]
โ "์ด๋ฒ ๋ฌ ์๋น๋ 234,500์์ด์์. ์ง๋๋ฌ(198,000์)๋ณด๋ค 18% ๋์๋ค์."
โ
โผ
[gRPC ์คํธ๋ฆฌ๋ฐ ์ ์ก]
โ ์๋ต ํ ํฐ์ ์ค์๊ฐ์ผ๋ก Gateway์ ์ ์ก
โ
โผ
[๋ฉ๋ชจ๋ฆฌ ์ ์ฅ]
โ ์ด๋ฒ ๋ํ ๋ด์ฉ์ ์ผ์ผ ๋ก๊ทธ์ ๊ธฐ๋ก
๋ฉํฐ LLM ๋ผ์ฐํ
Agent๋ ์ฌ์ฉ์๋ณ๋ก ๋ฑ๋ก๋ LLM ํ๋ก๋ฐ์ด๋์ ํ์ฌ ์ ํ๋ ํ๋ฅด์๋(Persona)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํธ์ถํ ๋ชจ๋ธ์ ๊ฒฐ์ ํฉ๋๋ค.
๋ชจ๋ธ ์ ํ ์ฐ์ ์์
1. ํ์ฌ ๋ํ์์ ๋ช
์์ ์ผ๋ก ์ ํ๋ ๋ชจ๋ธ
โ (์์ผ๋ฉด)
2. ํ์ฌ ํ๋ฅด์๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ธ
โ (์์ผ๋ฉด)
3. ์ฌ์ฉ์ ๊ธฐ๋ณธ ํ๋ก๋ฐ์ด๋์ ์ฒซ ๋ฒ์งธ ํ์ฑ ๋ชจ๋ธ
โ (์์ผ๋ฉด)
4. ์์คํ
๊ธฐ๋ณธ๊ฐ (Gemini Flash)
์ง์ ํ๋ก๋ฐ์ด๋
| ํ๋ก๋ฐ์ด๋ | ๊ตฌํ ๋ฐฉ์ |
|---|---|
| Gemini | google-generativeai SDK |
| OpenAI | openai SDK (ChatCompletion API) |
| Anthropic | anthropic SDK (Messages API) |
| Z.AI | OpenAI ํธํ ์๋ํฌ์ธํธ |
| Custom | OpenAI ํธํ ๋ฒ ์ด์ค URL |
4-Layer ๋ฉ๋ชจ๋ฆฌ ์์คํ
Agent๋ 4๊ฐ์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ ํตํด ์ฌ์ฉ์ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ 4-Layer Memory โ
โ โ
โ Layer 1: ์ผ์ผ ๋ก๊ทธ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ pgvector, 768์ฐจ์ ์๋ฒ ๋ฉ โ โ
โ โ ๋ํ ๊ธฐ๋ก, ๊ฐ์ , ํค์๋ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ ์ฌ๋ ๊ฒ์ โ
โ Layer 2: ์ง์ ๋ฒ ์ด์ค โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ pgvector, 768์ฐจ์ ์๋ฒ ๋ฉ โ โ
โ โ ์ฌ์ฉ์ ์ ํธ, ํ์ต๋ ํจํด โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ ์ฌ๋ ๊ฒ์ โ
โ Layer 3: ๋ฌธ์ ์น์
โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ pgvector, 768์ฐจ์ ์๋ฒ ๋ฉ โ โ
โ โ ์
๋ก๋๋ ๋ฌธ์์ ์ฒญํฌ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ SQL ์ฟผ๋ฆฌ โ
โ Layer 4: ์ต๊ทผ ๊ฐ๊ณ๋ถ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ PostgreSQL SQL โ โ
โ โ ์ต๊ทผ 30์ผ ๊ฑฐ๋ ๋ด์ญ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Layer 1: ์ผ์ผ ๋ก๊ทธ
- ์ ์ฅ์: PostgreSQL + pgvector ํ์ฅ
- ์๋ฒ ๋ฉ ์ฐจ์: 768์ฐจ์ (Gemini
text-embedding-004) - ๋ด์ฉ: ๋ํ ๋ด์ฉ, ๊ฐ์ ์ํ, ์ฃผ์ ํค์๋, ์์ฝ
- ๊ฒ์ ๋ฐฉ์: ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ธฐ๋ฐ ์๋ฏธ ๊ฒ์
- ์ฉ๋: โ์ ๋ฒ์ ๋ญ๋ผ๊ณ ํ๋๋ผ?โ ๊ฐ์ ๊ณผ๊ฑฐ ๋ํ ํ์
Layer 2: ์ง์ ๋ฒ ์ด์ค
- ์ ์ฅ์: PostgreSQL + pgvector
- ์๋ฒ ๋ฉ ์ฐจ์: 768์ฐจ์
- ๋ด์ฉ: ์ฌ์ฉ์ ์ ํธ, ๋ฐ๋ณต ํจํด, ํ์ต๋ ๊ฐ์ธํ ์ ๋ณด
- ์ฉ๋: โ์ฌ์ฉ์๊ฐ ์ปคํผ๋ฅผ ์ข์ํ๋คโ, โ๋งค๋ฌ 25์ผ์ ์๊ธ ์ ๊ธโ ๋ฑ ๊ฐ์ธํ ์ปจํ ์คํธ
Layer 3: ๋ฌธ์ ์น์
- ์ ์ฅ์: PostgreSQL + pgvector
- ์๋ฒ ๋ฉ ์ฐจ์: 768์ฐจ์
- ๋ด์ฉ: ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ PDF, Word ๋ฑ์ ๋ฌธ์ ์ฒญํฌ
- ์ฒญํน ๋ฐฉ์: ์๋ฏธ ๋จ์๋ก ๋ถํ (๊ธฐ๋ณธ 512 ํ ํฐ)
- ์ฉ๋: โ๋ด๊ฐ ์ ๋ก๋ํ ๊ณ์ฝ์์์ ์์ฝ๊ธ ์กฐํญ ์ฐพ์์คโ
Layer 4: ์ต๊ทผ ๊ฐ๊ณ๋ถ
- ์ ์ฅ์: PostgreSQL (์ผ๋ฐ SQL, ๋ฒกํฐ ์์)
- ๋ด์ฉ: ์ต๊ทผ 30์ผ ๊ฑฐ๋ ๋ด์ญ
- ๊ฒ์ ๋ฐฉ์: SQL ์ง๊ณ ์ฟผ๋ฆฌ
- ์ฉ๋: โ์ด๋ฒ ๋ฌ ์๋น ์ผ๋ง์ผ?โ, โ์ด์ ์นดํ ์ง์ถ ์์์ด?โ
์๋ฒ ๋ฉ
๋ชจ๋ ๋ฒกํฐ ์๋ฒ ๋ฉ์ Google์ text-embedding-004 ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๋ชจ๋ธ | text-embedding-004 |
| ์ฐจ์ | 768 |
| ์ ์ฌ๋ ํจ์ | ์ฝ์ฌ์ธ ์ ์ฌ๋ (<=> ์ฐ์ฐ์) |
| ์ธ์ด | ํ๊ตญ์ด ํฌํจ ๋ค๊ตญ์ด ์ง์ |
์๋ฒ ๋ฉ ์์ฑ ํ๋ฆ:
ํ
์คํธ ์
๋ ฅ
โ
โผ
Gemini Embedding API ํธ์ถ
โ
โผ
768์ฐจ์ float ๋ฒกํฐ ๋ฐํ
โ
โผ
PostgreSQL pgvector ์ปฌ๋ผ์ ์ ์ฅ
(์: VECTOR(768))
gRPC ์ธํฐํ์ด์ค
Agent๋ gRPC ์๋ฒ๋ก ๋์ํ๋ฉฐ ๊ธฐ๋ณธ ํฌํธ 50051์ ์ฌ์ฉํฉ๋๋ค.
์๋น์ค ์ ์ (protobuf)
service AgentService {
// ๋จ๋ฐฉํฅ ์ฑํ
์์ฒญ/์๋ต
rpc Chat(ChatRequest) returns (ChatResponse);
// ์๋ฒ ์คํธ๋ฆฌ๋ฐ: ์๋ต ํ ํฐ์ ์ค์๊ฐ์ผ๋ก ์ ์ก
rpc ChatStream(ChatRequest) returns (stream ChatStreamResponse);
}
ํต์ ํ๋ฆ
Gateway (Go) Agent (Python)
โ โ
โโโ ChatRequest โโโโโโโโโโโโโโโบโ
โ (message, user_id, โ
โ conversation_id, โ ReAct ๋ฃจํ ์คํ
โ context, files) โ ์คํฌ ์คํ
โ โ
โโโโ ChatStreamResponse โโโโโโโโโ (ํ ํฐ ๋จ์ ์คํธ๋ฆฌ๋ฐ)
โโโโ ChatStreamResponse โโโโโโโโโ
โโโโ ChatStreamResponse โโโโโโโโโ
โ ... โ
โโโโ [stream end] โโโโโโโโโโโโโโโ
Gateway๋ ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ฐ์ WebSocket ๋๋ SSE(Server-Sent Events)๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
์คํฌ ์คํ ๋ฉ์ปค๋์ฆ
์คํฌ์ LangChain Tool๋ก ๊ตฌํ๋ฉ๋๋ค. LLM์ด JSON ํ์์ผ๋ก ํธ์ถํ ์คํฌ๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒฐ์ ํ๋ฉด Agent๊ฐ ํด๋น Python ํจ์๋ฅผ ์คํํฉ๋๋ค.
์คํฌ ์นดํ ๊ณ ๋ฆฌ
| ์นดํ ๊ณ ๋ฆฌ | ์คํฌ ์์ |
|---|---|
| ๊ฐ๊ณ๋ถ | ๊ฑฐ๋ ์ถ๊ฐ/์กฐํ, ์์ฐ ํ์ธ, ํต๊ณ |
| ์ผ์ | Google Calendar ์ฐ๋ |
| ๋ฉ๋ชจ | ๋ฉ๋ชจ ์์ฑ/์กฐํ/์ญ์ |
| ์ผ๊ธฐ | ์ผ๊ธฐ ์์ฑ/์กฐํ |
| ๋ชฉํ | ๋ชฉํ ์ค์ /์ฒดํฌ์ธ/ํ๊ฐ |
| D-Day | D-Day ๋ฑ๋ก/์กฐํ |
| ๋ฌธ์ | ๋ฌธ์ ๊ฒ์, PDF ์์ฝ |
| ์น ๊ฒ์ | Tavily, ๋ค์ด๋ฒ ๊ฒ์ API |
| ๋ ์จ | ํ์ฌ ๋ ์จ ์กฐํ |
| ๊ณ์ฐ๊ธฐ | ์์ ๊ณ์ฐ |
| ๋ฒ์ญ | ๋ค๊ตญ์ด ๋ฒ์ญ |
์คํฌ ํ์ฑํ
์คํฌ์ ์ฌ์ฉ์๋ณ๋ก ํ์ฑํ/๋นํ์ฑํ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ๋นํ์ฑํ๋ ์คํฌ์ LLM์ Tool ๋ชฉ๋ก์ ํฌํจ๋์ง ์์ผ๋ฏ๋ก ํธ์ถ๋์ง ์์ต๋๋ค.
Settings โ Skills ๋ฉ๋ด์์ ํ ๊ธ๋ก ์ ์ดํ๊ฑฐ๋ API POST /api/v1/skills/:id/toggle์ ์ฌ์ฉํฉ๋๋ค.
Docker ๊ตฌ์ฑ
Agent๋ docker/Dockerfile.agent๋ฅผ ์ฌ์ฉํ๊ณ docker-compose.yml์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
agent:
build:
context: ../agent
dockerfile: ../docker/Dockerfile.agent
container_name: starnion-agent
ports:
- "${GRPC_PORT:-50051}:50051" # gRPC ์๋ฒ
environment:
DATABASE_URL: postgres://... # PostgreSQL ์ฐ๊ฒฐ
GRPC_PORT: 50051
depends_on:
postgres:
condition: service_healthy
Agent๋ PostgreSQL์ด ์ค๋น๋ ํ์ ์์๋ฉ๋๋ค. Gateway๋ Agent๊ฐ ์์๋ ํ ์ฐ๊ฒฐ์ ์๋ํฉ๋๋ค.
๊ธฐ์ ์คํ ์์ฝ
| ํญ๋ชฉ | ์ ํ | ๋ฒ์ |
|---|---|---|
| ์ธ์ด | Python | 3.13+ |
| AI ์ค์ผ์คํธ๋ ์ด์ | LangGraph | 0.4+ |
| LLM ํด๋ผ์ด์ธํธ | langchain-google-genai, langchain-anthropic, langchain-openai | ์ต์ |
| ๋ํ ์ํ ์ ์ฅ | langgraph-checkpoint-postgres | 2.0+ |
| DB ๋๋ผ์ด๋ฒ | psycopg (psycopg3) + psycopg-pool | 3.2+ |
| gRPC ์๋ฒ | grpcio | 1.70+ |
| ์ด๋ฏธ์ง ์์ฑ/๋ถ์ | google-genai (Gemini) | 1.0+ |
| ๋ฌธ์ ํ์ฑ | pypdf, python-docx, openpyxl, python-pptx | ์ต์ |
| ์น ๊ฒ์ | tavily-python | 0.5+ |
| ๋ธ๋ผ์ฐ์ ์๋ํ | playwright | 1.40+ |
| QR ์ฝ๋ | qrcode[pil] | 8.0+ |
| PDF ์์ฑ | reportlab | 4.4+ |
์คํฌ ์ํคํ ์ฒ
๊ฐ ์คํฌ์ ๋ ๋ฆฝ๋ Python ํจํค์ง๋ก ๊ตฌํ๋ฉ๋๋ค.
agent/src/starnion_agent/skills/
โโโ finance/ # ๊ฐ๊ณ๋ถ
โ โโโ __init__.py # ์คํฌ ๋ฑ๋ก
โ โโโ tools.py # LangChain Tool ํจ์ ์ ์
โ โโโ SKILL.md # ์คํฌ ์ค๋ช
(LLM ์์คํ
ํ๋กฌํํธ์ ์ฃผ์
)
โโโ weather/
โ โโโ __init__.py
โ โโโ tools.py
โ โโโ SKILL.md
โโโ loader.py # ์คํฌ ๋์ ๋ก๋ฉ
โโโ guard.py # ์คํฌ ์ ๊ทผ ๊ถํ ๊ฒ์ฌ
โโโ registry.py # ์ ์ฒด ์คํฌ ๋ ์ง์คํธ๋ฆฌ
SKILL.md์ ์ญํ
๊ฐ ์คํฌ ๋๋ ํฐ๋ฆฌ์ SKILL.md ํ์ผ์ LLM ์์คํ
ํ๋กฌํํธ์ ์ง์ ์ฃผ์
๋ฉ๋๋ค. ์ด๋ฅผ ํตํด LLM์ด ๊ฐ ์คํฌ์ ์ฌ์ฉ ์กฐ๊ฑด๊ณผ ๋ฐฉ๋ฒ์ ์ ํํ ์ ์ ์์ต๋๋ค.
์์คํ
ํ๋กฌํํธ = ๊ธฐ๋ณธ ํ๋ฅด์๋ + ํ์ฑ ์คํฌ์ SKILL.md ๋ด์ฉ
์คํฌ ๊ฐ๋ (Skill Guard)
์ฌ์ฉ์๊ฐ ๋นํ์ฑํํ ์คํฌ์ guard.py์์ ์ฐจ๋จ๋ฉ๋๋ค. ๋นํ์ฑ ์คํฌ์ ๋๊ตฌ(Tool)๋ LLM์ ๋
ธ์ถ๋์ง ์์ ํธ์ถ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ก๊ทธ ๋ฐ HTTP ์๋ฒ
Agent๋ gRPC ํฌํธ(50051) ์ธ์๋ HTTP ์๋ฒ(8082 ํฌํธ)๋ฅผ ์ด์ํฉ๋๋ค.
| ํฌํธ | ์ฉ๋ |
|---|---|
50051 |
gRPC ์๋ฒ (Gateway์ ํต์ ) |
8082 |
HTTP ์๋ฒ (๋ก๊ทธ ์คํธ๋ฆฌ๋ฐ, ๋ฌธ์ ์ธ๋ฑ์ฑ, ๊ฒ์ ์๋ฒ ๋ฉ) |
Gateway์ /api/v1/logs/agent ์๋ํฌ์ธํธ๋ Agent์ 8082 ํฌํธ๋ก ํ๋ก์ํ์ฌ ์ค์๊ฐ Agent ๋ก๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค.