Jump to content

๐Ÿฆœ๐Ÿ•ธ๏ธ LangGraph๋กœ ์›น ๊ฒ€์ƒ‰ Agent ๋งŒ๋“ค๊ธฐ (Web Search Agent Cookbook)


Recommended Posts

image.png.5143c021c2182db26345391b0ba55d93.png

ย 

๋“ค์–ด๊ฐ€๋ฉฐ


AI ์—์ด์ „ํŠธ ๊ธฐ์ˆ ์€ ๋‹จ์ˆœํ•œ ๋Œ€ํ™”ํ˜• ๋ชจ๋ธ์„ ๋„˜์–ด, ์™ธ๋ถ€ ๋„๊ตฌ(Tool)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ฐพ์•„ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ชจ๋ธ ๋‹จ๋…์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋Š” ์‹ค์‹œ๊ฐ„ ์ •๋ณด ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฒ€์ƒ‰ API๋ฅผ ์—ฐ๋™ํ•œ '์›น ๊ฒ€์ƒ‰ AI ์—์ด์ „ํŠธ'๊ฐ€ ํฐ ์ฃผ๋ชฉ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด Cookbook์—์„œ๋Š” LangGraph๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ API๋ฅผ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” AI ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ ๋‹จ๊ณ„๋ณ„๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์ƒ์„ธํžˆ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์‹ค์Šตํ•˜๋ฉฐ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๊ฐ•๋ ฅํ•˜๊ณ  ๋งž์ถคํ™”๋œ ์›น ๊ฒ€์ƒ‰ ์—์ด์ „ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•ด ๋ณด์„ธ์š”.ย 

ย 

Agent System ์ž‘๋™ ์›๋ฆฌ


์›น ๊ฒ€์ƒ‰ AI ์—์ด์ „ํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋จผ์ € ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ์‹œ์Šคํ…œ์€ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ํ•„์š”์‹œ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋„๊ตฌ(Tool)๋ฅผ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋„๊ตฌ ์ค‘ ํ˜„์žฌ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ , ์–ป์–ด์ง„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ AI ๋ชจ๋ธ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์–ธ์–ด๋กœ ์ •๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ์ข… ์‘๋‹ต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ "์˜ค๋Š˜ ์„œ์šธ ๋‚ ์”จ ์•Œ๋ ค์ค˜"๋ผ๊ณ  ์งˆ๋ฌธํ•˜๋ฉด, ์—์ด์ „ํŠธ๋Š” ๊ฒ€์ƒ‰ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ตœ์‹  ๋‚ ์”จ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค, ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

Quote
  • Toolย :ย AI ๋ชจ๋ธ์ด ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ(์˜ˆ: ์›น ๊ฒ€์ƒ‰, ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋“ฑ)์„ ํ•จ์ˆ˜๋‚˜ API ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋ชจ๋ธ์˜ ๋Šฅ๋ ฅ์„ ํ™•์žฅํ•˜๋Š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. (์˜ˆ: ๊ฒ€์ƒ‰ API)
  • Agent :ย ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ํ•„์š”ํ•œ ๋„๊ตฌ(Function)๋ฅผ ํŒ๋‹จํ•˜์—ฌ ์‹คํ–‰ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฌ์šด ์–ธ์–ด๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์ œ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. (์˜ˆ: "์‹ค์‹œ๊ฐ„ ๋‚ ์”จ ์ •๋ณด ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•˜๊ฒ ๊ตฐ." โ†’ Tool ํ˜ธ์ถœ)
  • ChatClovaXย :ย AI ๋ชจ๋ธ๋กœ์„œ, ๋„๊ตฌ๋กœ๋ถ€ํ„ฐ ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฌธ์žฅ ํ˜•ํƒœ์˜ ๋‹ต๋ณ€์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

ย 

image.png.3267f43409060c432d544b9e98db90b9.png

ย 

LangGraph AI Agent ๊ตฌํ˜„ ์‹œ์ž‘ํ•˜๊ธฐ


