[LLM] LangGraph

[์›๋ณธ ๋งํฌ]

๊ด€๋ จ ์„ ํ–‰ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/224080593051
https://blog.naver.com/sssang97/223884516216

langgraph๋Š” langchain์ด ํ™•์žฅ๋œ ํ˜•ํƒœ์˜ ์—์ด์ „ํŠธ ๊ฐœ๋ฐœ์šฉ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.
๊ตฌ์กฐํ™”๋œ ์—์ด์ „ํŠธ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์„ ์ž˜ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜์˜ ๋ณต์žกํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด langchain๋ณด๋‹ค๋Š” langgraph๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๊ตฌ์กฐ๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ค„๋ณธ๋‹ค.




์ข…์†์„ฑ ๊ตฌ์„ฑ (with Gemini)

uv๋ฅผ ์“ฐ๊ณ , gemini๋ฅผ ์“ด๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ข…์†์„ฑ์€ ์ด ์ •๋„๋‹ค.

[project]
name = "langchain-test"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "langchain>=1.0.0",
    "langchain-google-genai>=1.0.0",
    "python-dotenv>=1.0.0",
    "langgraph>=0.1.0",
]

langgraph๋ฅผ ์“ด๋‹ค๊ณ  ํ•ด์„œ langchain์„ ์“ฐ์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
ํฌํ•จ ํ˜•ํƒœ๋กœ ํ™•์žฅ๋œ ๊ฒƒ์ด๋ผ์„œ ๋‘˜ ๋‹ค ์จ์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํžˆ gemini์šฉ llm driver๋„ ํ•„์š”ํ•˜๋‹ค.




๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์ž, ๊ทธ๋Ÿผ langgraph๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด์ž.
์–ด๋–ค ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์„ ํƒํ•˜๋Š” intro ์—์ด์ „ํŠธ, ๊ทธ๋ฆฌ๊ณ  ์‹ค์งˆ์ ์ธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” help, smalltalk ์—์ด์ „ํŠธ 2๊ฐ€์ง€๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ๋‹ค.

์ผ๋‹จ ์ƒํƒœ์— ๋Œ€ํ•œ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด๊ฑด ์—์ด์ „ํŠธ ๊ฐ„ ์ƒํƒœ, ๋Œ€ํ™” ๊ณต์œ  ๋“ฑ์— ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋จผ์ € intro ์—์ด์ „ํŠธ์˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.

์ด ์—์ด์ „ํŠธ๋Š” ๋Œ€ํ™”๋ฅผ ๋ถ„์„ํ•ด์„œ ์–ด๋–ค ์—์ด์ „ํŠธ์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์—์ด์ „ํŠธ๋‹ค.
๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋Œ€ํ™”๋ฅผ "๋ถ„๋ฅ˜"ํ•œ ๋‹ค์Œ์—, ์–ด๋–ค ์—์ด์ „ํŠธ๋กœ ๋ณด๋‚ผ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

๋‚˜๋จธ์ง€ 2๊ฐœ ์—์ด์ „ํŠธ๋Š” intro๊ฐ€ ๋˜์ง„ ์ƒํƒœ๊ฐ’์„ ํ† ๋Œ€๋กœ ์ตœ์ข… ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ๋‹ค.

๊ตฌํ˜„ ์ž์ฒด๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ € 3๊ฐ€์ง€ ์—์ด์ „ํŠธ๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ ์—์ด์ „ํŠธ๋ฅผ "๋…ธ๋“œ"๋กœ ๋“ฑ๋กํ•˜๊ณ , ์–ด๋””์—์„œ ์–ด๋–ค ๋…ธ๋“œ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ๋กœ ์„ ์–ธํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ์ •์˜๋œ ํ๋ฆ„์„ ๋”ฐ๋ผ์„œ ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์—ฌ๊ธฐ์„œ route_to_agent๋Š” ์ƒํƒœ๊ฐ’์˜ intent ๊ฐ’์„ ํ† ๋Œ€๋กœ ์–ด๋–ค ๋…ธ๋“œ๋ฅผ ๋ณด๋‚ผ์ง€๋ฅผ ๊ณจ๋ผ์ค€๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์ด ๊ทธ๋ž˜ํ”„๋ฅผ ํ† ๋Œ€๋กœ "์ปดํŒŒ์ผ"์„ ์‹คํ–‰ํ•˜๋ฉด, ์ตœ์ข…์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ flow๊ฐ€ ์™„์„ฑ๋œ๋‹ค.


์‹ค์ œ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์ปดํŒŒ์ผ๋œ app์œผ๋กœ invoke๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ดˆ state๋ฅผ ์ฃผ์ž…ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ž, ๊ทธ๋Ÿฌ๋ฉด ์‹คํ–‰ํ•ด๋ณด์ž.

์‚ฌ์†Œํ•œ ์ˆ˜๋‹ค๋ฅผ ๋˜์ง€๋ฉด smalltalk ์—์ด์ „ํŠธ๋กœ ๋ผ์šฐํŒ…ํ•ด์ฃผ๊ณ 


์ข€ ์ œ๋Œ€๋กœ ๋œ ์งˆ๋ฌธ์„ ๋˜์ง€๋ฉด help agent๋กœ ๋„˜๊ฒจ์„œ ๋‹ตํ•ด์ค€๋‹ค.
๊ทผ๋ฐ ์ง€์‹ ์ˆ˜์ค€์ด ๊ตฌ๋ฆฌ๊ธด ํ•˜๋”๋ผ. ์ €๊ฑด ๋‹ค ์œ ๋ช…ํ•œ ๋ธŒ๋žœ๋“œ์ง€, ๊ฐ€์„ฑ๋น„ ๋‚˜์˜๊ณ  ๋น„์‹ผ ๋ธŒ๋žœ๋“œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ๋Š” github์„ ์ฐธ์กฐํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.
https://github.com/myyrakle/oddments/tree/master/Python_Example/agent/langgraph_basic

์ด๋Ÿฐ ๊ฒƒ๋“ค ์™ธ์—๋„ ๋ณด์กฐ์ ์ธ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ๋‹ค.
Tools, MCP ๋“ฑ ์—์ด์ „ํŠธ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ฒƒ๋“ค์€ ์›ฌ๋งŒํ•ด์„œ๋Š” ๋‹ค ์žˆ๋‹ค.

๋” ์ƒ์„ธํ•œ ๋‚ด์šฉ๋“ค์€ ๋ณ„๋„ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.
https://langchain-ai.github.io/langgraph/guides/



์ฐธ์กฐ
https://wikidocs.net/261577
https://langchain-ai.github.io/langgraph/concepts/why-langgraph/
https://github.com/langchain-ai/langgraph