LLM을 활용한 서비스가 점점 복잡해지면서, 단순한 프롬프트 → 응답 구조만으로는 해결할 수 없는 흐름들이 등장했다.
예를 들어,
이런 구조를 명확하게 다루기 위해 등장한 것이 바로 LangGraph이다.
LangChain에서 제공하는 LLM 기반 워크플로우를 “그래프” 구조로 선언하고 실행할 수 있는 프레임워크
LangGraph는 상태 기반(Stateful) LLM 애플리케이션을 구축하기 위한 도구다. 복잡한 체이닝 로직이나 멀티 에이전트 협업을 다룰 때 탁월하다.
기존 LangChain은 체이닝 중심이었다면, LangGraph는 워크플로우 제어를 보다 명확하게 정의할 수 있다:
| 기능 | LangChain | LangGraph |
|---|---|---|
| 단순 체인 | O | O |
| 조건 분기 | △ (Custom Logic 필요) | O (Node 전환으로 자연스럽게 가능) |
| 반복 흐름 | X | O (Loop 정의 가능) |
| 멀티 에이전트 협업 | △ | O |
| 명시적 상태 추적 | X | O |
| 요소 | 설명 |
|---|---|
| Graph | 상태 머신 기반으로 구성된 워크플로우 |
| Node (노드) | 하나의 작업 단위 (프롬프트, LLM, Tool 실행 등) |
| Edge (엣지) | 노드 간의 연결, 조건 기반 분기도 가능 |
| State | 현재까지의 대화 및 변수 정보를 포함한 상태 |
| Agent / Tool | LangChain과 동일하게 연동 가능 |
from langgraph.graph import StateGraph, END
from langchain_core.runnables import RunnableLambda
# 각 노드 정의
def step1(state):
print("Step1 실행")
return {"msg": "안녕하세요"}
def step2(state):
print("Step2 실행")
return {"msg": state["msg"] + ", 만나서 반가워요!"}
# 상태 머신 정의
builder = StateGraph()
builder.add_node("hello", RunnableLambda(step1))
builder.add_node("reply", RunnableLambda(step2))
builder.set_entry_point("hello")
builder.add_edge("hello", "reply")
builder.add_edge("reply", END)
graph = builder.compile()
output = graph.invoke({})
print(output) # {"msg": "안녕하세요, 만나서 반가워요!"}
LangGraph의 진가가 드러나는 예시는 Agent 간의 협업이다.
# 예: Research Agent ↔ Writer Agent가 번갈아 작업하는 루프 구성
# - research → writing → feedback → research ...
이런 복잡한 플로우는 Graph로 선언하면 자연스럽게 구성할 수 있다.
| 사용 사례 | 설명 |
|---|---|
| 프로젝트 매니저 봇 | 기획자 ↔ 디자이너 ↔ 개발자 역할의 멀티 에이전트 순환 |
| 기술 문서 작성 | 요약 → 보완 → 평가 → 보완 → 완료 등의 루프 |
| 복잡한 사용자 응답 처리 | 조건 분기 및 실패시 대안 루트 제공 |
| RAG + 후처리 파이프라인 | 검색 → 필터링 → 요약 → 문장화 체인 연결 |
LangGraph는 복잡한 LLM 기반 로직을 직관적으로 설계하고, 안정적으로 실행할 수 있는 고급 도구다.
단순 체인 구조에서 벗어나, 진짜 “앱” 다운 동작을 만들고 싶다면 LangGraph는 가장 강력한 도구 중 하나가 될 것이다.