LangGraph
함수들을 그래프처럼 연결해서 실행순서를 관리해주는 프레임워크
함수들을 화살표로 연결한 것과 같다.
LangGraph가 없다면 RAG를 직접만들때 점점 복잡해질경우 각 함수들을 연결하고, Tool이 추가되면 if문, while문, for문이 범벅이 될것이다 .코드를 if문으로 연결하지말고, 함수들을 연결하자 라는 아이디어. noce는 함수 하나이고 edge는 다음에 어떤 함수를 실행할지를 연결하는 화살표라고 이해하자. stateGraph는 이를 합친것이나 다름없다. 모든 함수가 같은 state를 공유한다.
StateGraph
현재 상태(State)를 가지고 여러 작업(Node)을 연결하여 실행하는 실행 엔진
LangGraph에서 여러 노드(Node)가 하나의 상태(State)를 공유하며 작업을 수행하도록 만드는 워크플로우 그래프
LangGraph의 StateGraph는 세 요소로 구성된다 .
워크플로우가 공유하는 데이터 State상태, 상태를 읽고 일부를 채우는 함수 Node노드, 노드 간 실행 순서 Edge 엣지
class State(TypedDict):
question: str
docs: list
answer: str
def search(state):
state["docs"] = ["문서1", "문서2"]
return state
def llm(state):
state["answer"] = "답변"
return state
graph = StateGraph(State)
graph.add_node("search", search)
graph.add_node("llm", llm)
graph.add_edge("search", "llm")
graph.set_entry_point("search")
graph.set_finish_point("llm")
app = graph.compile()
app.invoke({
"question": "MCP란?"
})
State
일반 함수는 result로 결과를 반환하지만 LLM 애플리케이션은 사용자질문, 이전대화, 검색결과, tool실행결과, 최종답변 등 여러정보를 계속 이어받아야함으로 하나의 공유 상태 State를 사용한다 .노드는 이 state를 읽고 수정한다.각 노드는 State를 받아 처리하고 State를 반환하며 Nodes를 거치며 State는 점점 완성형으로 바뀌게된다 .
state = {
"question": "...",
"documents": [...],
"answer": "...",
"messages": [...]
}
그렇다면 그냥 함수를 호출하면 되는게 아닌가?
간단할령우 사실 langgraph가 필요가없다. langgraph는 agent를 만들때 llm과 tool을 반복연결 loop를 시킬때 유용하다 .
조건문, 반복문은 원래도 만들수있으나 노드추가교체가 쉽고 체계적으로 관리하기 쉽기에 사용한다는 것을 이해하자.