LangGraph Checkpointers

Checkpointer — компонент персистентности: сохраняет снимки состояния графа в хранилище и позволяет восстановить сессию по thread_id после перезапуска. Это фундамент, на котором стоят human-in-the-loop и time-travel.

Суть

Проблема: при остановке/падении workflow всё состояние (история, прогресс) теряется, потому что по умолчанию оно живёт в оперативной памяти. Решение: подключить checkpointer при компиляции графа — он пишет состояние в БД на каждом шаге, и любой запуск с тем же thread_id подхватывает сохранённую историю.

Зачем это нужно

  • Отказоустойчивость: сервер перезапустился — агент продолжает с того же места, а не с нуля.
  • Многопользовательские сессии: thread_id = идентификатор диалога/сессии; каждый пользователь восстанавливается независимо.
  • Включает HITL и Time-Travel: пауза на аппрув (LangGraph HITL) и откат к прошлому чекпоинту (LangGraph Time Travel) возможны только потому, что состояние персистентно.

Как работает

  • Реализации saver'ов: MemorySaver (в памяти — теряется при перезапуске, только для отладки), SqliteSaver, PostgresSaver, RedisSaver, MongoDBSaver.
  • Подключение: graph = builder.compile(checkpointer=checkpointer). Запуск с config={"configurable": {"thread_id": "chat_123"}}.
  • Восстановление: пересобрать граф с тем же checkpointer → aget_state(thread); история — aget_state_history(thread, limit=...).
  • SQLite vs Postgres: SQLite — «детская» БД для разработки (нет конкурентного доступа, блокирует; при многопоточном обращении нужен особый параметр коннектора). В проде меняют connection string на Postgres/Redis — код графа не меняется.

Пример

checkpointer = PostgresSaver.from_conn_string(conn_string)
checkpointer.setup()                                  # инициализация таблиц
graph = builder.compile(checkpointer=checkpointer)

thread = {"configurable": {"thread_id": "chat_123"}}
await graph.ainvoke({"counter": 0}, thread)
# после рестарта сервера состояние есть в БД:
state = await graph.aget_state(thread)                # продолжаем тот же thread_id

Связано с

  • Agent Memory — checkpointer = механизм краткосрочной/сессионной памяти агента
  • Vector Store Persistence — родственная идея: сохранение/перенос состояния между запусками
  • LangGraph HITL — прерывания работают только при наличии checkpointer
  • LangGraph Time Travel — replay/fork по истории чекпоинтов

Открытые вопросы

  • стратегия ретенции/очистки чекпоинтов в проде (рост БД при длинных сессиях)