Суть
Проблема: при остановке/падении 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 по истории чекпоинтов
Открытые вопросы
- стратегия ретенции/очистки чекпоинтов в проде (рост БД при длинных сессиях)