TypedDict
-
LangGraph가 Annotated를 쓰는 이유 — 덮어쓰기 문제와 리듀서의 등장IT 2026. 6. 29. 22:00
LangGraph 코드를 처음 보면 눈에 걸리는 문법이 있다.class AgentState(TypedDict): messages: Annotated[list[BaseMessage], add_messages]list[BaseMessage]만 써도 될 것 같은데, 왜 Annotated를 끼워 넣고 add_messages를 붙이는 걸까. 이 글은 그 "왜"를 배경부터 따라간다. 이 문법이 등장할 수밖에 없었던 이유, 없었을 때 생기는 문제, 그리고 리듀서라는 개념이 어떻게 그것을 깔끔하게 해결했는지를 순서대로 본다.1. 배경 — 여러 노드가 하나의 상태를 공유한다LangGraph 에이전트는 여러 노드(Python 함수)가 차례로 또는 조건에 따라 실행된다. 이 노드들이 데이터를 주고받는 방식은 함수 인자..
-
LangGraph 자기 수정 패턴의 State 설계 — 루프를 위한 5가지 필드IT 2026. 6. 27. 23:00
LLM 기반 코드를 짜다 보면 어느 순간 "한 번 생성해서 끝내는 게 아니라, 결과물을 검토하고 부족하면 다시 고치는 루프"가 필요해진다. 글쓰기라면 초고를 쓰고 → 편집자가 피드백을 주고 → 그 피드백을 반영해 고쳐 쓰는 과정이다. LangGraph에서 이 구조를 자기 수정 패턴(self-correction loop)이라 부른다.문제는 이 루프를 코드로 옮길 때다. 단순히 while을 돌리면 되는 게 아닌가 싶지만, LangGraph는 그래프 기반 실행 엔진이라 루프의 상태를 State라는 공유 객체에 담아서 노드 간에 넘겨야 한다. 그래서 "어떤 필드를 State에 두어야 루프가 제대로 작동하는가"가 설계의 핵심이 된다. 이 글은 그 5가지 필드를 역할별로 정리한다.자기 수정 패턴이 무엇인가먼저 패턴..
-
LangGraph 상태에 메시지 외 필드 추가하기 — RouterState 설계IT 2026. 6. 26. 23:00
LangGraph의 상태(State)를 처음 배울 때는 messages 필드 하나만 있는 AgentState를 본다. LLM과 주고받는 메시지를 누적하는 용도다. 그런데 실제 워크플로우를 만들다 보면 금세 한계에 부딪힌다. "이 요청이 어느 카테고리인지", "지금 몇 번째 시도인지", "사용자가 인증됐는지" 같은 데이터도 노드 간에 공유해야 하기 때문이다. messages 하나만으로는 이 데이터를 담을 곳이 없다.이 글은 RouterState라는 구체적인 예시를 통해, 상태(State) 클래스에 필드를 추가할 때 어떤 규칙이 적용되는지, 리듀서가 있는 필드와 없는 필드가 어떻게 다르게 동작하는지, 그리고 노드들이 상태의 어느 부분을 읽고 쓰는지를 설명한다.1. 복습: 상태는 노드들의 공유 칠판이전 글에서..