LangGraph

LangGraph 7강

[영속성] 체크포인터 & 메모리

지금까지의 그래프는 실행이 끝나면 상태를 잊는다. 체크포인터(checkpointer)를 붙이면 매 단계 State가 저장되고, thread_id로 같은 대화를 다시 이어갈 수 있다. 이것이 LangGraph 메모리의 정체다. 이 영속성은 단순 대화 기억뿐 아니라 사람 개입(8강)·타임 트래블(11강)의 토대가 된다.

LangGraph 7강 구성도

이 강의 목표는 체크포인터로 대화를 기억하는 그래프를 만드는 것이다.

1. 체크포인터 붙이기

compile에 체크포인터를 넘기면 끝이다.

from langgraph.checkpoint.memory import MemorySaver
app = g.compile(checkpointer=MemorySaver())

2. thread_id 로 대화 잇기

실행 때 configurable.thread_id를 주면, 같은 값이면 이전 상태를 복원해 이어간다.

cfg = {"configurable": {"thread_id": "user-1"}}
app.invoke({"messages": [("user", "내 이름은 리야")]}, cfg)
r = app.invoke({"messages": [("user", "내 이름 뭐였지?")]}, cfg)
print(r["messages"][-1].content)   # "리"라고 기억한다

thread_id를 바꾸면 완전히 새로운 대화가 시작된다. 여러 사용자를 thread_id로 격리한다.

3. 체크포인터 종류

체크포인터 용도
MemorySaver 인메모리, 실험·테스트용
SqliteSaver 로컬 파일(SQLite) 영속
PostgresSaver 운영 환경 영속 저장
Async 계열 async 그래프용 비동기 버전

핵심 명령·용어

이름 뜻
checkpointer 상태 저장기
thread_id 대화 세션 식별자
MemorySaver 인메모리 체크포인터
configurable 실행별 설정 dict

예제

# 운영: Postgres 로 영속 저장
from langgraph.checkpoint.postgres import PostgresSaver
with PostgresSaver.from_conn_string("postgresql://...") as cp:
    cp.setup()
    app = g.compile(checkpointer=cp)
    app.invoke(inp, {"configurable": {"thread_id": "u1"}})

해설) 체크포인터만 바꾸면 같은 그래프가 실험에서 운영으로 넘어간다. thread_id 설계(사용자별·세션별)가 멀티유저 서비스의 핵심이다.

댓글 0