LangGraph - Songwooseok123/Study_Space GitHub Wiki
LangGraph ํน์ง๊ณผ ๊ตฌ์กฐ
LLM ๊ธฐ๋ฐ ๋ค์ค ์์ด์ ํธ ํ์์์ํฌ
ํน์ง
- ์ฌ์ดํด ์ง์
- ๋ ธ๋ ๊ฐ ์๋ฐฉํฅ ์ํต ๊ฐ๋ฅ(์ํ ๊ตฌ์กฐ)
- ์ธ๋ฐํ ์ํฌํ๋ก์ฐ ์์ฑ
- ๋ด์ฅ ์ง์์ฑ
- ์ํ ๋ฐ ํ๋ฆ ์ ๋ฐ ์ ์ด
- Human in the loop
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ:๋ ธ๋์ ๋ ธ๋ ๊ฐ์ ์ฃผ๊ณ ๋ฐ์๋ ์ ์ถ๋ ฅ์ ์ํ๋ ์ ํฌ๊ฐ ์ฒดํฌ๋ฅผ ํ ์ ์์ง๋ง์ด ๊ทธ๋ํ๊ฐ ์ ์ฒด๊ฐ ์คํ์ด ๋์ ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ๋ ์ง์ํด์ ์ ํฌ๊ฐ ๊ทธ๋ค์ ๋ํ์ ์ฐ์ํด์ ์ธ ์ ์๋ค๋ ์
LangGraph ๊ตฌ์กฐ
- ๋ ธ๋
- ์ฃ์ง
- ์์ด์ ํธ: ๋ ธ๋์ ๋ ธ๋ ์ฌ์ด์ ์ด๋ค ์ก์ ์ ์ทจํด์ผ ๋๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ AI
์ถ์ฒ: https://blog.langchain.dev/langgraph-studio-the-first-agent-ide/
- ์์ ๊ทธ๋ฆผ์ langgprph studio์์ ๋ด๊ฐ ์ง ๊ตฌ์กฐ๋ฅผ ์๊ฐํํด์ฃผ๋ ๊ทธ๋ฆผ.
- ํ์ฌ ์์ ์ ํ์ด๋ผ์ดํ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์์
LangGraph ์ฝ๋ ๊ตฌ์ฑ
์ถ์ฒ:https://www.youtube.com/watch?v=p_pOIvXFDXQ
1. ๐ฆ State(์ํ) ์ ์
class State(TypedDict):
messages: Annotated[list, add_messages]
State๋ ๋ ธ๋ ๊ฐ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ (์คํค๋ง)
์ฌ๊ธฐ์๋ messages ๋ฆฌ์คํธ์ ๋ฉ์์ง๋ฅผ ๋์ ์ ์ฅ (add_messages ํ์ฉ)
StateGraph(State)๋ฅผ ํตํด ์ ์ฒด ๊ทธ๋ํ๊ฐ ์ด ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋
2. ๋ ธ๋ ์ ์
llm = ChatAnthropic(model="claude-3.5-sonnet")
def chatbot(state: State):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
๊ฐ ๋ ธ๋๋ State๋ฅผ ๋ฐ์ ๋์ํ๋ ํจ์
LLM ์๋ต์ ๋ฐ์ messages์ ๋ค์ ์ ์ฅ
add_node("๋ ธ๋๋ช ", ํจ์) ํ์์ผ๋ก ๊ทธ๋ํ์ ๋ฑ๋ก
3. ๐ Edge(์ฃ์ง) ๋ฐ Graph ์ ์
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
add_edge(์ถ๋ฐ, ๋์ฐฉ)์ผ๋ก ๋ ธ๋ ๊ฐ ํ๋ฆ์ ์ง์
START, END๋ ๊ทธ๋ํ์ ์์๊ณผ ์ข ๋ฃ ์ง์
compile()๋ก ์คํ ๊ฐ๋ฅํ ๊ทธ๋ํ ๊ฐ์ฒด ์์ฑ
ํต์ฌ ๊ฐ๋ ์ ๋ฆฌ
๊ตฌ์ฑ ์์ | ์ค๋ช |
---|---|
State | ๋
ธ๋ ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ. TypedDict ๊ธฐ๋ฐ |
Node | State ๋ฅผ ์
๋ ฅ๋ฐ์ ์์
ํ, ๊ฒฐ๊ณผ๋ฅผ State ํํ๋ก ๋ฐํํ๋ ํจ์ |
Edge | ๋ ธ๋ ๊ฐ ์ฐ๊ฒฐ. ํ๋ฆ(Flow)์ ๊ตฌ์ฑ |
Graph | ์ ์ฒด ์ํฌํ๋ก์ฐ ์ ์์ฒด. compile() ๋ก ์คํ ๊ฐ๋ฅ ๊ฐ์ฒด๋ก ๋ณํ |
messages | LLM ์๋ต์ด ์ ์ฅ๋๋ ํต์ฌ ๋ฐ์ดํฐ ํ๋ |
LangChain vs LangGraph
์ถ์ฒ: https://www.youtube.com/watch?v=yD3SnuU6Pd8
ํญ๋ชฉ | LangChain | LangGraph |
---|---|---|
์คํ ๊ตฌ์กฐ | ์ฒด์ธ ์ค์ฌ, ์ ํ์ (์ง๋ ฌ) ํ๋ฆ | ์ํ ๊ธฐ๋ฐ, ๊ทธ๋ํ ๊ตฌ์กฐ |
๋ฉ์์ง ํ๋ฆ | ๋จ๋ฐฉํฅ, ๊ณ ์ ๋ ์์ | ๋์ , ์๋ฐฉํฅ |
์ํ ๊ณต์ ๋ฐฉ์ | Chain๋ง๋ค ๊ฐ๋ณ ์ ๋ ฅ/์ถ๋ ฅ | State ๋ฅผ ํตํด ์ ์ฒด ๊ณต์ |
๋ฉํฐํด ์ฒ๋ฆฌ | ์ด๋ ต๊ฑฐ๋ ์๋ ์ฒ๋ฆฌ ํ์ | State ๋์ ์ผ๋ก ์์ฐ์ค๋ฌ์ด ๋ฉํฐํด ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ ์ด ํ๋ฆ | ์ ํ์ , Chain/Tool์ ๋ถ์ฌ์ ๋ถ๊ธฐ ๊ตฌํ(์ด๋ ค์) | ์กฐ๊ฑด๋ถ ๋
ธ๋ ์ ์ด (if/else ๋ผ์ฐํ
์ผ๋ก ๋ถ๊ธฐ ๋ฑ) ์ง๊ด์ ๊ตฌํ |
๋ณต์กํ ์ํฌํ๋ก์ฐ | ์ฝ๋๊ฐ ๋ณต์กํด์ง | ๊ทธ๋ํ ๊ตฌ์กฐ๋ก ์๊ฐ์ ยท๋ ผ๋ฆฌ์ ์ผ๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ฃผ์ ํ์ฉ Scene
LangChain
- RAG ์ธ๋ฑ์ฑ
Document Loader โ Text Splitter โ Embeddings โ VectorStore
- RAG ์์ฑ
Retriever โ Prompt โ Model
- ์์ด์ ํธ ๊ตฌ์ฑ
Prompt โ Model โ Output Parser โ Tools
- ์ ๋ณด ์ถ์ถ
Document Loader โ Prompt โ Model โ Output Parser
Langgraph
Langgraph๋ ๋ ธ๋ ๊ฐ ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ๋ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ํตํด ๋ ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ์ง์:
- ๋จ์ผ ์์ด์ ํธ ๊ธฐ๋ฐ
๊ทธ๋ํ ๋ ธ๋๋ฅผ ํตํด ์์ โ ์์ด์ ํธ โ ์ก์ โ ์ข ๋ฃ ํ๋ฆ ๊ตฌ์ฑ
๋ฉ์์ง ํ๋ฆ์ด ์ํฉ์ ๋ฐ๋ผ ์ ํ ๊ฐ๋ฅ
- ๋ฉํฐ ์์ด์ ํธ ๊ธฐ๋ฐ
์ฌ๋ฌ ์์ด์ ํธ๋ค์ด ํ๋ ฅํ๋ฉฐ ์ํ ์ ํ
์ถ์ฒ:https://www.youtube.com/watch?v=yD3SnuU6Pd8
LangGraph์ Tool Calling ๋ก์ง
์ถ์ฒ: https://www.youtube.com/watch?v=Ubz0XIZpuVY&list=TLPQMjgwNTIwMjXmnOLbEqVMYQ&index=2
- ๊ทผ๋ฐ ํญ์ tool ๋ถ๋ฅด๋๊ฒ ์๋๋ผ, chatbot์ด tool์ ๋ถ๋ฅผ์ง, ๋ณธ์ธ์ด ๋๋ตํ ์ง ํ๋จ -> Conditional edge