์ด์ œ LangGraph๋ฅผ ์ด์šฉํ•˜์—ฌ Tool์„ ์—ฐ๋™ํ•œ AI ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ API๋ฅผ ๋„๊ตฌ๋กœ ํ™œ์šฉํ•˜๋ฉด, LLM์ด ์ž์ฒด ์ง€์‹๋งŒ์œผ๋กœ๋Š” ๋‹ต๋ณ€ํ•˜๊ธฐ ์–ด๋ ค์šด ์งˆ๋ฌธ์— ๋Œ€ํ•ด์„œ๋„ ๋”์šฑ ์ •ํ™•ํ•˜๊ณ  ์‹ ๋ขฐ๋„ ๋†’์€ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image.png.17cb22203a19ae1e43a57a2e96056674.png

ย 

โ‘  ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ค์ •

Quote

๋ฒ„์ „ ์ •๋ณด

Python >= 3.13.2, langchain >=ย 0.3.23
๋ณธ ์ฟก๋ถ์€ Jupyter Notebook(.ipynb) ํ™˜๊ฒฝ ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„๋˜์–ด, ์…€ ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
LangChain์€ AI ์—์ด์ „ํŠธ ๊ตฌ์ถ•์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์†์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŒŒ์ด์ฌ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋จผ์ € pip ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

%pip install -U langchain langchain-openai langchain-naver langgraph langchain-community langchain-naver-community

ย 

CLOVA Studio API KEY ๋ฐœ๊ธ‰
๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์—์„œ CLOVA Studio ์ด์šฉ ์‹ ์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์šฉ ์‹ ์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด, CLOVA Studio ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•ด API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Quote

API ํ‚ค๋Š” CLOVA Studio์— ๋กœ๊ทธ์ธํ•œ ๋’ค, 'ํ”„๋กœํ•„ > API ํ‚ค > ํ…Œ์ŠคํŠธ > ํ…Œ์ŠคํŠธ ์•ฑ ๋ฐœ๊ธ‰' ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, API ํ‚ค๋Š” ํ•œ ๋ฒˆ๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐœ๊ธ‰ ์งํ›„ ๋ฐ˜๋“œ์‹œ ๋ณต์‚ฌํ•˜์—ฌ ๋ณ„๋„๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

image.png.54dec46e0d45dbf32c5c1982c3d3a0a3.png

ย 

CLOVA Studio ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
HCX-005 ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด, CLOVA Studio API ํ‚ค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์…€์„ ์‹คํ–‰ํ•˜๋ฉด API ํ‚ค ์ž…๋ ฅ๋ž€์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

import os
import getpass

os.environ["CLOVASTUDIO_API_KEY"] = getpass.getpass(
        "CLOVA Studio API Key ์ž…๋ ฅ: "
    )

ย 

โ‘ก LLM ๋ชจ๋ธ ๊ตฌํ˜„

HCX ๋ชจ๋ธ ์ •์˜
Langchain-naver ChatClovaX๋ฅผ ํ†ตํ•ด HCX-005 ๋ชจ๋ธ์„ย ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.ย 

Quote

์ฃผ์˜์‚ฌํ•ญ
๊ฒ€์ƒ‰ API ๋“ฑ Tool์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ max_tokens๋ฅผ ๋ฐ˜๋“œ์‹œ 1024 ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

from langchain_naver import ChatClovaX

llm = ChatClovaX(
    model="HCX-005",
    max_tokens=1024, # Tool ์‚ฌ์šฉ์‹œ max_tokens์€ 1024์ด์ƒ ํ•„์ˆ˜
)

ย 

HCX ๋ชจ๋ธ ํ…Œ์ŠคํŠธ
๋ชจ๋ธ ์ดˆ๊ธฐํ™” ์ดํ›„, "์•ˆ๋…•, ๋„ˆ๋Š” ๋ˆ„๊ตฌ์•ผ?"์™€ ๊ฐ™์€ ์ž…๋ ฅ์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ์ •์ƒ ์ž‘๋™ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

