Контрольные точки (чекпоинтеры), долговременная память (хранилище), InMemorySaver, PostgresSaver, Store.
LangGraph предоставляет две системы памяти: контрольные точки для кратковременной памяти в рамках потока и хранилище для долговременной памяти между потоками.
Контрольная точка — снимок состояния графа в определённый момент выполнения. Позволяет продолжить разговор после паузы, восстановиться после сбоя, вернуться к предыдущему состоянию.
Каждый поток выполнения идентифицируется thread_id. При повторном использовании того же thread_id граф загружает последнее сохранённое состояние.
InMemorySaver хранит данные в оперативной памяти — подходит для разработки, но данные теряются при перезапуске. Для продакшена используйте PostgresSaver (PostgreSQL) или SqliteSaver (файловая база).
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver()
graph = builder.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "thread-1"}}
result = graph.invoke(input, config=config)Чекпоинтер передаётся в create_agent. После этого агент сохраняет историю диалога между вызовами с одним thread_id:
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
from langchain_core.utils.uuid import uuid7
agent = create_agent(
model="openai:gpt-4o-mini",
tools=[],
checkpointer=InMemorySaver(),
)
config = {"configurable": {"thread_id": str(uuid7())}}
# Первый вызов — агент запоминает контекст
agent.invoke({"messages": [{"role": "user", "content": "Меня зовут Алексей"}]}, config=config)
# Второй вызов — агент помнит имя
agent.invoke({"messages": [{"role": "user", "content": "Как меня зовут?"}]}, config=config)Длина thread_id для PostgresSaver ограничена 255 символами. InMemorySaver не сохраняет данные между перезапусками. В длинных разговорах контрольные точки накапливаются — удаляйте старые или настройте политику хранения.
Хранилище (Store) persistирует данные вне состояния графа, делая их доступными из разных потоков. Используется для предпочтений пользователя, фактов, общих знаний.
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
graph = builder.compile(checkpointer=checkpointer, store=store)Доступ к хранилищу из узлов — через runtime.store:
from langgraph.runtime import Runtime
def my_node(state: State, runtime: Runtime):
# Чтение
item = runtime.store.get(("user_preferences",), "theme")
# Запись
runtime.store.put(("user_preferences",), "theme", {"value": "dark"})Чекпоинтер хранит снимки состояния графа в рамках одного потока — для истории диалога, прерываний, восстановления после сбоя. Хранилище хранит пользовательские данные между потоками — для предпочтений, фактов, общих знаний. В большинстве приложений используются оба механизма одновременно.
Далее: Управление контекстом