1. AI Agent ๊ฐ์
• AI Agent
: LLM์ ์ถ๋ก &์์ฌ๊ฒฐ์ ์ค์ฌ์ผ๋ก ์ฌ์ฉํด '๊ณํ ์๋ฆฝ → ์คํ → ๊ด์ฐฐ → ํ๋จ' ๋ฐ๋ณตํ๋ฉฐ ์์จ์ ์ผ๋ก ๋ชฉํ ๋ฌ์ฑํ๋ ์์คํ
• Workflow vs Agent
- Workflow : ๋ฏธ๋ฆฌ ์ ํด์ง ์ ์ฐจ๋๋ก ์คํ(๋ฐ๋ณต์ ·์ ํํ๋ ์์ ์ ์ ํฉ)
- Agent : ์ํฉ์ ๋ฐ๋ผ ์ค์ค๋ก ํ๋จํด ๋๊ตฌ·ํ๋ ์ ํ(์ค๊ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํ๋ฆ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ์ ์ ํฉ)
• ์ฃผ์ ํน์ง
โ ์์จ์ฑ : LLM ์ถ๋ก ์ค์ค๋ก ํ๋จ(๊ท์น ๊ธฐ๋ฐ X)
โ ๋ชฉํ ์งํฅ์ฑ : "์ด ํ๋์ด ๋ชฉํ ๋ฌ์ฑ์ ๋์์ด ๋๋๊ฐ" ๊ธฐ์ค ํ๋จ
โ ๋๊ตฌ ํ์ฉ : ์ธ๋ถ API·๋๊ตฌ๋ก ์ค์ ์์ ์ํ
โ ์ธ๊ฐ ๊ฐ์ ์ต์ํ : ์ฌ๋์ ์ด๊ธฐ ๋ชฉํ ์ ์&์ต์ข ์น์ธ ์ ๋๋ง ๊ฐ์
2. ์ฑ๊ธ ์์ด์ ํธ vs ๋ฉํฐ ์์ด์ ํธ
• ์ฑ๊ธ ์์ด์ ํธ : ํ๋์ ์ปจํ ์คํธ ์์์ ์ธ์-์ถ๋ก -ํ๋-๊ด์ฐฐ ๋ชจ๋ ์ฒ๋ฆฌ
- ์ฅ์ : ๋จ์, ์ ์ง์ฐ, ์ ๋น์ฉ, ์ถ์ ์ฉ์ด
- ํ๊ณ : ์ปจํ ์คํธ ํ๊ณ, ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ถ๊ฐ
• ๋ฉํฐ ์์ด์ ํธ : ์ค์ผ์คํธ๋ ์ดํฐ(์ํผ๋ฐ์ด์ )๊ฐ ์์ ๋ถํดํด ์์ปค ์์ด์ ํธ๋ค์๊ฒ ์์, ๊ฒฐ๊ณผ ์ข ํฉ
- ๊ตฌ์ฑ ํจํด : ์ํผ๋ฐ์ด์ -์์ปค, ์์ฐจ ํ์ดํ๋ผ์ธ, ์ํ์ ํ์
- ๋น์ฉ / ์ํ : ์กฐ์จ ๋น์จ ๋ฐ์, ํ ํฐ ์๋น ๊ธ์ฆ
Anthropic ๋ฆฌ์์น ์ฌ๋ก : ๋ฆฌ๋(Opus) + ์๋ธ(Sonnet) ๋ฉํฐ ์์ด์ ํธ๊ฐ ๋จ์ผ Opus ๋๋น ์ฝ 90% ์ด์ ๋์ ์ฑ๋ฅ
→ ์ฃผ๋ก ํ ํฐ ์ฌ์ฉ๋ ๋ฐ ๋ณ๋ ฌ ์ปจํ ์คํธ ๋ถ์ฐ ๋๋ถ
3. ReAct ํจํด
: Reasoning + Acting ๊ฒฐํฉํ ํ๋กฌํํ ํจํด
• ๋์ : ์ง๋ฌธ ์ ๋ ฅ → ์ฌ๊ณ (Thought) → ํ๋(Action, ๋๊ตฌ ํธ์ถ) → ๊ด์ฐฐ(Observation) → ๋ฐ๋ณต ๋๋ ์ข ๋ฃ
• ์ฅ์ : ํฌ๋ช ์ฑ(๋๋ฒ๊น ์ฉ์ด), ์ ํ์ฑ(ํ๊ฐ ๊ฐ์), ์ ์ฐ์ฑ, ํด์ ๊ฐ๋ฅ์ฑ

