5장: 첫 번째 LangGraph 워크플로우 – 단계별 튜토리얼
LangGraph로 첫 워크플로우 만들기 – 실제 적용 단계별 안내
LangGraph는 복잡한 AI 시스템을 효율적으로 설계할 수 있게 도와주는 프레임워크입니다. 이제부터는 LangGraph로 기본 워크플로우를 처음부터 완성하는 과정을 단계적으로 살펴보겠습니다. 예시로, 간단한 챗봇이나 RAG 시스템처럼 입력을 받아 답을 생성하는 흐름을 한눈에 이해할 수 있습니다.
1. 워크플로우 설계 개념 잡기
처음에는 전체 흐름을 머릿속에 그려봅니다. 예를 들어, 유저가 질문을 던지면, 이 질문에 맞는 문서 정보를 찾아(문서 검색), 그리고 해당 정보를 바탕으로 LLM이 대답을 생성하도록 만듭니다. 각각의 작업이 곧 LangGraph의 노드가 됩니다.
2. 상태(State) 구조 정의
LangGraph의 모든 데이터 이동은 상태 객체에 의해 관리됩니다. 사용자 질문, 검색 결과, 생성된 답변 등 주요 정보를 어떤 구조로 담을지 먼저 결정하세요. 보통 딕셔너리 혹은 Pydantic 모델을 활용합니다.
from typing import TypedDict
class GraphState(TypedDict):
question: str
retrieved_docs: list
answer: str
3. 노드(Node) 함수 구현
각 노드는 독립된 작업 단위입니다. 예를 들어, 검색 노드, 생성 노드로 나뉩니다. 각각 현 상태를 받아 새 상태를 반환하는 함수로 만듭니다.
def retrieve_documents(state: GraphState) -> GraphState:
# 예시: 검색 로직을 수행해 document 리스트 가져오기
docs = do_search(state["question"])
state["retrieved_docs"] = docs
return state
def generate_answer(state: GraphState) -> GraphState:
# LLM 또는 챗봇 모델을 통해 답변 생성
answer = call_llm(state["question"], state["retrieved_docs"])
state["answer"] = answer
return state
4. 그래프 구조 설계 및 노드 연결
LangGraph의 핵심은 이 노드들을 단계별로 잇는 것입니다. StateGraph 객체를 생성하고, 각 노드를 추가한 뒤, 순서(엣지)를 정의합니다.
from langgraph.graph import StateGraph, END
workflow = StateGraph(GraphState)
workflow.add_node("retriever", retrieve_documents)
workflow.add_node("generator", generate_answer)
workflow.add_edges({"retriever": "generator", "generator": END})
5. 그래프 실행 및 결과 확인
설계가 끝났다면, 이제 실제로 워크플로우를 실행해봅니다. 초기 상태를 넘기면 정의된 흐름에 따라 각 노드가 순서대로 작업을 수행하게 됩니다.
app = workflow.compile()
result = app.invoke({"question": "달 탐사는 언제 시작됐나요?"})
print(result["answer"])
6. 조건부 로직과 분기 처리
단순 직선 흐름만 가능한 건 아닙니다. 작업 필요에 따라 조건 함수로 분기, 반복, 에러 처리를 자유롭게 결합할 수 있습니다. add_conditional_edges 메서드로 조건에 따라 다음 노드를 지정하세요.
7. 실전 팁
노드가 많아지면 각 과정의 역할을 명확히 분리하십시오. 그리고 상태 객체에 모든 중간 결과를 기록해두면 예기치 않은 상황에도 복구나 디버깅이 쉬워집니다. 현실 업무에서는 API 키, 외부 서비스 연동, 다양한 데이터 구조를 잘 관리하는 것이 중요합니다.
이렇게 LangGraph를 활용하면, 간단한 챗봇에서 복잡한 분기·병렬 처리가 필요한 RAG 시스템까지 다양한 응용 워크플로우를 체계적으로 설계할 수 있습니다. 여러 단계의 작업이 필요할수록, 이처럼 그래프 기반 프레임워크를 활용하는 것이 효율을 크게 높여줍니다.