์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿค– LangChain Agent ๊ตฌ์กฐ ์™„๋ฒฝ ์ดํ•ด์™€ ์‹ค์ „ ํ™œ์šฉ ๊ฐ€์ด๋“œ

๐Ÿค– LangChain Agent ๊ตฌ์กฐ ์™„๋ฒฝ ์ดํ•ด์™€ ์‹ค์ „ ํ™œ์šฉ ๊ฐ€์ด๋“œ

AI๊ฐ€ ์Šค์Šค๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์„ธ๊ณ„๋กœ์˜ ์ดˆ๋Œ€ โœจ

์•ˆ๋…•, ์นœ๊ตฌ! ๐Ÿ™‹โ€โ™‚๏ธ ์š”์ฆ˜ AI ๊ฐœ๋ฐœํ•˜๋ฉด์„œ "์ด ๋…€์„์ด ์ข€ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ณ  ํ–‰๋™ํ•˜๋ฉด ์ข‹๊ฒ ๋Š”๋ฐ..."๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณธ ์  ์žˆ์ง€? ๋ฐ”๋กœ ๊ทธ ๊ณ ๋ฏผ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒŒ LangChain Agent์•ผ!

๋‹จ์ˆœํžˆ ์งˆ๋ฌธ์— ๋‹ต๋ณ€๋งŒ ํ•˜๋Š” ์ฑ—๋ด‡์„ ๋„˜์–ด์„œ, AI๊ฐ€ ์Šค์Šค๋กœ ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ž์œจ์ ์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด? ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š์•„? ๐Ÿ˜Ž

์˜ค๋Š˜์€ LangChain Agent์˜ ๊ตฌ์กฐ๋ถ€ํ„ฐ ์‹ค์ „ ํ™œ์šฉ๊นŒ์ง€, ์นœ๊ตฌ์—๊ฒŒ ์„ค๋ช…ํ•˜๋“ฏ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ํ’€์–ด๋ณผ๊ฒŒ. ์ปคํ”ผ ํ•œ ์ž” โ˜• ์ค€๋น„ํ•˜๊ณ  ํŽธํ•˜๊ฒŒ ์ฝ์–ด๋ด!

๐Ÿค– ๐Ÿ”ง Tools ๐Ÿง  LLM ๐Ÿ’พ Memory LangChain Agent Architecture

๐ŸŽฏ 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 Execution Flow User Query Agent Core Tool Execution Feedback Final Answer ๐Ÿ”ง ๐Ÿ’พ

๐ŸŽจ 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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์•ผ! ๐ŸŒŸ

Future of AI Agents ๐Ÿ‘ฅ Multi-Agent ๐Ÿง  Self-Learning ๐Ÿ”— Integration The Next Generation of AI

๐Ÿ“š ํ•™์Šต ๋ฆฌ์†Œ์Šค ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด 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
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.