4. Tool๊ณผ Toll Calling
• Tool์ด ํ์ํ ์ด์ - LLM์ ํ๊ณ
| LLM ํ๊ณ | ๋ถ๋ฅ | Tool ๋์ | ์์ |
| Knowledge Cutoff | Read | ์ต์ ์ ๋ณด ์กฐํ | Web Search, News API |
| ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฏธ์ ๊ทผ | Read | ํ์ฌ ๋ฐ์ดํฐ ์กฐํ | DB Query, Weather API |
| ๊ฐ์ธ·์กฐ์ง ๋ฐ์ดํฐ ๋ฏธ์ ๊ทผ | Read | ํ์ผ·๋ฌธ์ ์ ๊ทผ | File Reader |
| ์ฐ์ฐ ๋ถ์ ํ / ์ฝ๋ ์คํ ๋ถ๊ฐ | Execute | ๊ณ์ฐ·์ฝ๋ ์คํ ์์ | Calculator, Python REPL |
| ์์คํ ์ฐ๋ ๋ถ๊ฐ | Execute | ์ธ๋ถ ์ก์ | REST API, ๋ฉ์์ง ์ ์ก |
• Tool Calling 3๋จ๊ณ
โ Tool Binding(model.bind_tools([...]) → โ LLM ํ์ ์ tool_calls ๋ฐํ โ tool ์คํ ํ ๊ฒฐ๊ณผ(ToolMessage)๋ฅผ ๋ค์ LLM์ ์ ๋ฌ

5. LangChain Built-in Tools
• TavilySearch(langchain-tavily) : ํค์๋/์ถ์ฒ ๊ธฐ๋ฐ, ์ธ์ฉ์ ๊ฐํจ(์ 1000ํ ๋ฌด๋ฃ)
• ExaSearchResults / ExaFindSimilarResults(langchain-exa) : ์๋ฒ ๋ฉ ๊ธฐ๋ฐ ์๋ฏธ ๊ฒ์(neural / keyword / auto), livecrawl ์ต์ ์ ๊ณต. ์์ฐ์ด ์ค๋ช ๋ง์ผ๋ก ๊ด๋ จ ํ์ด์ง ํ์์ ๊ฐํจ
6. LLM Tool Calling ํ๋ฆ
โ Tool Binding
model = ChatOpenAI(model="gpt-5.4-mini")
tool_model = model.bind_tools(tools=[exa_search])
• ์๋ต์ content์ tool_calls ์ค ํ๋๋ง ๊ฐ ์กด์ฌ(tool ํธ์ถ ํ์ ์ content๋ ๋น ๋ฌธ์์ด, tool_calls์ ์ ๋ณด)
โ Tool ํธ์ถ
search_result1 = exa_search.invoke(result3.tool_calls[0]) # ๋จ๊ฑด
search_result = exa_search.batch(result3.tool_calls) # ๋ณต์(batch)
• ๋ฐํ ํ์ : ToolMessage
โ Tool ๊ฒฐ๊ณผ๋ฅผ ๋ค์ LLM์ ์ ๋ฌ
• ํ๋กฌํํธ ์์ : system/human → tool_calls ๋ด๊ธด AIMessage → ToolMessage
• MessagesPlaceholder(variable_name="tool_messages", optional=True)๋ก ํ๋กฌํํธ์ ์ฝ์
@chain
def web_agent(query: str) -> tuple[str, list]:
messages = []
ai_message = tool_model_chain.invoke(query)
while ai_message.tool_calls:
for tool_call in ai_message.tool_calls:
if tool_call["name"] == tavily_search_name:
messages.append(tavily_search.invoke(tool_call))
elif tool_call["name"] == exa_search_name:
messages.append(exa_search.invoke(tool_call))
messages = [ai_message] + messages
ai_message = tool_model_chain.invoke({"query": query, "tool_messages": messages})
messages.append(ai_message)
return ai_message.content, messages
- ์ด ํจํด์ด ๊ณง ReAct ๋ฃจํ(Thought → Action → Observation ๋ฐ๋ณต) ์ฝ๋ ๊ตฌํ
'STUDY > AI Agent' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [AI Agent] LangGraph1 (0) | 2026.07.16 |
|---|---|
| [AI Agent] AI Agent์ ToolCalling2 (0) | 2026.07.14 |