LangGraph StateGraph

코딩다시시작·2025년 8월 7일

langchain_agent

목록 보기
2/2

LangGraph StateGraph 완전 정리

LLM 기반 시스템에서 복잡한 작업 흐름을 상태(State) 기반으로 제어하고, 각 단계를 명시적으로 설계할 수 있게 해주는 구조


1. 개념 요약

용어설명
LangGraphLangChain의 실행 흐름을 상태 기반 그래프로 제어하는 확장 구조
StateGraph상태 전이(State Transition) 기반으로 흐름을 구성하는 메인 구조
State전체 그래프에서 공유되는 데이터, 작업의 현재 스냅샷
Node상태를 입력받아 처리하고 새로운 상태를 반환하는 작업 단위
Edge노드 간 실행 순서 정의, 조건부 분기도 가능
compile그래프를 실행 가능 상태로 전환
invoke초기 상태를 전달하여 그래프를 실행함

2. 기본 실행 흐름

초기 상태 입력
  ↓
START → Node1 → Node2 → ... → END
         (각 노드는 상태를 변형하여 반환)

예:

입력: {"text": "안녕하세요"}
→ Node: text = "반갑습니다"
→ 출력: {"text": "반갑습니다"}

3. 언제 사용하는가?

  • 복잡한 워크플로우를 단계적으로 처리하고자 할 때
  • 각 작업 상태를 추적하거나 명시적으로 관리하고자 할 때
  • 조건 분기, 반복 흐름(feedback loop) 등 제어 구조가 필요한 경우
  • RAG, ReAct, 멀티턴 대화 시스템처럼 상태 기반 처리가 필요한 경우

4. 왜 사용하는가?

  • LLM 체인들이 복잡해지면 흐름 제어가 어렵기 때문
  • 상태(State)를 기반으로 전체 흐름을 가시적이고 제어 가능하게 만들기 위함
  • Agent 시스템, RAG 파이프라인을 논리적으로 분리하고 추적하기 위함

5. 어떻게 사용하는가?

1. 상태(State) 정의

from pydantic import BaseModel

class OverallState(BaseModel):
    text: str

또는 TypedDict로도 정의 가능


2. 노드(Node) 정의

def greet_node(state: OverallState):
    return {"text": "반갑습니다"}

3. 그래프 구성

from langgraph.graph import StateGraph, START, END

builder = StateGraph(OverallState)
builder.add_node("greet", greet_node)
builder.add_edge(START, "greet")
builder.add_edge("greet", END)
graph = builder.compile()

4. 실행

graph.invoke({"text": "안녕하세요"})
# 출력: {"text": "반갑습니다"}

6. 조건부 분기 처리

def decide_next_step(state):
    if state["is_menu_related"]:
        return "search_menu_info"
    return "generate_general_response"

builder.add_conditional_edges(
    "analyze_input",
    decide_next_step,
    {
        "search_menu_info": "search_menu_info",
        "generate_general_response": "generate_general_response"
    }
)

의미: 조건에 따라 실행 경로를 분기시킴 → 의도 분류, 평가-재생성 루프 등에 사용


7. 상태 누적: Reducer 사용

from typing import Annotated, List, TypedDict
from langgraph.graph.message import add_messages

class GraphState(TypedDict):
    messages: Annotated[List[str], add_messages]
  • 기본은 상태 덮어쓰기
  • Annotated[... , add_messages]를 사용하면 메시지 누적 가능

8. 어디에 쓰이는가?

활용 사례적용 위치
RAG검색 → 평가 → 생성 노드 구성
ReAct추론 → 도구 실행 → 재응답 흐름 구성
Self-RAG응답 품질 평가 → 재질문 루프 구성
대화 시스템메시지 누적, 응답 흐름 제어
Adaptive Routing질문 분석 → 라우팅 분기 처리

9. 어떤 가치를 주는가?

  • 구조화된 흐름: LLM 실행 단계를 명시적으로 선언
  • 디버깅 용이: 중간 상태 추적 가능
  • 피드백 루프 구현 가능: 평가 결과에 따라 재실행 여부 판단 가능
  • 모듈화: 각 노드를 개별 함수로 분리 → 재사용 가능
  • 확장성: ReAct, Memory, Subgraph 등으로 확장 가능

10. 장단점 요약

장점단점
흐름이 명확하여 디버깅 쉬움초기 구성 복잡, 진입장벽 존재
상태 기반 처리 가능모든 흐름을 수동으로 지정해야 함
조건, 반복, 병렬 처리 유연노드/엣지가 많아지면 가독성 저하
다양한 에이전트 패턴 구현 가능단순 작업에는 과한 구조

11. 요약

상태 기반 그래프 구조를 통해,
복잡한 LLM 실행 과정을 모듈화하고,
흐름을 분기·제어·반복할 수 있도록 만들어준다.
  • 단일 실행 흐름이 아닌 **상태와 전이(Transition)**에 기반한 설계
  • RAG, 도구 기반 실행, 평가 기반 반복, 멀티턴 대화 등에 유용
profile
gpt로 다시 배우는 개발

0개의 댓글