LangGraph는 LLM 시스템을 그래프(노드 + 흐름 + 상태) 형태로 설계할 수 있게 해주는 도구입니다.
이번 글에서는 LangGraph를 처음 접하는 사람도 이해할 수 있도록
핵심 개념 4가지를 설명 + 코드 예시로 정리했습니다.
노드는 하나의 기능 블록입니다.
예: 문서 검색, 응답 생성, 질문 분석 등
def greet_node(state):
name = state["name"]
return {"message": f"안녕하세요, {name}님!"}
Edge는 어떤 순서로 작업을 실행할지를 정의합니다.
A → B → C 이런 식으로 흐름을 설정해줍니다.
from langgraph.graph import StateGraph
graph = StateGraph(state_type=dict)
graph.add_node("greet", greet_node)
graph.add_node("summary", summary_node)
graph.set_entry_point("greet") # 시작 노드 지정
graph.add_edge("greet", "summary") # greet → summary 연결
모든 노드는 상태(state)를 받아서, 일부를 변경하고, 다음으로 넘깁니다.
상태는 딕셔너리 형태 (dict)로 관리됩니다.
def add_question(state):
q = state["question"]
return {"question": q, "log": [f"질문 입력됨: {q}"]}
app = graph.compile()
result = app.invoke({"question": "보험료는 얼마인가요?"})
Node + Edge + State를 하나로 묶은 것이 Graph입니다.
전체 흐름을 설계하는 “워크플로우 시스템”이라고 보면 돼요.
# 📦 LangGraph에서 그래프를 정의하기 위한 클래스 불러오기
from langgraph.graph import StateGraph
# ✅ greet_node: 사용자의 이름을 받아서 인사 메시지를 생성하는 노드
def greet_node(state):
# 입력된 상태(state) 딕셔너리에서 'name'을 읽고, 인사 메시지를 생성함
return {
"name": state["name"], # 이름 그대로 유지
"message": f"안녕하세요, {state['name']}님!" # 인사 메시지 생성
}
# ✅ summary_node: 기존 메시지에 마무리 문장을 덧붙이는 노드
def summary_node(state):
# greet_node에서 받은 message에 "오늘도 좋은 하루 되세요"를 추가
return {
"message": state["message"] + " 오늘도 좋은 하루 되세요."
}
# ✅ 그래프 빌더 생성: 상태는 dict 타입으로 설정
builder = StateGraph(state_type=dict)
# 🧱 노드 등록: greet_node를 "greet"이라는 이름으로 추가
builder.add_node("greet", greet_node)
# 🧱 노드 등록: summary_node를 "summary"라는 이름으로 추가
builder.add_node("summary", summary_node)
# ▶️ 시작점 설정: 그래프 실행의 시작 노드를 "greet"으로 지정
builder.set_entry_point("greet")
# 🔁 흐름 연결: greet → summary 순으로 실행되도록 연결
builder.add_edge("greet", "summary")
# 🛠 그래프 컴파일: 위에서 정의한 노드들과 흐름을 하나의 실행 가능한 앱으로 컴파일
app = builder.compile()
# 🚀 그래프 실행: 입력값으로 이름을 넘기면 greet → summary 순으로 실행됨
result = app.invoke({"name": "건희"})
# 🖨 최종 결과 출력: message 키의 값을 출력
print(result["message"])
# 출력: 안녕하세요, 건희님! 오늘도 좋은 하루 되세요.
질문이 간단하면 FAQ로, 복잡하면 검색 후 생성으로
→ 이런 흐름도 LangGraph에서는 쉽게 처리할 수 있어요!
# ✅ classify_node: 질문 내용에 따라 질문 타입을 분류하는 함수 (노드)
def classify_node(state):
# 사용자의 질문을 가져옴
q = state["question"]
# 만약 질문에 '얼마'라는 단어가 들어 있다면 → FAQ 처리로 분기
if "얼마" in q:
return "faq"
# 그렇지 않으면 → 복잡한 질문 처리 (RAG 흐름)로 분기
return "rag"
# ✅ 분기 흐름 설정: 'classify' 노드 실행 결과에 따라 다른 노드로 연결함
builder.add_conditional_edges(
"classify", # 🔸 기준 노드 이름: classify 노드를 실행한 후
lambda state: classify_node(state), # 🔸 상태를 기반으로 "faq" 또는 "rag" 중 하나를 리턴
{
"faq": "faq_node", # classify 결과가 "faq"면 → faq_node로 이동
"rag": "search_node" # classify 결과가 "rag"면 → search_node로 이동
}
)
| 개념 | 설명 | 예시 함수 |
|---|---|---|
| Node | 하나의 작업 | def search_node(state) |
| Edge | 작업 연결 흐름 | add_edge("A", "B") |
| State | 실행 중 데이터 저장소 | {"question": "...", "answer": "..."} |
| Graph | 전체 시스템 설계 | builder.compile() |
LangGraph는 복잡한 LLM 워크플로우를
직관적이고 안전하게 설계할 수 있는 강력한 도구입니다.
"LangGraph는 코드로 그리는 LLM 설계도다."