LangGraph의 상태·노드·엣지
상태는 모든 노드가 공통으로 읽는 데이터, 노드는 변경할 키만 반환하는 함수, 엣지는 다음 노드를 결정하는 연결이다.
구성 요소
여러 단계를 하나의 함수에 연속해서 작성하면 어느 단계가 무엇을 변경했는지 불분명해진다. LangGraph는 작업을 상태, 노드, 엣지로 분리하여 그래프로 기술하게 한다.
- 상태(state): 모든 노드가 공통으로 읽는 데이터이다. 일반적으로
TypedDict로 키와 타입을 정의한다. - 노드(node): 상태를 입력받아 작업을 처리하는 함수이다. 변경할 키만 dict로 반환한다.
- 엣지(edge): 한 노드가 끝난 뒤 다음에 실행할 노드를 결정한다.
최소 예제
from typing import TypedDict
from langgraph.graph import END, START, StateGraph
class State(TypedDict):
raw: str
cleaned: str
length: int
def clean(state: State):
# 바꿀 키만 돌려준다
return {"cleaned": state["raw"].strip().lower()}
def measure(state: State):
return {"length": len(state["cleaned"])}
builder = StateGraph(State)
builder.add_node("clean", clean)
builder.add_node("measure", measure)
builder.add_edge(START, "clean")
builder.add_edge("clean", "measure")
builder.add_edge("measure", END)
graph = builder.compile()
print(graph.invoke({"raw": " Pump-A "}))
# {'raw': ' Pump-A ', 'cleaned': 'pump-a', 'length': 6}
예제 해설
START,END: 입력이 전달되는 지점과 실행이 종료되는 지점을 나타내는 특수 노드이다.- 반환한 dict: 같은 키의 값을 덮어쓴다. 값을 병합하려면 해당 키에 reducer(병합 함수)를
Annotated로 지정한다. compile(): 실행 가능한 그래프로 변환한다. 연결되지 않은 노드가 없는지 등 기본 검사도 이 단계에서 이루어진다. compile 전에는 실행할 수 없다.invoke(): 초기 상태를 입력받아 끝까지 실행하고 최종 상태를 반환한다.