106. LangGraph: 상태 유지 에이전트 워크플로우 (Stateful Agent Workflows)
요약
LangGraph를 사용하여 선형적인 LangChain 체인을 넘어 복잡한 상태 유지 에이전트 워크플로우를 구축하는 방법을 설명합니다. 유향 그래프 모델링을 통해 조건부 분기, 루프, 체크포인팅 및 Human-in-the-loop 기능을 구현할 수 있습니다.
핵심 포인트
- LangGraph는 에이전트 워크플로우를 유향 그래프로 모델링함
- 상태(State)를 유지하며 복잡한 조건부 로직과 루프 구현 가능
- 체크포인팅을 통해 작업의 일시 중지 및 재개 지원
- Human-in-the-loop 패턴으로 인간의 승인 단계 삽입 가능
- 병렬 실행 및 디버깅이 용이한 구조 제공
LangChain 체인은 한 방향으로 흐릅니다. 입력이 들어오고, 출력이 나가면 끝입니다.
실제 에이전트 워크플로우 (Agent workflows)는 선형적이지 않습니다. 계획을 수정해야 할 수도 있습니다. 검색 결과가 비어 있어 다른 접근 방식이 필요할 수도 있습니다. 코드 리뷰가 실패하여 수정을 위해 작업을 다시 되돌려 보낼 수도 있습니다. 작업은 어떤 종류의 입력을 받느냐에 따라 다르게 분기되어야 할 수도 있습니다.
LangGraph는 에이전트 워크플로우를 유향 그래프 (Directed graphs)로 모델링합니다. 노드 (Nodes)는 작업 (Actions)이며, 엣지 (Edges)는 조건부 전이 (Conditional transitions)입니다. 에이전트의 상태 (State)는 그래프를 통해 흐르며, 각 단계에서 발견한 내용에 따라 서로 다른 경로를 택합니다.
그 결과: 스파게티 코드 (Spaghetti code)가 되지 않으면서도, 조사 가능하고, 디버깅 가능하며, 어떤 노드에서든 재개할 수 있고, 복잡한 조건부 로직을 수행할 수 있는 에이전트 워크플로우를 얻을 수 있습니다.
LangGraph가 LangChain에 추가하는 것
print("LangGraph: What It Adds")
print()
print("LangChain gives you: components (LLMs, retrievers, tools)")
...
핵심 개념 (Core Concepts)
import os
import json
from typing import TypedDict, Annotated, List, Optional, Literal
...
최소 예제: 의도 라우터 (Intent Router)
class RouterState(TypedDict):
user_input: str
intent: str
...
루프가 포함된 다단계 에이전트 (Multi-Step Agent with Loops)
class ResearchState(TypedDict):
topic: str
search_queries: List[str]
...
체크포인팅 (Checkpointing): 일시 중지 및 재개
print("\nLangGraph Checkpointing: Pause and Resume Any State")
print()
...
휴먼 인 더 루프 (Human-in-the-Loop)
print("\nHuman-in-the-Loop: Pause for Human Approval")
print()
...
병렬 분기 (Parallel Branches)
print("\nParallel Execution in LangGraph")
print()
...
참조 링크 (Reference Links)
print("\nLangGraph Reference Links:")
print()
...
직접 해보기
langgraph_practice.py 파일을 생성하세요.
파트 1: 이 포스트의 의도 라우터 (Intent router)를 구축하세요. 여기에 "translation"과 "summarization"이라는 두 가지 의도를 더 추가하여 확장하세요. 적절한 핸들러 노드 (Handler nodes)를 추가하세요. 10가지의 서로 다른 입력으로 테스트하여 라우팅이 올바른지 확인하세요.
파트 2: 수정 루프 (revision loop)를 포함한 워크플로우 구축하기. 다음과 같은 동작을 수행하는 글쓰기 에이전트 (writing agent)를 만드세요: 콘텐츠 생성 → 가독성 평가 → 점수가 임계값 (threshold) 미만일 경우 수정 → 최대 3회까지 반복. 상태 (state)에 반복 횟수 (iteration count)를 기록하세요. 반복이 진행됨에 따라 품질이 향상되나요?
파트 3: 체크포인팅 (checkpointing) 추가하기. MemorySaver()를 사용하여 그래프를 컴파일하세요. 워크플로우를 중간에 실행하고, app.get_state()를 사용하여 체크포인트 상태를 검사하세요. 상태의 필드 하나를 수정한 후 app.invoke(None, config=thread_config)로 재개하세요. 수정된 상태가 사용되는지 확인하세요.
파트 4: 병렬 브랜치 (parallel branches). 글의 세 가지 서로 다른 버전 (격식 있는 버전, 캐주얼한 버전, 기술적인 버전)을 동시에 생성한 다음, 이를 하나의 최종 버전으로 합성하는 그래프를 구축하세요. 병렬 실행과 순차 실행의 시간을 측정해 보세요.
다음 단계
이제 복잡한 상태 유지 에이전트 워크플로우 (stateful agent workflows)를 구축할 수 있습니다. 다음 포스트는 페이즈 10 (Phase 10) 캡스톤 프로젝트입니다: 101번부터 106번 포스트까지의 모든 내용을 사용하여 계획, 검색, 작성, 검토 및 보고서 발행을 자율적으로 수행하는 완전한 자율 연구 보조원 (autonomous research assistant)을 구축합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기