LangGraph 조건 엣지
규칙으로 결정되는 분기는 라우팅 함수에 코드 조건으로 작성하고 add_conditional_edges로 등록한다.
고정 엣지의 한계
add_edge로 연결한 엣지는 항상 같은 노드로 이어진다. 값에 따라 다음 노드가 달라져야 하는 경우에는 조건 엣지를 사용한다. 조건 엣지는 노드가 끝난 뒤 라우팅 함수(다음 노드를 선택하는 함수)를 호출하고, 그 반환값을 다음 노드 이름으로 사용한다.
라우팅 함수
from typing import Literal, TypedDict
from langgraph.graph import END, START, StateGraph
class State(TypedDict):
temperature: float
note: str
def route(state: State) -> Literal["alarm", "record"]:
# 상태를 읽고 다음 노드 이름을 돌려준다
if state["temperature"] >= 80:
return "alarm"
return "record"
builder = StateGraph(State)
builder.add_node("read", lambda state: {"note": "측정"})
builder.add_node("alarm", lambda state: {"note": "경보"})
builder.add_node("record", lambda state: {"note": "기록"})
builder.add_edge(START, "read")
builder.add_conditional_edges("read", route)
builder.add_edge("alarm", END)
builder.add_edge("record", END)
graph = builder.compile()
print(graph.invoke({"temperature": 91.5})["note"]) # 경보
True, False처럼 노드 이름이 아닌 값을 반환하는 함수라면 세 번째 인자로 반환값과 노드 이름의 대응을 지정한다.
builder.add_conditional_edges("read", is_hot, {True: "alarm", False: "record"})
코드 조건의 적용 기준
다음 단계를 LLM이 선택하게 할 수도 있으나, 규칙으로 결정되는 분기에는 코드 조건이 더 적합하다.
- 임곗값, 상태 코드, 횟수처럼 기준이 정해진 값인 경우
- 같은 입력이면 항상 같은 경로로 분기해야 하는 경우
- 반복의 종료 조건인 경우. 횟수를 초과하면
END를 반환한다.
LLM의 판단은 텍스트의 의미를 해석해야 결정되는 분기에만 적용한다.