llm.invoke("์•ˆ๋…•,๋„ˆ๋Š” ๋ˆ„๊ตฌ์•ผ?")
AIMessage(content='์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” CLOVA X์ž…๋‹ˆ๋‹ค.\n\n์‚ฌ์šฉ์ž๋‹˜์˜ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ๋œ ์ธ๊ณต์ง€๋Šฅ ์–ธ์–ด๋ชจ๋ธ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\n1. ์งˆ์˜ ์‘๋‹ต: ์‚ฌ์šฉ์ž๋‹˜์ด ๊ถ๊ธˆํ•˜์‹  ๋‚ด์šฉ์„ ์งˆ๋ฌธํ•ด ์ฃผ์‹œ๋ฉด, ์ด์— ๋Œ€ํ•ด ํ•™์Šตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ •ํ™•ํ•˜๊ณ  ์œ ์šฉํ•œ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•˜๋„๋ก ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.\n2. ๊ธ€์“ฐ๊ธฐ ์ง€์›: ์ด๋ฉ”์ผ ์ž‘์„ฑ์ด๋‚˜ ๋ฌธ์„œ ์ดˆ์•ˆ์„ ์žก์„ ๋•Œ ํ•„์š”ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ฌธ์žฅ์„ ๋‹ค๋“ฌ์–ด ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n3. ๋ฒˆ์—ญ: ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ฒˆ์—ญํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n4. ์š”์•ฝ ๋ฐ ๋ถ„์„: ์›๋ฌธ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.\n\n๊ถ๊ธˆํ•˜์‹  ๋‚ด์šฉ์ด๋‚˜ ๋„์›€์ด ํ•„์š”ํ•˜์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”. ์ตœ์„ ์„ ๋‹คํ•ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 164, 'prompt_tokens': 13, 'total_tokens': 177, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'HCX-005', 'system_fingerprint': None, 'id': '1b6d8c4819b04e70bde29e40d7d2068a', 'finish_reason': 'stop', 'logprobs': None}, id='run-b74541be-2b13-4c4b-b31f-40385f929ec2-0', usage_metadata={'input_tokens': 13, 'output_tokens': 164, 'total_tokens': 177, 'input_token_details': {}, 'output_token_details': {}})

ย 

โ‘ขย Tool ๊ตฌํ˜„

๊ฒ€์ƒ‰ ๋„๊ตฌ(Tool) API ์ด์šฉ์‹ ์ฒญ
๊ฒ€์ƒ‰ API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Tavily์—์„œ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Tavily ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•˜๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด API ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰๋œ ํ‚ค๋Š” ์˜ค๋ฅธ์ชฝ ๋ณต์‚ฌ ๋ฒ„ํŠผ(๋นจ๊ฐ„์ƒ‰ ๋ฐ•์Šค)์„ ํด๋ฆญํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•ด๋‘์„ธ์š”.

image.png.7cbc378b2c336b9b049913d4aeaabd64.png

ย 

๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ API ๋„๊ตฌ
๋ณธ Cookbook์—์„œ๋Š” Tavily API๋ฅผ ๋„๊ตฌ(Tool)๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ด ์™ธ์—๋„ DuckDuckGo, Brave, Jina ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌด๋ฃŒ ๊ฒ€์ƒ‰ API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒ€์ƒ‰ API์˜ ํŠน์ง•๊ณผ ์‚ฌ์šฉ ์กฐ๊ฑด์€ ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

Tool/Toolkit
Free/Paid
Return Data
Bing Search Paid URL, Snippet, Title
Brave Search Free URL, Snippet, Title
DuckDuckgoSearch Free URL, Snippet, Title
Exa Search 1000 free searches/month URL, Author, Title, Published Date
Google Search Paid URL, Snippet, Title
Google Serper Free URL, Snippet, Title, Search Rank, Site Links
Jina Search 1M Response Tokens Free URL, Snippet, Title, Page Content
Mojeek Search Paid URL, Snippet, Title
SearchApi 100 Free Searches on Sign Up URL, Snippet, Title, Search Rank, Site Links, Authors
SearxNG Search Free URL, Snippet, Title, Category
SerpAPI 100 Free Searches/Month Answer
Tavily Search 1000 free searches/month URL, Content, Title, Images, Answer
You.com Search Free for 60 days URL, Title, Page Content

ย 

๊ฒ€์ƒ‰ ๋„๊ตฌ(Tool) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” API KEY๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. API KEY๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•˜์—ฌ, ์•ˆ์ „ํ•˜๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

os.environ["TAVILY_API_KEY"] = getpass.getpass(
        "Tavily API Key ์ž…๋ ฅ: "
    )

ย 

๊ฒ€์ƒ‰ย ๋„๊ตฌ ์ •์˜
LangChain์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€ tool์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ max_results ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ๋Œ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from langchain_community.tools.tavily_search import TavilySearchResults

tool = TavilySearchResults(max_results=5)

ย 

๊ฒ€์ƒ‰ ๋„๊ตฌ
ํ…Œ์ŠคํŠธ ๊ฒ€์ƒ‰ ๋„๊ตฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, tool.invoke() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

tool.invoke("์ •์ž์—ญ")

image.png.fed8bb4c36192ce2d2fa11852fb86d31.png

ย 

Agent ๋„๊ตฌ ์ •์˜
Agent๊ฐ€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋Š” ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tavily ๊ฒ€์ƒ‰ API ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ API๋‚˜ ์ปค์Šคํ…€ ํ•จ์ˆ˜๋ฅผ ํ•จ๊ป˜ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋ธ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ์ •๋ฐ€ํ•˜๊ณ  ์‹ ๋ขฐ๋„ ๋†’์€ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” Tavily ์™ธ์— ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ ๋„๊ตฌ๋กœ ๊ตฌ์„ฑํ•œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

tools = [tool]
# tools = [tool1, tool2, tool3, etc... ]

์—ฌ๋Ÿฌ ๋„๊ตฌ(Tool) ์„ค์ • ๋ฐฉ๋ฒ•

from datetime import datetime
from langchain_core.tools import Tool

def get_current_time(dummy: str = "now") -> dict:
    print("[tool2 ํ˜ธ์ถœ] ํ˜„์žฌ ์‹œ๊ฐ„ ์กฐํšŒ\n")
    """ํ˜„์žฌ ์‹œ๊ฐ„์„ ISO 8601 ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค."""
    return {"current_time": datetime.now().isoformat()}

tool2 = Tool.from_function(
    func=get_current_time,
    name="get_current_time",
    description="์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ์‹œ๊ฐ„์„ ISO 8601 ํฌ๋งท์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค."
)

tools = [tool1, tool2]

ย 

โ‘ฃ Agent Workflow ๊ตฌ์ถ•

LangGraph Agent ๊ตฌํ˜„
langgraph.prebuilt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ create_react_agent ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ํ•œ ์ค„๋กœ ์—์ด์ „ํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” LangGraph์—์„œ ๋ฏธ๋ฆฌ ์ •์˜ํ•œ REACT ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๋ฅผ ์†์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต๋˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. LLM ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ์•ž์„œ ์ •์˜ํ•œ ์–ธ์–ด ๋ชจ๋ธ์„, tools ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ๊ตฌ์„ฑํ•œ ๋„๊ตฌ ๋ชฉ๋ก์„ ๊ฐ๊ฐ ์ „๋‹ฌํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

โ€ป ๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ Agentic Workflow๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ณธ ๋ฌธ์„œ์˜ ๋งˆ์ง€๋ง‰ ์ฑ•ํ„ฐ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

from langgraph.prebuilt import create_react_agent

agent_executor = create_react_agent(
    llm,
    tools,
)

ย 

Agent ์‹คํ–‰ ํ•จ์ˆ˜ ์ •์˜
์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ Agent Executor์— ์ „๋‹ฌํ•˜๊ณ , ์ฒ˜๋ฆฌ๋œ ์ตœ์ข… ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

def agent_run(query):
    result = agent_executor.invoke({"messages": [("human", query)]})
    
    return result["messages"][-1].content

ย 

์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ์‹คํ–‰
while True ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์„œ ์ •์˜ํ•œ agent_run ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ง€์†์ ์œผ๋กœ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™”๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด quit, exit, ๋˜๋Š” q๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

while True:
    query = input("User: ")
    print("User: "+query+"\n")

    if query.lower() in ["quit", "exit", "q"]:
        print("Goodbye!")
        break

    print("Assistant: "+agent_run(query))

image.png.8bb7f15d755569a714ecbd99bc72182f.png

ย 

๋žญ๊ทธ๋ž˜ํ”„ Agent Workflow ์‹œ๊ฐํ™”
์—์ด์ „ํŠธ์˜ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์กฐ๋Š” Mermaid ํ˜•์‹์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ†ตํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from IPython.display import Image, display

display(Image(agent_executor.get_graph().draw_mermaid_png()))

image.png.17cb22203a19ae1e43a57a2e96056674.png

ย 

GUI๋กœ ์‰ฝ๊ฒŒ ๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ Agentic Workflow ๊ตฌํ˜„
LangGraph Builder๋Š” ์ดˆ๋ณด์ž๋„ ์‰ฝ๊ฒŒ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ GUI๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ Python ๋˜๋Š” TypeScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Quote

LangGraph Builder ์‹œ๋‚˜๋ฆฌ์˜ค
์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด, LangGraph Builder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Agentic Workflow๋ฅผ GUI ํ™˜๊ฒฝ์—์„œ ์†์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image.png.f75efc9943a774245fdd7ec85cd2f6b8.png

ย 

LangGraph Builer ๋ช…๋ ์–ด
LangGraph Builer๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด๋Š” ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

  • ๋…ธ๋“œ ์ƒ์„ฑ:ย โŒ˜ + ์บ”๋ฒ„์Šค ์•„๋ฌด ๊ณณ์ด๋‚˜ ํด๋ฆญ
  • ์—ฃ์ง€(์—ฐ๊ฒฐ์„ ) ์ƒ์„ฑ:ย ํ•œ ๋…ธ๋“œ์˜ ์•„๋ž˜์ชฝ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์œ„์ชฝ์œผ๋กœ ํด๋ฆญ ํ›„ ๋“œ๋ž˜๊ทธ
  • ์กฐ๊ฑด๋ถ€ ์—ฃ์ง€ ์ƒ์„ฑ:ย ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ
  • ์‚ฌ์ดํด ์ƒ์„ฑ:ย ๋…ธ๋“œ์˜ ์•„๋ž˜์ชฝ์—์„œ ์œ„์ชฝ์œผ๋กœ ํด๋ฆญ ํ›„ ๋“œ๋ž˜๊ทธ
  • ์—ฃ์ง€/๋…ธ๋“œ ์‚ญ์ œ:ย ์—ฃ์ง€ ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•˜๊ณ  ๋ฐฑ์ŠคํŽ˜์ด์Šค ํ‚ค ๋ˆ„๋ฅด๊ธฐ
  • ์—ฃ์ง€ ์ƒ‰์ƒ ์ง€์ •:ย ์—ฃ์ง€๋ฅผ ํด๋ฆญํ•œ ํ›„ ์ƒ‰์ƒ ์„ ํƒ๊ธฐ์—์„œ ์˜ต์…˜ ์„ ํƒ

image.png.2f9a12593813053b3c863388c06617aa.png

๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” Templates(ํ…œํ”Œ๋ฆฟ) ๋ฒ„ํŠผ์„ ํ†ตํ•ด, ๊ฐ„๋‹จํ•œ RAG ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ Agent with Tool ๊ตฌ์„ฑ์„ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์™€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image.png.d02291b9782eca19ecb941f61d18e030.png

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ์ธก ์ƒ๋‹จ์˜ 'Generate Code' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด, GUI๋กœ ๊ตฌ์„ฑํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ Python ๋˜๋Š” TypeScript ์ฝ”๋“œ๋กœ ์†์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

ย 

๋งˆ๋ฌด๋ฆฌ


์ด๋ฒˆ Cookbook์—์„œ๋Š” LangGraph์™€ LangChain-naver๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›น ๊ฒ€์ƒ‰ AI ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ „ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. LangGraph์™€ Clova Studio, ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ Tool์„ ์กฐํ•ฉํ•˜๋ฉด, ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ AI Agent๋ฅผ ๋ˆ„๊ตฌ๋‚˜ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์•„์ด๋””์–ด์™€ ์ƒ์ƒ๋ ฅ์ด ๋”ํ•ด์งˆ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.ย ๐Ÿš€

image.png.f8afd4fb5755e998eb0acd5222dee62e.png

ย 

ย 

image.png.fff2f7ed15bf1d79562e66d1565c59a7.png

ย 

๋งํฌ ๋ณต์‚ฌ
๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์— ๊ณต์œ ํ•˜๊ธฐ

  • CLOVA Studio ์šด์˜์ž changed the title to ๐Ÿฆœ๐Ÿ•ธ๏ธ LangGraph๋กœ ์›น ๊ฒ€์ƒ‰ Agent ๋งŒ๋“ค๊ธฐ (Web Search Agent Cookbook)

๊ฒŒ์‹œ๊ธ€ ๋ฐ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธ ํ•ด์ฃผ์„ธ์š”.



๋กœ๊ทธ์ธ
×
×
  • Create New...