영속성
영속성 (Persistence)
에이전트가 대화를 이어가거나, 인터럽트 후 재개하거나, 실패에서 복구하거나, 상호작용 간 정보를 기억해야 할 때가 있어요. 영속성(persistence) 은 LangGraph 애플리케이션이 단일 그래프 실행을 넘어 유용한 정보를 유지하게 해 줘요. LangGraph는 두 가지 상호 보완적인 영속성 시스템을 제공해요.
체크포인터와 스토어
- 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를 통한 공유 상태를 쓰는 게 좋아요.