영속성

영속성 (Persistence)

에이전트가 대화를 이어가거나, 인터럽트 후 재개하거나, 실패에서 복구하거나, 상호작용 간 정보를 기억해야 할 때가 있어요. 영속성(persistence) 은 LangGraph 애플리케이션이 단일 그래프 실행을 넘어 유용한 정보를 유지하게 해 줘요. LangGraph는 두 가지 상호 보완적인 영속성 시스템을 제공해요.

출처: LangChain 공식 문서 — Persistence

체크포인터와 스토어

  • Checkpointers: 스레드의 그래프 상태를 체크포인트로 영속화해요. 짧은 기간, 스레드 범위 메모리(대화 연속성, 휴먼-인-더-루프, 타임트래블, 장애 복구)에 써요.
  • Stores: 그래프 상태 밖에 애플리케이션이 정의한 데이터를 영속화해요. 장기간, 스레드 간 메모리(사용자 선호, 사실, 공유 지식)에 써요.

대부분의 애플리케이션은 둘 다 쓸 수 있어요. 하나의 체크포인터가 현재 스레드를 추적하고, 하나의 스토어가 스레드를 넘어 지속되는 정보를 추적해요.

퀵스타트

그래프를 컴파일할 때 체크포인터와 스토어를 지정해요.

from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore

checkpointer = InMemorySaver()
store = InMemoryStore()

graph = builder.compile(checkpointer=checkpointer, store=store)

result = graph.invoke(
    {"messages": [{"role": "user", "content": "Hi, my name is Bob."}]},
    {"configurable": {"thread_id": "thread-1"}},
)

체크포인터 vs 스토어

체크포인터 스토어
영속화 그래프 상태 스냅샷 애플리케이션 정의 키-값 데이터
범위 단일 스레드 스레드 간
메모리 유형 단기·스레드 범위 메모리 장기·스레드 간 메모리
용도 대화 연속성, 휴먼-인-더-루프, 타임트래블, 장애 복구 사용자 선호, 사실, 공유 지식
접근 패턴 그래프 config에 thread_id 전달 노드나 애플리케이션 코드에서 항목 읽기·쓰기

자주 겪는 문제와 해결

  • MemorySaver 는 재시작 후 유지되지 않아요: InMemorySaver 는 체크포인트를 RAM에 저장해서 프로세스가 재시작되면 전부 사라져요. 프로덕션에서는 PostgresSaver(PostgreSQL)나 SqliteSaver(개발용 파일 기반) 같은 영속 체크포인터를 써요.
  • 체크포인트가 무한정 늘어나요: 긴 대화에서는 체크포인트가 누적돼 지연·저장 비용이 늘 수 있어요. PostgresSaver 로 주기적으로 옛 체크포인트를 정리하거나 보존 정책을 세워요.
  • thread_id 가 너무 길어요: PostgresSaver 사용 시 thread_id 를 255자 미만으로 유지해요. 결정적 ID가 필요하면 UUID나 해시를 써요.
  • 부모 그래프에서 서브그래프 상태 접근: 서브그래프는 각자 체크포인트 네임스페이스를 관리하므로, 부모 그래프가 갱신을 즉시 못 볼 수 있어요. 그래프 경계를 넘는 데이터는 Store를 통한 공유 상태를 쓰는 게 좋아요.

더 알아보기