728x90
반응형

어제는 AI Agent가 어떻게 발전해왔는지, CoT → ReAct → Agentic Architecture로 이어지는 흐름을 정리했습니다.

오늘은 실제 에이전트를 구성할 때 중요한 프레임워크인 LangGraph의 핵심 개념과 구조를 살펴보겠습니다.


LangGraph란 무엇인가?

LangGraph는 “상태(State)를 기반으로 한 에이전트의 사고 흐름을 그래프로 표현하는 프레임워크” 입니다.

일반적인 LLM 호출은 다음과 같은 단일 요청-응답 구조입니다:

Input → LLM → Output

하지만 에이전트는 작업을 한 번에 끝내지 않습니다.

계획 → 행동 → 반성 → 반복 의 과정을 거치며 상태가 누적됩니다.

LangGraph는 이 상태 변화 과정을 명확하고 안전하게 표현할 수 있도록

다음의 요소로 구성됩니다:

  • State (현재 기억 / 맥락)
  • Node (행동 단위)
  • Edge (Node 간의 흐름 제어)
  • Reducer (상태를 갱신하는 규칙)

🧱 1. State — 에이전트의 “현재 기억”

State는 에이전트가 지금까지 얻은 정보, 맥락, 중간 산출물이 저장되는 공간입니다.

즉, 에이전트가 어떤 상황에 있는지를 표현하는 작업 기억(Working Memory) 입니다.

LangGraph에서는 State를 표현할 때 두 가지 방식을 사용합니다.

(1) TypedDict 기반 State

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

class State(TypedDict):
    messages: Annotated[list, add_messages]

  • 가벼움, 단순함
  • Python 타입 기반
  • 빠르게 프로토타이핑할 때 유용

(2) Pydantic BaseModel 기반 State

from pydantic import BaseModel, Field
from typing import List

class State(BaseModel):
    messages: List[str] = Field(default_factory=list)

  • 검증(Validation) + 형식 보장
  • API 연동, DB 저장 등 실전 환경에 더 적합

비교 항목 TypedDict Pydantic

사용 목적 빠른 시제품 실무, 안정성
타입 검사 느슨함 엄격함
유효성 검증 없음 자동 검증
권장 시점 학습·실험 단계 제품 단계

정리하자면, 학습 중에는 TypedDict,

실무 적용 단계에서는 Pydantic이 보다 안전합니다.


Reducer — 상태를 어떻게 갱신할 것인가?

State는 매 Node 실행 시마다 새로 교체되는 것이 아니라,

각 Node가 반환한 delta(변경점) 을 기존 상태에 병합(merge) 합니다.

이 병합 규칙을 정하는 것이 Reducer입니다.

예를 들어, messages 라는 상태를 누적하고 싶다면:

messages: Annotated[list, add_messages]

add_messages Reducer는:

기존 리스트 + 새 리스트 → 하나의 리스트로 누적

라는 의미입니다. 일종의 파이썬에서의 extend() 함수 역할이죠!

Reducer 동작 사용 상황

add_messages 리스트에 계속 추가 대화 내용 / reasoning 로그
operator.or_ 딕셔너리 병합 정보 업데이트
operator.add 숫자 / 리스트 덧셈 카운팅 상태

Reducer 덕분에 에이전트는 “기억을 잃지 않고 사고를 이어갈 수 있습니다.”


🔨 Node — 에이전트의 행동 단위

Node는 State를 입력받아, State의 일부를 갱신하는 함수입니다.

def think(state: State):
    result = llm.invoke(state["messages"])
    return {"messages": [result]}

  • Node 하나 = 에이전트의 한 단계 행동
  • 예: 요약하기, 검색하기, 판단하기, 정답 생성하기 등

🔗 3. Edge — Node 간 실행 흐름 제어

Edges는 "어떤 Node 다음에 어떤 Node가 실행되는가" 를 결정합니다.

Edge 유형 설명 예시

순차 Edge A → B 기본 흐름
조건 Edge A → (조건) → B or C 분기 / 종료 결정

LangGraph의 강점은 Loop(순환) 표현이 자연스럽다는 점입니다.

graph.add_edge("think", "think")  # 반복 사고

이런 구조는 Plan → Act → Reflect 같은 에이전트 동작에 매우 적합합니다.


핵심 요약

요소 역할 비유

State 에이전트의 현재 기억 수첩 📒
Reducer 기억을 어떻게 쌓는가 필기 방식 🖊️
Node 단계별 행동 생각 또는 작업 🤔
Edge 다음 행동 결정 흐름 제어 → 루프 🔁

에이전트란, 기억(State)을 기반으로 행동(Node)을 수행하고, 그 결과를 계속 축적(Reducer)하며, 상황에 따라 흐름(Edge)을 조절하는 시스템입니다.

LangGraph는 이 과정을 안전하고 직관적으로 설계할 수 있도록 도와줍니다.

728x90
반응형

+ Recent posts