Ver3.0 ๐ค LangChain Agent ๊ตฌ์กฐ ์๋ฒฝ ์ดํด์ ์ค์ ํ์ฉ ๊ฐ์ด๋

๐ค LangChain Agent ๊ตฌ์กฐ ์๋ฒฝ ์ดํด์ ์ค์ ํ์ฉ ๊ฐ์ด๋
AI๊ฐ ์ค์ค๋ก ์๊ฐํ๊ณ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ง๋ฒ ๊ฐ์ ์ธ๊ณ๋ก์ ์ด๋ โจ
์๋
, ์น๊ตฌ! ๐โโ๏ธ ์์ฆ AI ๊ฐ๋ฐํ๋ฉด์ "์ด ๋
์์ด ์ข ๋ ๋๋ํ๊ฒ ์ค์ค๋ก ํ๋จํ๊ณ ํ๋ํ๋ฉด ์ข๊ฒ ๋๋ฐ..."๋ผ๊ณ ์๊ฐํด๋ณธ ์ ์์ง? ๋ฐ๋ก ๊ทธ ๊ณ ๋ฏผ์ ํด๊ฒฐํด์ฃผ๋ ๊ฒ LangChain Agent์ผ!
๋จ์ํ ์ง๋ฌธ์ ๋ต๋ณ๋ง ํ๋ ์ฑ๋ด์ ๋์ด์, AI๊ฐ ์ค์ค๋ก ํ์ํ ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์์จ์ ์ธ ์์คํ
์ ๋ง๋ค ์ ์๋ค๋ฉด? ์ ๋ง ๋ฉ์ง์ง ์์? ๐
์ค๋์ LangChain Agent์ ๊ตฌ์กฐ๋ถํฐ ์ค์ ํ์ฉ๊น์ง, ์น๊ตฌ์๊ฒ ์ค๋ช
ํ๋ฏ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ํ์ด๋ณผ๊ฒ. ์ปคํผ ํ ์ โ ์ค๋นํ๊ณ ํธํ๊ฒ ์ฝ์ด๋ด!
๐ฏ LangChain Agent๊ฐ ๋ญ๊ธธ๋?
๋จผ์ ๊ธฐ๋ณธ๋ถํฐ ์ง๊ณ ๋์ด๊ฐ์! LangChain Agent๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์๊ฒ ์์จ์ฑ์ ๋ถ์ฌํ๋ ํ๋ ์์ํฌ์ผ. ์ฝ๊ฒ ๋งํด์, AI์๊ฒ "๋ ์ค์ค๋ก ์๊ฐํด์ ํ์ํ ๋๊ตฌ ๊ณจ๋ผ ์ฐ๊ณ ๋ฌธ์ ํด๊ฒฐํด๋ด!"๋ผ๊ณ ๊ถํ์ ์ฃผ๋ ๊ฑฐ์ง. ๐
์ผ๋ฐ์ ์ธ LLM ์ฒด์ธ์ ๋ฏธ๋ฆฌ ์ ํด์ง ์์๋๋ก๋ง ์๋ํด. A โ B โ C ์ด๋ฐ ์์ผ๋ก ๋ง์ด์ผ. ๊ทผ๋ฐ Agent๋ ๋ค๋ฅด๊ฑฐ๋ ? ์ํฉ์ ๋ณด๊ณ "์... ์ด๊ฑด ๊ณ์ฐ๊ธฐ๊ฐ ํ์ํ๊ฒ ๋๊ฑธ?" ๋๋ "์ด๊ฑด ์น ๊ฒ์์ ํด์ผ๊ฒ ์ด!"๋ผ๊ณ ์ค์ค๋ก ํ๋จํ๊ณ ํ๋ํด. ๐ฎ
๐ก ์ค์ํ ๋น์ ๋ก ์ดํดํ๊ธฐ
Agent๋ฅผ ์๋ฆฌ์ฌ์ ๋น์ ํด๋ณผ๊น? ๐งโ๐ณ
์ผ๋ฐ ์ฒด์ธ: ๋ ์ํผ๋๋ก๋ง ์๋ฆฌํ๋ ์ด๋ณด ์๋ฆฌ์ฌ. "1. ์ํ ์ฐ๊ธฐ โ 2. ๋ณถ๊ธฐ โ 3. ์๊ธ ๋ฃ๊ธฐ" ์์ ๊ทธ๋๋ก๋ง ๋ฐ๋ผํด.
Agent: ๊ฒฝํ ๋ง์ ์
ฐํ! ์ฌ๋ฃ ์ํ ๋ณด๊ณ "์ค๋ ์ํ๊ฐ ์ข ๋ฌผ๋ ํ๋ค? ๋ณถ๋ ์๊ฐ ์ค์ด๊ณ ๋์ ๋ง๋์ ๋ ๋ฃ์." ์ด๋ ๊ฒ ์ํฉ์ ๋ง์ถฐ ์ ์ฐํ๊ฒ ๋์ํ๋ ๊ฑฐ์ง. ๐จ
๐ ์ฌ๋ฅ๋ท Tip: AI/๋จธ์ ๋ฌ๋ ๊ฐ๋ฐ ๋ถ์ผ์์ Agent ์์คํ ๊ตฌ์ถ ๋ฅ๋ ฅ์ ์ ๋ง ํซํ ์คํฌ์ด์ผ! ์ฌ๋ฅ๋ท์์๋ ์ด๋ฐ ์ ๋ฌธ ์ง์์ ๊ณต์ ํ๊ฑฐ๋ ํ๋ก์ ํธ ์๋ขฐ๋ฅผ ๋ฐ์ ์ ์์ผ๋ ์ฐธ๊ณ ํด๋ด. ๐
๐๏ธ Agent์ ํต์ฌ ๊ตฌ์กฐ ํํค์น๊ธฐ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Agent์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ฏ์ด๋ณด์! Agent๋ ํฌ๊ฒ 4๊ฐ์ง ํต์ฌ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด ์์ด. ๊ฐ๊ฐ์ด ์ด๋ค ์ญํ ์ ํ๋์ง ํ๋์ฉ ์ดํด๋ณผ๊ฒ. ๐
1๏ธโฃ Agent Core (์์ด์ ํธ ์ฝ์ด)
Agent์ ๋๋ ์ญํ ์ ํ๋ ๋ถ๋ถ์ด์ผ. LLM์ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ, ์ฌ์ฉ์์ ์์ฒญ์ ๋ถ์ํ๊ณ "๋ค์์ ๋ญ ํด์ผ ํ ๊น?"๋ฅผ ๊ฒฐ์ ํ๋ ์์ฌ๊ฒฐ์ ์์ง์ด์ง. ๐ง
์ฃผ์ ๊ธฐ๋ฅ:
โข ์ฌ์ฉ์ ์
๋ ฅ(Query) ํด์ ๋ฐ ์ดํด
โข ํ์ฌ ์ํฉ ๋ถ์ (์ปจํ
์คํธ ํ์
)
โข ๋ค์ ํ๋(Action) ๊ฒฐ์
โข ๋๊ตฌ ์ ํ ๋ฐ ์คํ ๋ช
๋ น
โข ์ต์ข
๋ต๋ณ ์์ฑ
Agent Core๋ ๋ณดํต GPT-4, Claude, Gemini ๊ฐ์ ๊ฐ๋ ฅํ LLM์ ์ฌ์ฉํด. ์๋ํ๋ฉด ๋ณต์กํ ์ถ๋ก ๋ฅ๋ ฅ์ด ํ์ํ๊ฑฐ๋ ! ๐ช
2๏ธโฃ Tools (๋๊ตฌ๋ค)
Agent๊ฐ ์ค์ ๋ก ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ ๋ชจ์์ด์ผ. ๋ง์น ์ค์์ค ์๋ฏธ ๋์ดํ์ฒ๋ผ ๋ค์ํ ๋๊ตฌ๊ฐ ์ค๋น๋์ด ์์ง! ๐ ๏ธ
๋ํ์ ์ธ Tool ์์:
โข Search Tool: ๊ตฌ๊ธ, ๋น ๋ฑ ์น ๊ฒ์ ๐
โข Calculator: ์ํ ๊ณ์ฐ ๐งฎ
โข Database Query: DB ์กฐํ ๋ฐ ์ฟผ๋ฆฌ ์คํ ๐พ
โข API Call: ์ธ๋ถ API ํธ์ถ (๋ ์จ, ์ฃผ์ ์ ๋ณด ๋ฑ) ๐
โข Python REPL: ํ์ด์ฌ ์ฝ๋ ์คํ ๐
โข File Operations: ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ ๐
๊ฐ Tool์ ๋ช
ํํ ์ค๋ช
(Description)์ ๊ฐ์ง๊ณ ์์ด์ผ ํด. Agent๊ฐ "์ด ๋๊ตฌ๋ ์ธ์ ์จ์ผ ํ๋์ง"๋ฅผ ํ๋จํ ์ ์๋๋ก ๋ง์ด์ผ!
# Tool ์ ์ ์์
from langchain.tools import Tool
def calculate(expression: str) -> str:
"""์ํ ๊ณ์ฐ์ ์ํํฉ๋๋ค."""
try:
result = eval(expression)
return f"๊ณ์ฐ ๊ฒฐ๊ณผ: {result}"
except:
return "๊ณ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
calculator_tool = Tool(
name="Calculator",
func=calculate,
description="์ํ ๊ณ์ฐ์ด ํ์ํ ๋ ์ฌ์ฉํ์ธ์. ์
๋ ฅ: ์์ ๋ฌธ์์ด (์: '2+2', '10*5')"
)
3๏ธโฃ Memory (๋ฉ๋ชจ๋ฆฌ)
Agent๊ฐ ๋ํ ๋งฅ๋ฝ์ ๊ธฐ์ตํ๊ณ ์ด์ ์ํธ์์ฉ์ ์ฐธ๊ณ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํฌ๋ํธ์ผ. ์ฌ๋์ฒ๋ผ "์๊น ๊ทธ ์๊ธฐ ๋ง์ธ๋ฐ..."๋ผ๊ณ ์ด์ด๊ฐ ์ ์๊ฒ ํด์ฃผ์ง! ๐ง ๐ญ
Memory ํ์
:
โข ConversationBufferMemory: ๋ชจ๋ ๋ํ ๋ด์ฉ์ ๊ทธ๋๋ก ์ ์ฅ ๐
โข ConversationSummaryMemory: ๋ํ๋ฅผ ์์ฝํด์ ์ ์ฅ (ํ ํฐ ์ ์ฝ) ๐
โข ConversationBufferWindowMemory: ์ต๊ทผ N๊ฐ ๋ํ๋ง ๊ธฐ์ต ๐ช
โข VectorStoreMemory: ๋ฒกํฐ DB์ ์ ์ฅํ๊ณ ์ ์ฌ๋ ๊ฒ์ ๐ฏ
Memory๊ฐ ์์ผ๋ฉด Agent๋ ๋งค๋ฒ ์ฒ์ ๋ง๋ ๊ฒ์ฒ๋ผ ํ๋ํด. "๋ ๋๊ตฌ์ผ?" ์ํ๊ฐ ๋๋ ๊ฑฐ์ง. ๐
4๏ธโฃ Agent Executor (์คํ ์์ง)
Agent์ ์คํ ๋ฃจํ๋ฅผ ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ์ผ. Agent Core์ ๊ฒฐ์ ์ ์ค์ ๋ก ์คํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ค์ Agent์๊ฒ ์ ๋ฌํ๋ ์ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ค. ๐
์คํ ํ๋ฆ:
1. ์ฌ์ฉ์ ์
๋ ฅ ๋ฐ๊ธฐ
2. Agent Core์๊ฒ ์ ๋ฌ
3. Agent๊ฐ ํ๋ ๊ฒฐ์ (Tool ์ ํ ๋๋ ์ต์ข
๋ต๋ณ)
4. Tool ์คํ (ํ์์)
5. ๊ฒฐ๊ณผ๋ฅผ Agent์๊ฒ ํผ๋๋ฐฑ
6. 2~5 ๋ฐ๋ณต (์ต๋ ๋ฐ๋ณต ํ์๊น์ง)
7. ์ต์ข
๋ต๋ณ ๋ฐํ
Executor๋ ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง, ์๋ฌ ํธ๋ค๋ง, ํ์์์ ๊ด๋ฆฌ ๊ฐ์ ์์ ์ฅ์น๋ ํฌํจํ๊ณ ์์ด. ๐ก๏ธ
๐จ Agent ํ์ ๋ณ ํน์ง๊ณผ ์ ํ ๊ฐ์ด๋
LangChain์ ๋ค์ํ Agent ํ์ ์ ์ ๊ณตํด. ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ผ๋ ์ํฉ์ ๋ง๊ฒ ๊ณจ๋ผ ์ฐ๋ฉด ๋ผ! ๋ง์น RPG ๊ฒ์์์ ์ง์ ์ ํํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐ฎ
๐น Zero-shot ReAct Agent
ํน์ง: ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ๋ฒ์ฉ์ ์ธ Agent ํ์
์ด์ผ. "ReAct"๋ Reasoning(์ถ๋ก ) + Acting(ํ๋)์ ํฉ์ฑ์ด๋ก, ์๊ฐํ๊ณ ํ๋ํ๋ ํจํด์ ๋ฐ๋ณตํด. ๐คโก๏ธ๐ช
์๋ ๋ฐฉ์:
โข Tool ์ค๋ช
๋ง ๋ณด๊ณ ์ด๋ค ๋๊ตฌ๋ฅผ ์ธ์ง ๊ฒฐ์ (Zero-shot)
โข "Thought โ Action โ Observation" ์ฌ์ดํด ๋ฐ๋ณต
โข ๋ณ๋์ ์์ ์์ด๋ ์๋
์ฅ์ : ์ค์ ์ด ๊ฐ๋จํ๊ณ ์ ์ฐํจ โจ
๋จ์ : ๋ณต์กํ ์ถ๋ก ์๋ ์ฝํ ์ ์์ ๐
์ถ์ฒ ์ํฉ: ๋น ๋ฅธ ํ๋กํ ํ์
, ๊ฐ๋จํ ์์
, ๋ค์ํ ๋๊ตฌ ์กฐํฉ
๐น Conversational ReAct Agent
ํน์ง: Zero-shot ReAct์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐํํ ๋ฒ์ ์ด์ผ. ๋ฉํฐํด ๋ํ์ ์ต์ ํ๋์ด ์์ง! ๐ฌ
์๋ ๋ฐฉ์:
โข ์ด์ ๋ํ ๋ด์ฉ์ ๊ณ์ ์ฐธ๊ณ
โข ๋งฅ๋ฝ์ ์ ์งํ๋ฉด์ ๋๊ตฌ ์ฌ์ฉ
โข "๋ ์๊น ๋ญ๋ผ๊ณ ํ์ง?" ๊ฐ์ ์ง๋ฌธ์๋ ๋์ ๊ฐ๋ฅ
์ฅ์ : ์์ฐ์ค๋ฌ์ด ๋ํ ํ๋ฆ ์ ์ง ๐ฃ๏ธ
๋จ์ : ํ ํฐ ์ฌ์ฉ๋์ด ๋ง์์ง ์ ์์ ๐ธ
์ถ์ฒ ์ํฉ: ์ฑ๋ด, ๊ณ ๊ฐ ์ง์, ๋ํํ ์ด์์คํดํธ
๐น ReAct Docstore Agent
ํน์ง: ๋ฌธ์ ๊ฒ์๊ณผ ํ์์ ํนํ๋ Agent์ผ. Wikipedia ๊ฐ์ ๋์ฉ๋ ๋ฌธ์์์ ์ ๋ณด๋ฅผ ์ฐพ๋ ๋ฐ ๊ฐ๋ ฅํด! ๐
์๋ ๋ฐฉ์:
โข Search์ Lookup ๋ ๊ฐ์ง ์ฃผ์ ๋๊ตฌ ์ฌ์ฉ
โข ๋ฌธ์๋ฅผ ์ฐพ๊ณ โ ๋ด์ฉ์ ์ฝ๊ณ โ ๊ด๋ จ ์ ๋ณด ์ถ์ถ
โข ์ฌ๋ฌ ๋ฌธ์๋ฅผ ๋๋๋ค๋ฉฐ ์ ๋ณด ์ข
ํฉ
์ฅ์ : ๋ณต์กํ ๋ฆฌ์์น ์์
์ ํจ๊ณผ์ ๐ฌ
๋จ์ : ๋ฌธ์ ๊ธฐ๋ฐ ์์
์๋ง ์ ํ์ ๐
์ถ์ฒ ์ํฉ: ์ฐ๊ตฌ ์ด์์คํดํธ, ์ง์ ๋ฒ ์ด์ค ๊ฒ์, FAQ ์์คํ
๐น Self-ask with Search Agent
ํน์ง: ๋ณต์กํ ์ง๋ฌธ์ ํ์ ์ง๋ฌธ์ผ๋ก ๋ถํดํ๋ ์ ๋ต์ ์ฌ์ฉํด. ์ค์ค๋ก์๊ฒ ์ง๋ฌธํ๋ฉด์ ๋ต์ ์ฐพ์๊ฐ๋ ๋ฐฉ์์ด์ง! ๐งฉ
์๋ ๋ฐฉ์:
โข ํฐ ์ง๋ฌธ์ ์์ ์ง๋ฌธ๋ค๋ก ์ชผ๊ฐฌ
โข ๊ฐ ํ์ ์ง๋ฌธ์ ๋ํด ๊ฒ์ ์ํ
โข ๋ต๋ณ๋ค์ ์กฐํฉํด์ ์ต์ข
๋ต ๋์ถ
์์:
์ง๋ฌธ: "ํ์ฌ ๋ฏธ๊ตญ ๋ํต๋ น์ ์ถ์์ง๋ ์ด๋์ธ๊ฐ?"
โ ํ์์ง๋ฌธ1: "ํ์ฌ ๋ฏธ๊ตญ ๋ํต๋ น์ ๋๊ตฌ์ธ๊ฐ?" (๊ฒ์)
โ ํ์์ง๋ฌธ2: "๊ทธ ์ฌ๋์ ์ถ์์ง๋?" (๊ฒ์)
โ ์ต์ข
๋ต๋ณ ์กฐํฉ
์ฅ์ : ๋ณต์กํ ์ถ๋ก ๋ฌธ์ ์ ๊ฐํจ ๐ง
๋จ์ : ์คํ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ โฑ๏ธ
์ถ์ฒ ์ํฉ: ๋ค๋จ๊ณ ์ถ๋ก , ๋ณต์กํ ์ง์์๋ต, ์ฌ์ค ํ์ธ
๐น Plan-and-Execute Agent
ํน์ง: ๋จผ์ ์ ์ฒด ๊ณํ์ ์ธ์ฐ๊ณ ๊ทธ ๋ค์์ ์คํํ๋ 2๋จ๊ณ ์ ๊ทผ๋ฒ์ด์ผ. ๋ง์น ํ๋ก์ ํธ ๋งค๋์ ์ฒ๋ผ! ๐
์๋ ๋ฐฉ์:
โข Phase 1: ์ ์ฒด ์์
์ ๋จ๊ณ๋ณ๋ก ๊ณํ ์๋ฆฝ
โข Phase 2: ๊ณํ๋ ๋จ๊ณ๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํ
โข ๊ฐ ๋จ๊ณ ์๋ฃ ํ ๋ค์ ๋จ๊ณ๋ก ์งํ
์ฅ์ : ์ฒด๊ณ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ์คํ ๐ฏ
๋จ์ : ์ ์ฐ์ฑ์ด ๋ค์ ๋จ์ด์ง, ๊ณํ ์์ ์ด ์ด๋ ค์ ๐
์ถ์ฒ ์ํฉ: ๋ณต์กํ ์ํฌํ๋ก์ฐ, ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ, ์๋ํ ์์
๐ก ์ ํ ํ:
โข ๊ฐ๋จํ ์์
โ Zero-shot ReAct
โข ๋ํํ ์๋น์ค โ Conversational ReAct
โข ๋ฌธ์ ๊ฒ์ โ ReAct Docstore
โข ๋ณต์กํ ์ถ๋ก โ Self-ask with Search
โข ์ฒด๊ณ์ ์์
โ Plan-and-Execute
โ๏ธ ์ค์ ๊ตฌํ: Agent ๋ง๋ค์ด๋ณด๊ธฐ
์ด๋ก ์ ์ถฉ๋ถํ ๋ดค์ผ๋ ์ด์ ์ง์ ์ฝ๋๋ก Agent๋ฅผ ๋ง๋ค์ด๋ณด์! ์ค์ ๋ก ์๋ํ๋ ์์ ๋ฅผ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณผ๊ฒ. ๐
๐ฆ Step 1: ํ๊ฒฝ ์ค์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
# ํ์ํ ํจํค์ง ์ค์น
pip install langchain openai langchain-openai langchain-community
# ์ถ๊ฐ ๋๊ตฌ๋ค
pip install google-search-results wikipedia
๐ง Step 2: ๊ธฐ๋ณธ Tool ์ ์ํ๊ธฐ
from langchain.agents import Tool
from langchain_community.utilities import GoogleSearchAPIWrapper
from langchain_community.utilities import WikipediaAPIWrapper
import math
# 1. ๊ฒ์ ๋๊ตฌ
search = GoogleSearchAPIWrapper()
search_tool = Tool(
name="Google Search",
func=search.run,
description="์ต์ ์ ๋ณด๋ ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ ์ฌ์ฉํ์ธ์. ์
๋ ฅ: ๊ฒ์ ์ฟผ๋ฆฌ"
)
# 2. Wikipedia ๋๊ตฌ
wikipedia = WikipediaAPIWrapper()
wiki_tool = Tool(
name="Wikipedia",
func=wikipedia.run,
description="์ญ์ฌ์ ์ฌ์ค, ์ธ๋ฌผ ์ ๋ณด, ๊ฐ๋
์ค๋ช
์ด ํ์ํ ๋ ์ฌ์ฉํ์ธ์. ์
๋ ฅ: ๊ฒ์์ด"
)
# 3. ๊ณ์ฐ๊ธฐ ๋๊ตฌ
def calculator(expression: str) -> str:
"""์์ ํ ์ํ ๊ณ์ฐ ์ํ"""
try:
# ์์ ํ ํ๊ฐ๋ฅผ ์ํด ํ์ฉ๋ ํจ์๋ง ์ฌ์ฉ
allowed_names = {
'abs': abs, 'round': round, 'min': min, 'max': max,
'sum': sum, 'pow': pow, 'sqrt': math.sqrt,
'sin': math.sin, 'cos': math.cos, 'tan': math.tan
}
result = eval(expression, {"__builtins__": {}}, allowed_names)
return f"๊ณ์ฐ ๊ฒฐ๊ณผ: {result}"
except Exception as e:
return f"๊ณ์ฐ ์ค๋ฅ: {str(e)}"
calc_tool = Tool(
name="Calculator",
func=calculator,
description="์ํ ๊ณ์ฐ์ด ํ์ํ ๋ ์ฌ์ฉํ์ธ์. ๋ณต์กํ ์์๋ ๊ฐ๋ฅํฉ๋๋ค. ์
๋ ฅ: ์์ ๋ฌธ์์ด"
)
# ๋๊ตฌ ๋ฆฌ์คํธ
tools = [search_tool, wiki_tool, calc_tool]
๐ง Step 3: Agent ์ด๊ธฐํ
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
# LLM ์ค์
llm = ChatOpenAI(
model="gpt-4",
temperature=0, # ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ํด 0์ผ๋ก ์ค์
openai_api_key="your-api-key-here"
)
# ๋ฉ๋ชจ๋ฆฌ ์ค์
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# Agent ์ด๊ธฐํ
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True, # ์คํ ๊ณผ์ ์ถ๋ ฅ
max_iterations=5, # ์ต๋ ๋ฐ๋ณต ํ์
early_stopping_method="generate" # ์กฐ๊ธฐ ์ข
๋ฃ ์ ๋ต
)
๐ฏ Step 4: Agent ์คํํ๊ธฐ
# ๊ฐ๋จํ ์ง๋ฌธ
response1 = agent.run("2024๋
๋
ธ๋ฒจ ๋ฌผ๋ฆฌํ์ ์์์๋ ๋๊ตฌ์ธ๊ฐ์?")
print(response1)
# ๊ณ์ฐ์ด ํ์ํ ์ง๋ฌธ
response2 = agent.run("์์ ๋์ด ๊ณต์์ ์ฌ์ฉํด์ ๋ฐ์ง๋ฆ 5์ธ ์์ ๋์ด๋ฅผ ๊ณ์ฐํด์ฃผ์ธ์.")
print(response2)
# ๋ณตํฉ์ ์ธ ์ง๋ฌธ (๊ฒ์ + ๊ณ์ฐ)
response3 = agent.run("""
ํ์ฌ ๋นํธ์ฝ์ธ ๊ฐ๊ฒฉ์ ๊ฒ์ํ๊ณ ,
๋ง์ฝ 100๋ง์์ ํฌ์ํ๋ค๋ฉด ๋ช ๊ฐ์ ๋นํธ์ฝ์ธ์ ์ด ์ ์๋์ง ๊ณ์ฐํด์ฃผ์ธ์.
""")
print(response3)
# ๋ํ ๋งฅ๋ฝ์ ํ์ฉํ ์ง๋ฌธ
response4 = agent.run("๊ทธ๋ผ 200๋ง์์ด๋ฉด์?") # ์ด์ ๋ํ ์ฐธ์กฐ
print(response4)
๐ ์คํ ๊ณผ์ ๋ค์ฌ๋ค๋ณด๊ธฐ (verbose=True ์ถ๋ ฅ)
Agent๊ฐ verbose=True๋ก ์ค์ ๋๋ฉด ๋ด๋ถ ์ฌ๊ณ ๊ณผ์ ์ ๋ณผ ์ ์์ด:
์์ ์ถ๋ ฅ:
Thought: ์ฌ์ฉ์๊ฐ 2024๋
๋
ธ๋ฒจ ๋ฌผ๋ฆฌํ์ ์์์๋ฅผ ๋ฌป๊ณ ์์ต๋๋ค. ์ด๋ ์ต์ ์ ๋ณด์ด๋ฏ๋ก ๊ฒ์์ด ํ์ํฉ๋๋ค.
Action: Google Search
Action Input: "2024 ๋
ธ๋ฒจ ๋ฌผ๋ฆฌํ์ ์์์"
Observation: 2024๋
๋
ธ๋ฒจ ๋ฌผ๋ฆฌํ์์ ์กด ํํ๋์ ์ ํ๋ฆฌ ํํผ์๊ฒ ์์ฌ๋์์ต๋๋ค...
Thought: ์ด์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์์ผ๋ฏ๋ก ์ต์ข
๋ต๋ณ์ ์์ฑํ ์ ์์ต๋๋ค.
Final Answer: 2024๋
๋
ธ๋ฒจ ๋ฌผ๋ฆฌํ์์ ์ธ๊ณต์ ๊ฒฝ๋ง ์ฐ๊ตฌ์ ์ ๊ตฌ์์ธ ์กด ํํ๋์ ์ ํ๋ฆฌ ํํผ์๊ฒ ์์ฌ๋์์ต๋๋ค. ๐
๐จ ์ปค์คํ Tool ๋ง๋ค๊ธฐ: ์ค์ ์์
๊ธฐ๋ณธ ๋๊ตฌ๋ ์ข์ง๋ง, ์ง์ง ํ์๋ ๋๋ง์ ์ปค์คํ Tool์ ๋ง๋ค ๋ ๋์! ์ค๋ฌด์์ ์์ฃผ ์ฐ์ด๋ ํจํด๋ค์ ์ดํด๋ณด์. ๐ช
๐ ์์ 1: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ Tool
from langchain.tools import Tool
import sqlite3
class DatabaseTool:
def __init__(self, db_path: str):
self.db_path = db_path
def query(self, sql: str) -> str:
"""SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ"""
try:
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
cursor.execute(sql)
results = cursor.fetchall()
conn.close()
if not results:
return "๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค."
# ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ธฐ ์ฌ์ด ํํ๋ก ํฌ๋งทํ
formatted = "\n".join([str(row) for row in results[:10]])
if len(results) > 10:
formatted += f"\n... (์ด {len(results)}๊ฐ ๊ฒฐ๊ณผ ์ค 10๊ฐ๋ง ํ์)"
return formatted
except Exception as e:
return f"๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฅ: {str(e)}"
# Tool๋ก ๋ฑ๋ก
db_tool_instance = DatabaseTool("./my_database.db")
db_tool = Tool(
name="Database Query",
func=db_tool_instance.query,
description="""
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํ์ธ์.
์
๋ ฅ: SQL SELECT ์ฟผ๋ฆฌ (์์ ํ ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ๋ง ํ์ฉ)
์์: "SELECT * FROM users WHERE age > 25"
"""
)
๐ ์์ 2: REST API ํธ์ถ Tool
import requests
from typing import Dict, Any
class APITool:
def __init__(self, base_url: str, api_key: str = None):
self.base_url = base_url
self.headers = {"Authorization": f"Bearer {api_key}"} if api_key else {}
def call_api(self, endpoint: str, method: str = "GET", params: Dict = None) -> str:
"""API ์๋ํฌ์ธํธ ํธ์ถ"""
try:
url = f"{self.base_url}/{endpoint}"
if method.upper() == "GET":
response = requests.get(url, headers=self.headers, params=params)
elif method.upper() == "POST":
response = requests.post(url, headers=self.headers, json=params)
else:
return f"์ง์ํ์ง ์๋ ๋ฉ์๋: {method}"
response.raise_for_status()
data = response.json()
# ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฝ
return self._format_response(data)
except requests.exceptions.RequestException as e:
return f"API ํธ์ถ ์คํจ: {str(e)}"
def _format_response(self, data: Any) -> str:
"""์๋ต ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ํฌ๋งทํ
"""
if isinstance(data, dict):
return "\n".join([f"{k}: {v}" for k, v in list(data.items())[:5]])
elif isinstance(data, list):
return f"์ด {len(data)}๊ฐ ํญ๋ชฉ (์ฒ์ 3๊ฐ: {data[:3]})"
else:
return str(data)
# ๋ ์จ API Tool ์์
weather_api = APITool("https://api.openweathermap.org/data/2.5", "your-api-key")
def get_weather(city: str) -> str:
"""๋์ ์ด๋ฆ์ผ๋ก ๋ ์จ ์ ๋ณด ์กฐํ"""
return weather_api.call_api("weather", params={"q": city, "units": "metric"})
weather_tool = Tool(
name="Weather Info",
func=get_weather,
description="ํน์ ๋์์ ํ์ฌ ๋ ์จ ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค. ์
๋ ฅ: ๋์ ์ด๋ฆ (์๋ฌธ)"
)
๐ง ์์ 3: ์ด๋ฉ์ผ ๋ฐ์ก Tool
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class EmailTool:
def __init__(self, smtp_server: str, smtp_port: int, username: str, password: str):
self.smtp_server = smtp_server
self.smtp_port = smtp_port
self.username = username
self.password = password
def send_email(self, input_str: str) -> str:
"""์ด๋ฉ์ผ ๋ฐ์ก (ํ์: 'to@email.com|์ ๋ชฉ|๋ณธ๋ฌธ')"""
try:
parts = input_str.split('|')
if len(parts) != 3:
return "์
๋ ฅ ํ์ ์ค๋ฅ. ํ์: 'to@email.com|์ ๋ชฉ|๋ณธ๋ฌธ'"
to_email, subject, body = parts
msg = MIMEMultipart()
msg['From'] = self.username
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
server.starttls()
server.login(self.username, self.password)
server.send_message(msg)
return f"์ด๋ฉ์ผ์ด {to_email}๋ก ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ก๋์์ต๋๋ค. โ๏ธ"
except Exception as e:
return f"์ด๋ฉ์ผ ๋ฐ์ก ์คํจ: {str(e)}"
# Tool ๋ฑ๋ก
email_sender = EmailTool("smtp.gmail.com", 587, "your@email.com", "your-password")
email_tool = Tool(
name="Send Email",
func=email_sender.send_email,
description="""
์ด๋ฉ์ผ์ ๋ฐ์กํฉ๋๋ค.
์
๋ ฅ ํ์: '๋ฐ๋์ฌ๋@email.com|์ ๋ชฉ|๋ณธ๋ฌธ ๋ด์ฉ'
์์: 'user@example.com|ํ์ ์๋ด|๋ด์ผ ์คํ 2์ ํ์์
๋๋ค.'
"""
)
๐ฏ ์ปค์คํ
Tool ์์ฑ ํ:
1. ๋ช
ํํ ์ค๋ช
: description์ ์์ธํ ์์ฑํด์ผ Agent๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํด ๐
2. ์๋ฌ ํธ๋ค๋ง: ๋ชจ๋ ์์ธ ์ํฉ์ ์ฒ๋ฆฌํ๊ณ ๋ช
ํํ ์๋ฌ ๋ฉ์์ง ๋ฐํ ๐ก๏ธ
3. ์
๋ ฅ ํ์: ์
๋ ฅ ํ๋ผ๋ฏธํฐ ํ์์ description์ ๋ช
์ ๐
4. ๊ฒฐ๊ณผ ํฌ๋งทํ
: ๋ฐํ๊ฐ์ Agent๊ฐ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌ โจ
5. ๋ณด์: ๋ฏผ๊ฐํ ์ ๋ณด(API ํค, ๋น๋ฐ๋ฒํธ)๋ ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌ ๐
๐ ๊ณ ๊ธ ํ ํฌ๋: Agent ์ฑ๋ฅ ์ต์ ํ
Agent๋ฅผ ๋ง๋ค์๋ค๋ฉด ์ด์ ๋ ๋๋ํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ฐจ๋ก์ผ! ์ค์ ์์ ๋ฐ๋ก ์จ๋จน์ ์ ์๋ ์ต์ ํ ๊ธฐ๋ฒ๋ค์ ์๋ ค์ค๊ฒ. ๐ฏ
โก 1. Prompt Engineering์ผ๋ก ์ ํ๋ ๋์ด๊ธฐ
Agent์ ์์คํ ํ๋กฌํํธ๋ฅผ ์ปค์คํฐ๋ง์ด์งํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ผ! ๐จ
from langchain.agents import initialize_agent
# ์ปค์คํ
ํ๋กฌํํธ ์ ์
custom_prefix = """
๋น์ ์ ์ ๋ฌธ์ ์ธ AI ์ด์์คํดํธ์
๋๋ค. ๋ค์ ์์น์ ๋ฐ๋ฅด์ธ์:
1. ํญ์ ์ ํํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ธ์. ํ์คํ์ง ์์ผ๋ฉด ๊ฒ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
2. ๊ณ์ฐ์ด ํ์ํ๋ฉด ๋ฐ๋์ Calculator ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ์ง์ ๊ณ์ฐํ์ง ๋ง์ธ์.
3. ๋จ๊ณ๋ณ๋ก ๋
ผ๋ฆฌ์ ์ผ๋ก ์ฌ๊ณ ํ์ธ์.
4. ์ต์ข
๋ต๋ณ์ ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ์ธ์.
5. ์ถ์ฒ๊ฐ ์๋ ์ ๋ณด๋ ์ถ์ฒ๋ฅผ ๋ช
์ํ์ธ์.
์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ:
"""
custom_suffix = """
์์ํ์ธ์! ์ฌ์ฉ์์ ์ง๋ฌธ์ ์ต์ ์ ๋คํด ๋ต๋ณํ์ธ์.
์ง๋ฌธ: {input}
{agent_scratchpad}
"""
# Agent ์ด๊ธฐํ ์ ์ปค์คํ
ํ๋กฌํํธ ์ ์ฉ
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
agent_kwargs={
'prefix': custom_prefix,
'suffix': custom_suffix
},
verbose=True
)
๐ฏ 2. Tool ์ ํ ์ ํ๋ ๊ฐ์
Tool์ description์ ๊ตฌ์ฒด์ ์ด๊ณ ๋ช ํํ๊ฒ ์์ฑํ๋ฉด Agent๊ฐ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ ํํ ํ๋ฅ ์ด ๋์์ ธ! ๐
# โ ๋์ ์์
bad_tool = Tool(
name="Search",
func=search_function,
description="๊ฒ์ํฉ๋๋ค." # ๋๋ฌด ๋ชจํธํจ!
)
# โ
์ข์ ์์
good_tool = Tool(
name="Web Search",
func=search_function,
description="""
์ธํฐ๋ท์์ ์ต์ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ์ค์๊ฐ ์ ๋ณด๊ฐ ํ์ํ ๋ (๋ด์ค, ์ฃผ๊ฐ, ๋ ์จ ๋ฑ)
- ์ต๊ทผ ์ด๋ฒคํธ๋ ์ฌ๊ฑด์ ๋ํ ์ ๋ณด
- ํน์ ์น์ฌ์ดํธ์ ๋ด์ฉ ํ์ธ
์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋:
- ์ผ๋ฐ์ ์ธ ์ง์์ด๋ ๊ฐ๋
์ค๋ช
(Wikipedia ์ฌ์ฉ)
- ์ํ ๊ณ์ฐ (Calculator ์ฌ์ฉ)
- ๊ณผ๊ฑฐ์ ํ์ ๋ ์ญ์ฌ์ ์ฌ์ค
์
๋ ฅ ํ์: ๊ฒ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด
์์: "2024๋
์ฌ๋ฆผํฝ ๊ธ๋ฉ๋ฌ ์์"
"""
)
๐พ 3. ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์ ๋ต
๋ํ๊ฐ ๊ธธ์ด์ง๋ฉด ํ ํฐ ๋น์ฉ์ด ๊ธ์ฆํด! ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ค์ํ์ง. ๐ฐ
from langchain.memory import ConversationSummaryBufferMemory
# ์์ฝ + ๋ฒํผ ํ์ด๋ธ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ
memory = ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=2000, # ์ต๋ ํ ํฐ ์
memory_key="chat_history",
return_messages=True
)
# ์๋ ๋ฐฉ์:
# - ์ต๊ทผ ๋ํ๋ ๊ทธ๋๋ก ์ ์ง (๋ฒํผ)
# - ์ค๋๋ ๋ํ๋ ์์ฝํด์ ์ ์ฅ (์์ฝ)
# - ํ ํฐ ํ๋๋ฅผ ์ด๊ณผํ๋ฉด ์๋์ผ๋ก ์์ฝ ์์
# ๋๋ ์๊ฐ ๊ธฐ๋ฐ ๋ฉ๋ชจ๋ฆฌ
from langchain.memory import ConversationBufferWindowMemory
window_memory = ConversationBufferWindowMemory(
k=5, # ์ต๊ทผ 5๊ฐ ๋ํ๋ง ๊ธฐ์ต
memory_key="chat_history",
return_messages=True
)
๐ 4. ์๋ฌ ํธ๋ค๋ง๊ณผ ์ฌ์๋ ๋ก์ง
from langchain.callbacks import StdOutCallbackHandler
from langchain.schema import AgentAction, AgentFinish
class CustomCallbackHandler(StdOutCallbackHandler):
"""์ปค์คํ
์ฝ๋ฐฑ์ผ๋ก ์๋ฌ ์ฒ๋ฆฌ ๊ฐํ"""
def on_agent_action(self, action: AgentAction, **kwargs):
"""๋๊ตฌ ์คํ ์ ๊ฒ์ฆ"""
print(f"๐ง ๋๊ตฌ ์ฌ์ฉ: {action.tool}")
print(f"๐ ์
๋ ฅ: {action.tool_input}")
def on_tool_error(self, error: Exception, **kwargs):
"""๋๊ตฌ ์คํ ์ค๋ฅ ์ฒ๋ฆฌ"""
print(f"โ ์ค๋ฅ ๋ฐ์: {str(error)}")
# ์ฌ๊ธฐ์ ๋ก๊น
, ์๋ฆผ ๋ฑ ์ถ๊ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
def on_agent_finish(self, finish: AgentFinish, **kwargs):
"""์ต์ข
๋ต๋ณ ์์ฑ ์"""
print(f"โ
์ต์ข
๋ต๋ณ ์์ฑ ์๋ฃ")
# Agent์ ์ฝ๋ฐฑ ์ ์ฉ
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
callbacks=[CustomCallbackHandler()],
handle_parsing_errors=True, # ํ์ฑ ์๋ฌ ์๋ ์ฒ๋ฆฌ
max_iterations=3, # ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง
early_stopping_method="generate"
)
โ๏ธ 5. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ์๋ ํฅ์
from langchain.agents import AgentExecutor
from concurrent.futures import ThreadPoolExecutor
class ParallelToolExecutor:
"""์ฌ๋ฌ ๋๊ตฌ๋ฅผ ๋์์ ์คํ"""
def __init__(self, tools, max_workers=3):
self.tools = {tool.name: tool for tool in tools}
self.executor = ThreadPoolExecutor(max_workers=max_workers)
def execute_parallel(self, tool_calls):
"""์ฌ๋ฌ ๋๊ตฌ ํธ์ถ์ ๋ณ๋ ฌ๋ก ์คํ"""
futures = []
for tool_name, tool_input in tool_calls:
if tool_name in self.tools:
future = self.executor.submit(
self.tools[tool_name].func,
tool_input
)
futures.append((tool_name, future))
results = {}
for tool_name, future in futures:
try:
results[tool_name] = future.result(timeout=30)
except Exception as e:
results[tool_name] = f"์ค๋ฅ: {str(e)}"
return results
# ์ฌ์ฉ ์์: ์ฌ๋ฌ ๊ฒ์์ ๋์์ ์ํ
parallel_executor = ParallelToolExecutor(tools)
results = parallel_executor.execute_parallel([
("Google Search", "Python ์ต์ ๋ฒ์ "),
("Wikipedia", "Python programming language"),
("Calculator", "2024 - 1991") # Python ๋์ด ๊ณ์ฐ
])
โ ๏ธ ์ฃผ์์ฌํญ:
โข ๋น์ฉ ๊ด๋ฆฌ: Agent๋ ์ฌ๋ฌ ๋ฒ LLM์ ํธ์ถํ๋ฏ๋ก ํ ํฐ ๋น์ฉ์ด ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ ์ ์์ด. ํญ์ max_iterations๋ฅผ ์ค์ ํ์! ๐ธ
โข ๋ฌดํ ๋ฃจํ: ์๋ชป๋ Tool ์ค๋ช
์ด๋ ํ๋กฌํํธ๋ก ์ธํด Agent๊ฐ ๊ฐ์ ํ๋์ ๋ฐ๋ณตํ ์ ์์ด. verbose=True๋ก ๋ชจ๋ํฐ๋ง ํ์! ๐
โข ๋ณด์: ์ฌ์ฉ์ ์
๋ ฅ์ ์ง์ Tool์ ์ ๋ฌํ๋ฉด ์ํํด. ์
๋ ฅ ๊ฒ์ฆ๊ณผ ์๋๋ฐ์ฑ์ ๊ณ ๋ คํ์! ๐
๐ ์ค์ ํ์ฉ ์ฌ๋ก: ์ฐ์ ๋ณ Agent ์์ฉ
์ด๋ก ๊ณผ ์ฝ๋๋ฅผ ๋ดค์ผ๋ ์ด์ ์ค์ ๋น์ฆ๋์ค์์ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง ์ดํด๋ณด์! ๋ค์ํ ์ฐ์ ๋ถ์ผ์ ์ค์ ์ฌ๋ก๋ค์ด์ผ. ๐ข
๐ 1. E-์ปค๋จธ์ค: ์ค๋งํธ ์ผํ ์ด์์คํดํธ
์๋๋ฆฌ์ค: ๊ณ ๊ฐ์ด "์ฌ๋ฆ ํด๊ฐ์ฉ ์ํผ์ค ์ถ์ฒํด์ค"๋ผ๊ณ ์์ฒญ
Agent ์๋ ํ๋ฆ:
1๏ธโฃ ์ํ ๊ฒ์ Tool: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํผ์ค ์นดํ
๊ณ ๋ฆฌ ์กฐํ
2๏ธโฃ ๋ ์จ API Tool: ๊ณ ๊ฐ ์ง์ญ์ ์ฌ๋ฆ ํ๊ท ๊ธฐ์จ ํ์ธ
3๏ธโฃ ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ Tool: ๊ณ ๊ฐ ๊ตฌ๋งค ์ด๋ ฅ ๊ธฐ๋ฐ ์ ํธ๋ ๋ถ์
4๏ธโฃ ์ฌ๊ณ ํ์ธ Tool: ์ค์๊ฐ ์ฌ๊ณ ์ํ ์ฒดํฌ
5๏ธโฃ ์ต์ข
์ถ์ฒ ๋ฆฌ์คํธ ์์ฑ ๋ฐ ์ค๋ช
์ ๊ณต
ํจ๊ณผ:
โข ๊ฐ์ธํ๋ ์ถ์ฒ์ผ๋ก ์ ํ์จ 35% ์ฆ๊ฐ ๐
โข ๊ณ ๊ฐ ๋ฌธ์ ์๋ต ์๊ฐ 80% ๋จ์ถ โก
โข 24/7 ๋ฌด์ธ ๊ณ ๊ฐ ์ง์ ๊ฐ๋ฅ ๐
๐ผ 2. ๊ธ์ต: ํฌ์ ๋ถ์ ์ด์์คํดํธ
์๋๋ฆฌ์ค: "ํ
์ฌ๋ผ ์ฃผ์ ์ง๊ธ ์ฌ๋ ๋ ๊น?"
Agent ์๋ ํ๋ฆ:
1๏ธโฃ ์ฃผ๊ฐ API Tool: ์ค์๊ฐ ํ
์ฌ๋ผ ์ฃผ๊ฐ ๋ฐ ์ฐจํธ ๋ฐ์ดํฐ ์์ง
2๏ธโฃ ๋ด์ค ๊ฒ์ Tool: ์ต๊ทผ ํ
์ฌ๋ผ ๊ด๋ จ ๋ด์ค ํฌ๋กค๋ง
3๏ธโฃ ์ฌ๋ฌด์ ํ Tool: ์ต์ ๋ถ๊ธฐ ์ค์ ๋ฐ์ดํฐ ์กฐํ
4๏ธโฃ ๊ธฐ์ ์ ๋ถ์ Tool: RSI, MACD ๋ฑ ์งํ ๊ณ์ฐ
5๏ธโฃ ๋ฆฌ์คํฌ ํ๊ฐ Tool: ํฌํธํด๋ฆฌ์ค ๋ด ๋น์ค ๋ถ์
6๏ธโฃ ์ข
ํฉ ๋ถ์ ๋ฆฌํฌํธ ์์ฑ
์ฃผ์: ํฌ์ ์กฐ์ธ์ด ์๋ ์ ๋ณด ์ ๊ณต ๋ชฉ์ ์์ ๋ช
์! โ ๏ธ
๐ฅ 3. ํฌ์ค์ผ์ด: ์๋ฃ ์ ๋ณด ์ด์์คํดํธ
์๋๋ฆฌ์ค: "๋ํต๊ณผ ๋ฏธ์ด์ด ์๋๋ฐ ์ด๋ค ๊ฒ์ฌ๋ฅผ ๋ฐ์์ผ ํ ๊น์?"
Agent ์๋ ํ๋ฆ:
1๏ธโฃ ์ฆ์ ๋ถ์ Tool: ์
๋ ฅ๋ ์ฆ์ ํจํด ๋ถ์
2๏ธโฃ ์ํ DB Tool: ๊ด๋ จ ์ง๋ณ ์ ๋ณด ๊ฒ์
3๏ธโฃ ๋ณ์ ๊ฒ์ Tool: ๊ทผ์ฒ ์ ํฉํ ์ง๋ฃ๊ณผ ๋ณ์ ์ฐพ๊ธฐ
4๏ธโฃ ์์ฝ ์์คํ
Tool: ๊ฐ๋ฅํ ์์ฝ ์๊ฐ ์กฐํ
5๏ธโฃ ์ฃผ์์ฌํญ ๋ฐ ์๊ธ ์ํฉ ํ๋จ
์ค์: ์๋ฃ ์ง๋จ์ด ์๋ ์ ๋ณด ์ ๊ณต๋ง! ์ ๋ฌธ์ ์๋ด ๊ถ์ฅ ํ์ ๐ฉบ
๐ 4. ๊ต์ก: ๊ฐ์ธํ ํ์ต ํํฐ
์๋๋ฆฌ์ค: "๋ฏธ์ ๋ถ ๊ฐ๋
์ด ์ดํด๊ฐ ์ ๋ผ์"
Agent ์๋ ํ๋ฆ:
1๏ธโฃ ํ์ต ์ด๋ ฅ Tool: ํ์์ ์ด์ ํ์ต ๋ฐ์ดํฐ ๋ถ์
2๏ธโฃ ๊ฐ๋
๊ฒ์ Tool: ๋ฏธ์ ๋ถ ๊ด๋ จ ๊ต์ก ์๋ฃ ์์ง
3๏ธโฃ ๋์ด๋ ํ๊ฐ Tool: ํ์ ์์ค์ ๋ง๋ ์ค๋ช
์ ํ
4๏ธโฃ ์๊ฐํ Tool: ๊ทธ๋ํ์ ์ ๋๋ฉ์ด์
์์ฑ
5๏ธโฃ ์ฐ์ต๋ฌธ์ Tool: ๋ง์ถคํ ๋ฌธ์ ์ถ์
6๏ธโฃ ๋จ๊ณ๋ณ ์ค๋ช
๋ฐ ํผ๋๋ฐฑ ์ ๊ณต
ํจ๊ณผ: ํ์ต ์ดํด๋ 50% ํฅ์, ํ์ต ์๊ฐ 30% ๋จ์ถ ๐
๐ข 5. ๊ธฐ์ : ์ ๋ฌด ์๋ํ ์ด์์คํดํธ
์๋๋ฆฌ์ค: "๋ค์ ์ฃผ ์์์ผ ์ค์ 10์์ ๋ง์ผํ
ํ ํ์ ์ก์์ค"
Agent ์๋ ํ๋ฆ:
1๏ธโฃ ์บ๋ฆฐ๋ Tool: ์ฐธ์์๋ค์ ์ผ์ ํ์ธ
2๏ธโฃ ํ์์ค ์์ฝ Tool: ๊ฐ๋ฅํ ํ์์ค ๊ฒ์ ๋ฐ ์์ฝ
3๏ธโฃ ์ด๋ฉ์ผ Tool: ํ์ ์ด๋์ฅ ๋ฐ์ก
4๏ธโฃ ๋ฌธ์ ์์ฑ Tool: ํ์ ์๊ฑด ํ
ํ๋ฆฟ ์์ฑ
5๏ธโฃ ์๋ฆผ ์ค์ Tool: ์ฐธ์์๋ค์๊ฒ ๋ฆฌ๋ง์ธ๋ ์ค์
์ถ๊ฐ ๊ธฐ๋ฅ:
โข ํ์๋ก ์๋ ์์ฑ ๐
โข ์ก์
์์ดํ
์ถ์ โ
โข ํ์ ์กฐ์น ์๋ ์ค์ผ์ค๋ง ๐
๐ก ์ฌ๋ฅ๋ท ํ์ฉ ํ: ์ด๋ฐ ์ค์ Agent ์์คํ ๊ตฌ์ถ ๋ฅ๋ ฅ์ ์ฌ๋ฅ๋ท์์ ์ ๋ง ์ธ๊ธฐ ์๋ ์ฌ๋ฅ์ด์ผ! AI/๋จธ์ ๋ฌ๋ ๊ฐ๋ฐ ์นดํ ๊ณ ๋ฆฌ์์ ํ๋ก์ ํธ๋ฅผ ์์ฃผํ๊ฑฐ๋, ๋ฐ๋๋ก ์ ๋ฌธ๊ฐ๋ฅผ ์ฐพ์ ์๋ ์์ด. ํนํ ์ฐ์ ๋ณ ๋ง์ถคํ Agent ๊ฐ๋ฐ์ ๊ณ ๋ถ๊ฐ๊ฐ์น ์๋น์ค๋ก ์ฃผ๋ชฉ๋ฐ๊ณ ์์ง! ๐
๐ ํธ๋ฌ๋ธ์ํ : ์์ฃผ ๋ง๋๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฒ
Agent ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๋๊ตฌ๋ ๊ฒช๋ ๋ฌธ์ ๋ค์ด ์์ด. ๋ฏธ๋ฆฌ ์๊ณ ๋๋นํ๋ฉด ์๊ฐ์ ์์ฒญ ์๋ ์ ์์ง! ๐
โ ๋ฌธ์ 1: Agent๊ฐ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ฐ๋ณต ํธ์ถ
์ฆ์: Agent๊ฐ ๋์ผํ Tool์ ๊ณ์ ์คํํ๋ฉฐ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ๐
์์ธ:
โข Tool์ ์ถ๋ ฅ ํ์์ด Agent๊ฐ ์ดํดํ๊ธฐ ์ด๋ ค์
โข Tool description์ด ๋ชจํธํจ
โข ํ๋กฌํํธ์ ์ข
๋ฃ ์กฐ๊ฑด์ด ๋ช
ํํ์ง ์์
ํด๊ฒฐ๋ฒ:
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 1: Tool ์ถ๋ ฅ ํ์ ๊ฐ์
def improved_search(query: str) -> str:
results = search_api(query)
# ๋ช
ํํ ๊ตฌ์กฐ๋ก ๋ฐํ
if not results:
return "๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ํค์๋๋ฅผ ์๋ํ์ธ์."
formatted = f"๊ฒ์ ์๋ฃ! {len(results)}๊ฐ ๊ฒฐ๊ณผ ๋ฐ๊ฒฌ:\n"
for i, result in enumerate(results[:3], 1):
formatted += f"{i}. {result['title']}: {result['snippet']}\n"
return formatted
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 2: max_iterations ์ค์
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
max_iterations=5, # ์ต๋ 5๋ฒ๋ง ๋ฐ๋ณต
early_stopping_method="generate" # ์กฐ๊ธฐ ์ข
๋ฃ ํ์ฑํ
)
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 3: ํ๋กฌํํธ์ ๋ช
ํํ ์ง์ ์ถ๊ฐ
custom_suffix = """
์ค์: ๊ฐ์ ๋๊ตฌ๋ฅผ ๋ ๋ฒ ์ด์ ์ฌ์ฉํ์ง ๋ง์ธ์.
์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์๋ค๋ฉด ์ฆ์ Final Answer๋ฅผ ์ ๊ณตํ์ธ์.
์ง๋ฌธ: {input}
{agent_scratchpad}
"""
โ ๋ฌธ์ 2: Tool ์ ํ ์ค๋ฅ
์ฆ์: Agent๊ฐ ์๋ฑํ ๋๊ตฌ๋ฅผ ์ ํํ๊ฑฐ๋ ์ ์ ํ ๋๊ตฌ๋ฅผ ๋ชป ์ฐพ์ ๐ค
์์ธ:
โข Tool ์ด๋ฆ์ด ๊ธฐ๋ฅ์ ๋ช
ํํ ํํํ์ง ๋ชปํจ
โข Description์ด ๋๋ฌด ์งง๊ฑฐ๋ ๋ชจํธํจ
โข ์ฌ๋ฌ Tool์ ๊ธฐ๋ฅ์ด ๊ฒน์นจ
ํด๊ฒฐ๋ฒ:
# โ ๋์ ์์
Tool(
name="Search", # ๋๋ฌด ์ผ๋ฐ์
func=google_search,
description="๊ฒ์" # ๋๋ฌด ์งง์
)
# โ
์ข์ ์์
Tool(
name="Google_Web_Search", # ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ
func=google_search,
description="""
๊ตฌ๊ธ์์ ์น ํ์ด์ง๋ฅผ ๊ฒ์ํฉ๋๋ค.
**์ฌ์ฉํด์ผ ํ ๋:**
- ์ต์ ๋ด์ค๋ ์ด๋ฒคํธ ์ ๋ณด
- ์ค์๊ฐ ๋ฐ์ดํฐ (์ฃผ๊ฐ, ๋ ์จ ๋ฑ)
- ํน์ ์น์ฌ์ดํธ ๋ด์ฉ ํ์ธ
**์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋:**
- ์ผ๋ฐ์ ์ธ ์ง์ (Wikipedia_Search ์ฌ์ฉ)
- ์ํ ๊ณ์ฐ (Calculator ์ฌ์ฉ)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ (Database_Query ์ฌ์ฉ)
์
๋ ฅ: ๊ฒ์ ํค์๋ (ํ๊ธ ๋๋ ์๋ฌธ)
์ถ๋ ฅ: ์์ 3๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ ๋ชฉ๊ณผ ์์ฝ
"""
)
# โ
Tool ๊ฐ ๋ช
ํํ ์ญํ ๋ถ๋ด
tools = [
Tool(name="Current_Events_Search", ...), # ์ต์ ์ ๋ณด
Tool(name="Historical_Facts_Search", ...), # ๊ณผ๊ฑฐ ์ ๋ณด
Tool(name="Mathematical_Calculator", ...), # ๊ณ์ฐ
Tool(name="Database_Query_Tool", ...) # DB ์กฐํ
]
โ ๋ฌธ์ 3: ์๋ต ์๋๊ฐ ๋๋ฌด ๋๋ฆผ
์ฆ์: Agent ์๋ต์ 10์ด ์ด์ ์์ โฑ๏ธ
์์ธ:
โข ๋๋ฌด ๋ง์ Tool ํธ์ถ
โข ๋นํจ์จ์ ์ธ Tool ๊ตฌํ
โข ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
ํด๊ฒฐ๋ฒ:
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 1: Tool ์คํ ํ์์์ ์ค์
import signal
from contextlib import contextmanager
@contextmanager
def timeout(seconds):
def timeout_handler(signum, frame):
raise TimeoutError(f"Tool execution exceeded {seconds} seconds")
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(seconds)
try:
yield
finally:
signal.alarm(0)
def safe_tool_execution(func, input_str, timeout_seconds=10):
try:
with timeout(timeout_seconds):
return func(input_str)
except TimeoutError:
return f"๋๊ตฌ ์คํ ์๊ฐ ์ด๊ณผ ({timeout_seconds}์ด)"
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 2: ์บ์ฑ ํ์ฉ
from functools import lru_cache
import hashlib
class CachedTool:
def __init__(self, func, cache_size=100):
self.func = func
self.cache = {}
self.max_cache_size = cache_size
def __call__(self, input_str: str) -> str:
# ์
๋ ฅ์ ํด์ํํ์ฌ ์บ์ ํค๋ก ์ฌ์ฉ
cache_key = hashlib.md5(input_str.encode()).hexdigest()
if cache_key in self.cache:
print(f"๐พ ์บ์์์ ๊ฒฐ๊ณผ ๋ฐํ: {input_str[:30]}...")
return self.cache[cache_key]
result = self.func(input_str)
# ์บ์ ํฌ๊ธฐ ๊ด๋ฆฌ
if len(self.cache) >= self.max_cache_size:
self.cache.pop(next(iter(self.cache)))
self.cache[cache_key] = result
return result
# ์ฌ์ฉ ์์
cached_search = CachedTool(google_search, cache_size=50)
search_tool = Tool(
name="Google Search",
func=cached_search,
description="..."
)
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 3: ๊ฒฝ๋ ๋ชจ๋ธ ์ฌ์ฉ
from langchain_openai import ChatOpenAI
# ๋น ๋ฅธ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ
fast_llm = ChatOpenAI(
model="gpt-3.5-turbo", # gpt-4๋ณด๋ค ๋น ๋ฆ
temperature=0,
max_tokens=500 # ํ ํฐ ์ ์ ํ
)
agent = initialize_agent(
tools=tools,
llm=fast_llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
โ ๋ฌธ์ 4: ๋น์ฉ์ด ๋๋ฌด ๋ง์ด ๋์ด
์ฆ์: API ๋น์ฉ์ด ์์๋ณด๋ค 10๋ฐฐ ์ด์ ๐ธ
์์ธ:
โข ๋ถํ์ํ LLM ํธ์ถ
โข ๊ธด ๋ํ ํ์คํ ๋ฆฌ
โข ๋นํจ์จ์ ์ธ ํ๋กฌํํธ
ํด๊ฒฐ๋ฒ:
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 1: ํ ํฐ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
response = agent.run("์ง๋ฌธ")
print(f"์ด ํ ํฐ: {cb.total_tokens}")
print(f"ํ๋กฌํํธ ํ ํฐ: {cb.prompt_tokens}")
print(f"์์ฑ ํ ํฐ: {cb.completion_tokens}")
print(f"์ด ๋น์ฉ: ${cb.total_cost:.4f}")
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 2: ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
from langchain.memory import ConversationSummaryBufferMemory
memory = ConversationSummaryBufferMemory(
llm=ChatOpenAI(model="gpt-3.5-turbo"), # ์์ฝ์๋ ์ ๋ ดํ ๋ชจ๋ธ
max_token_limit=1000, # ํ ํฐ ํ๋ ์ค์
memory_key="chat_history"
)
# โ
ํด๊ฒฐ ๋ฐฉ๋ฒ 3: ์กฐ๊ฑด๋ถ LLM ํธ์ถ
class SmartAgent:
def __init__(self, agent, simple_patterns):
self.agent = agent
self.simple_patterns = simple_patterns # ๊ฐ๋จํ ํจํด ์ฌ์
def run(self, query: str) -> str:
# ๊ฐ๋จํ ์ง๋ฌธ์ LLM ์์ด ์ฒ๋ฆฌ
for pattern, response in self.simple_patterns.items():
if pattern.lower() in query.lower():
return response
# ๋ณต์กํ ์ง๋ฌธ๋ง Agent์๊ฒ ์ ๋ฌ
return self.agent.run(query)
simple_patterns = {
"์๋
": "์๋
ํ์ธ์! ๋ฌด์์ ๋์๋๋ฆด๊น์?",
"๊ณ ๋ง์": "์ฒ๋ง์์! ๋ ๊ถ๊ธํ ๊ฒ ์์ผ๋ฉด ์ธ์ ๋ ๋ฌผ์ด๋ณด์ธ์.",
"์ด๋ฆ": "์ ๋ AI ์ด์์คํดํธ์
๋๋ค."
}
smart_agent = SmartAgent(agent, simple_patterns)
๐จ ๋๋ฒ๊น
ํ์ ํ:
1. ํญ์ verbose=True๋ก ์์ํด์ Agent์ ์ฌ๊ณ ๊ณผ์ ์ ํ์ธํ์! ๐
2. ๋ก๊ทธ๋ฅผ ํ์ผ๋ก ์ ์ฅํด์ ๋์ค์ ๋ถ์ํ์ ๐
3. ๋จ์ ํ
์คํธ๋ก ๊ฐ Tool์ ๊ฐ๋ณ์ ์ผ๋ก ๊ฒ์ฆํ์ โ
4. ํ๋ก๋์
๋ฐฐํฌ ์ ์ ์ถฉ๋ถํ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋๋ ค๋ณด์ ๐งช
๐ฎ ๋ฏธ๋ ์ ๋ง: Agent ๊ธฐ์ ์ ๋ฐ์ ๋ฐฉํฅ
LangChain Agent๋ ๊ณ์ ์งํํ๊ณ ์์ด! ์์ผ๋ก ์ด๋ค ๋ฐฉํฅ์ผ๋ก ๋ฐ์ ํ ์ง ์ดํด๋ณด์. ๐
๐ 1. Multi-Agent ์์คํ
์ฌ๋ฌ Agent๊ฐ ํ์
ํ๋ ์์คํ
์ด ์ฃผ๋ชฉ๋ฐ๊ณ ์์ด! ๋ง์น ํ์ฌ์์ ํ์๋ค์ด ์ญํ ์ ๋๋ ์ผํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐ฅ
์์:
โข Manager Agent: ์ ์ฒด ์์
์กฐ์จ ๋ฐ ๋ถ๋ฐฐ ๐
โข Researcher Agent: ์ ๋ณด ์์ง ๋ฐ ๋ถ์ ๐
โข Writer Agent: ์ฝํ
์ธ ์์ฑ โ๏ธ
โข Reviewer Agent: ํ์ง ๊ฒํ ๋ฐ ํผ๋๋ฐฑ โ
๊ฐ Agent๊ฐ ์ ๋ฌธ ๋ถ์ผ์ ์ง์คํ๋ฉด์ ํจ์จ์ฑ์ด ํฌ๊ฒ ํฅ์๋ผ!
๐ง 2. ์์จ ํ์ต Agent
์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ค์ค๋ก ๊ฐ์ ํ๋ Agent๊ฐ ๋ฑ์ฅํ๊ณ ์์ด! ๐
์๋ ๋ฐฉ์:
โข ์ฌ์ฉ์ ๋ง์กฑ๋ ์์ง
โข ์ฑ๊ณต/์คํจ ํจํด ๋ถ์
โข Tool ์ ํ ์ ๋ต ์๋ ์ต์ ํ
โข ํ๋กฌํํธ ์๋ ํ๋
๋ง์น ๊ฒฝํ์ ์์ผ๋ฉด์ ์ ์ ๋๋ํด์ง๋ ์ ์
์ฌ์ ๊ฐ์! ๐
๐ 3. ํฌ๋ก์ค ํ๋ซํผ ํตํฉ
๋ค์ํ ์๋น์ค์ ํ๋ซํผ์ ์์ ๋กญ๊ฒ ์ฐ๊ฒฐํ๋ Agent! ๐
ํตํฉ ์์:
โข Slack, Teams ๊ฐ์ ํ์
ํด
โข Notion, Confluence ๊ฐ์ ๋ฌธ์ ๋๊ตฌ
โข Salesforce, HubSpot ๊ฐ์ CRM
โข AWS, Azure ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค
ํ๋์ Agent๋ก ๋ชจ๋ ์
๋ฌด ๋๊ตฌ๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋ ๊ฑฐ์ผ! ๐ฎ
๐ก๏ธ 4. ๋ณด์ ๋ฐ ์ค๋ฆฌ ๊ฐํ
Agent์ ํ๋์ ์์ ํ๊ฒ ์ ์ดํ๋ ๊ธฐ์ ์ด ๋ฐ์ ์ค์ด์ผ! ๐
์ฃผ์ ๊ธฐ๋ฅ:
โข ๋ฏผ๊ฐ ์ ๋ณด ์๋ ๋ง์คํน
โข ์ํํ ํ๋ ์ฌ์ ์ฐจ๋จ
โข ๊ฐ์ฌ ๋ก๊ทธ ์๋ ์์ฑ
โข ํธํฅ์ฑ ๊ฐ์ง ๋ฐ ์ํ
โข ์ค๋ช
๊ฐ๋ฅํ AI (XAI) ์ ์ฉ
๊ธฐ์
์์ ์์ฌํ๊ณ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด ๋ง๋ค์ด์ง๊ณ ์์ด! ๐ข
โก 5. ์ฃ์ง ์ปดํจํ Agent
ํด๋ผ์ฐ๋๊ฐ ์๋ ๋ก์ปฌ ๋๋ฐ์ด์ค์์ ์๋ํ๋ ๊ฒฝ๋ Agent! ๐ฑ
์ฅ์ :
โข ์ธํฐ๋ท ์์ด๋ ์๋
โข ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ฐํ
โข ์๋ต ์๋ ํฅ์
โข ๋น์ฉ ์ ๊ฐ
์ค๋งํธํฐ, IoT ๊ธฐ๊ธฐ์์๋ ๊ฐ๋ ฅํ Agent๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฑฐ์ผ! ๐
๐ ํ์ต ๋ฆฌ์์ค ๋ฐ ๋ค์ ๋จ๊ณ
์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด LangChain Agent์ ๊ธฐ์ด๋ ํ์คํ ๋ค์ง ๊ฑฐ์ผ! ์ด์ ๋ ๊น์ด ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด? ๐
๐ ์ถ์ฒ ํ์ต ์๋ฃ
๊ณต์ ๋ฌธ์:
โข LangChain ๊ณต์ ๋ฌธ์: https://python.langchain.com
โข Agent ๊ฐ์ด๋: ๋ค์ํ Agent ํ์
๊ณผ ์์ ์ ๊ณต
โข Tool ๊ฐ๋ฐ ๊ฐ์ด๋: ์ปค์คํ
Tool ์์ฑ๋ฒ
์ปค๋ฎค๋ํฐ:
โข LangChain Discord: ์ค์๊ฐ ์ง์์๋ต
โข GitHub Issues: ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋ฐ ๊ธฐ๋ฅ ์์ฒญ
โข Reddit r/LangChain: ์ฌ์ฉ์ ๊ฒฝํ ๊ณต์
์ค์ต ํ๋ก์ ํธ:
โข ๊ฐ๋จํ ์ฑ๋ด๋ถํฐ ์์
โข ์ ์ง์ ์ผ๋ก Tool ์ถ๊ฐ
โข ์ค์ ๋ฌธ์ ํด๊ฒฐ์ ์ ์ฉ
โข ์คํ์์ค ํ๋ก์ ํธ ๊ธฐ์ฌ
๐ฏ ์ค๋ ฅ ํฅ์ ๋ก๋๋งต
์ด๊ธ (1-2์ฃผ):
โ
LangChain ๊ธฐ๋ณธ ๊ฐ๋
์ดํด
โ
๊ฐ๋จํ ์ฒด์ธ ๊ตฌํ
โ
๊ธฐ๋ณธ Tool ์ฌ์ฉ๋ฒ ์ตํ๊ธฐ
โ
Zero-shot Agent ๋ง๋ค์ด๋ณด๊ธฐ
์ค๊ธ (1-2๊ฐ์):
โ
์ปค์คํ
Tool ๊ฐ๋ฐ
โ
๋ค์ํ Agent ํ์
์คํ
โ
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ต์ ํ
โ
์๋ฌ ํธ๋ค๋ง ๊ตฌํ
โ
์ค์ ํ๋ก์ ํธ 1๊ฐ ์์ฑ
๊ณ ๊ธ (3-6๊ฐ์):
โ
Multi-Agent ์์คํ
๊ตฌ์ถ
โ
ํ๋ก๋์
๋ฐฐํฌ ๊ฒฝํ
โ
์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง
โ
๋ณด์ ๋ฐ ์ค๋ฆฌ ๊ณ ๋ ค์ฌํญ ์ ์ฉ
โ
์คํ์์ค ๊ธฐ์ฌ ๋๋ ๋ธ๋ก๊ทธ ์์ฑ
๐ก ์ค์ ํ
1. ์๊ฒ ์์ํ์: ์ฒ์๋ถํฐ ๋ณต์กํ ์์คํ
์ ๋ง๋ค๋ ค๊ณ ํ์ง ๋ง๊ณ , ๊ฐ๋จํ Agent๋ถํฐ ์์ํด์ ์ ์ง์ ์ผ๋ก ํ์ฅํ์! ๐ฑ
2. ์คํจ๋ฅผ ๋๋ ค์ํ์ง ๋ง์: Agent๊ฐ ์ด์ํ๊ฒ ์๋ํ๋ ๊ฑด ์ ์์ด์ผ. verbose=True๋ก ๋๋ฒ๊น
ํ๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒ ์ต๊ณ ์ ํ์ต๋ฒ! ๐
3. ์ปค๋ฎค๋ํฐ๋ฅผ ํ์ฉํ์: ํผ์ ๊ณ ๋ฏผํ์ง ๋ง๊ณ ์ง๋ฌธํ๊ณ ๊ณต์ ํ์. ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฒช์์ ๊ฑฐ์ผ! ๐ค
4. ๋ฌธ์ํํ์: ๋ด๊ฐ ๋ง๋ Agent์ ์๋ ๋ฐฉ์์ ๊ธฐ๋กํด๋๋ฉด ๋์ค์ ์์ฒญ ๋์์ด ๋ผ! ๐
5. ์ค์ ๋ฌธ์ ์ ์ ์ฉํ์: ์ด๋ก ๋ง ๊ณต๋ถํ์ง ๋ง๊ณ ์ค์ ์
๋ฌด๋ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด์. ๊ทธ๊ฒ ์ง์ง ์ค๋ ฅ ํฅ์์ ์ง๋ฆ๊ธธ! ๐
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์! ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐ LangChain Agent์ ๊ตฌ์กฐ๋ถํฐ ์ค์ ํ์ฉ๊น์ง ๊ธด ์ฌ์ ์ ํจ๊ปํ๋ค.
Agent ๊ธฐ์ ์ AI์ ๋ฏธ๋๋ฅผ ๋ฐ๊ฟ ํต์ฌ ๊ธฐ์ ์ค ํ๋์ผ. ๋จ์ํ ์ง๋ฌธ์ ๋ตํ๋ AI๋ฅผ ๋์ด์, ์ค์ค๋ก ์๊ฐํ๊ณ ํ๋ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์์จ์ ์ธ ์์คํ
์ ๋ง๋ค ์ ์๋ค๋ ๊ฑด ์ ๋ง ํ๋ช
์ ์ด์ง! ๐
๋ฌผ๋ก ์ฒ์์๋ ์ด๋ ต๊ณ ํท๊ฐ๋ฆด ์ ์์ด. Agent๊ฐ ์ด์ํ๊ฒ ์๋ํ๊ฑฐ๋, ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์ ๋์ฌ ๋๋ ๋ง์ ๊ฑฐ์ผ. ํ์ง๋ง ๊ทธ๊ฒ ๋ฐ๋ก ์ฑ์ฅ์ ๊ณผ์ ์ด์ผ! ์คํจํ๊ณ , ๋๋ฒ๊น
ํ๊ณ , ๊ฐ์ ํ๋ฉด์ ์ง์ง ์ค๋ ฅ์ด ์์ด๋ ๊ฑฐ์ง. ๐ช
์ด์ ๋น์ ์ฐจ๋ก์ผ! ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ง์ Agent๋ฅผ ๋ง๋ค์ด๋ณด์. ๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํด์ ์ ์ ๋ณต์กํ ์์คํ
์ผ๋ก ๋ฐ์ ์์ผ ๋๊ฐ๋ฉด ๋ผ. ๊ทธ๋ฆฌ๊ณ ๋งํ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ์ปค๋ฎค๋ํฐ์ ์ง๋ฌธํ๊ฑฐ๋, ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์! ๐ค
AI ๊ฐ๋ฐ์ ํผ์ ํ๋ ๊ฒ ์๋์ผ. ์ ์ธ๊ณ์ ๊ฐ๋ฐ์๋ค์ด ํจ๊ป ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ์ฌ์ ์ด์ง. ๋น์ ๋ ์ด ๋ฉ์ง ์ปค๋ฎค๋ํฐ์ ์ผ์์ด ๋ ๊ฑธ ํ์ํด! ๐
๊ทธ๋ผ ํ์ด์ ๋น์ด! ๋ฉ์ง Agent๋ฅผ ๋ง๋ค์ด์ ์ธ์์ ๋ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด๋ณด์! ํ์ดํ
! ๐โจ
๐ Remember ๐
"The best way to predict the future is to create it."
- Peter Drucker
์ง๊ธ ๋น์ฅ ์์ํ์! ๋น์ ์ ์ฒซ Agent๊ฐ ์ธ์์ ๋ฐ๊ฟ ์๋ ์์ด! ๐
๐ ์ด ๊ธ์ด ๋์์ด ๋์๋ค๋ฉด ์ฃผ๋ณ ๊ฐ๋ฐ์ ์น๊ตฌ๋ค๊ณผ ๊ณต์ ํด์ค!
๐ค AI/๋จธ์ ๋ฌ๋ ๊ฐ๋ฐ ๊ด๋ จ ํ๋ก์ ํธ๋ ์ง์ ๊ณต์ ๋ ์ฌ๋ฅ๋ท์์!
๐ฌ ๊ถ๊ธํ ์ ์ด๋ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ด์ผ!
Happy Coding! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.