现象

第一轮能答,第二轮直接忘记上下文。代码看起来也调用了 agent,却像每次新会话。

原因

很多 Agent 默认 无持久化。消息历史要跨轮保留,需要:

  1. 配置 checkpointer
  2. 每次 invoke 使用同一 thread_id
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents import create_agent

agent = create_agent(
    model="openai:gpt-4o",
    tools=[],
    checkpointer=InMemorySaver(),
)

config = {"configurable": {"thread_id": "user-42"}}

agent.invoke({"messages": [{"role": "user", "content": "我叫索隆"}]}, config=config)
agent.invoke({"messages": [{"role": "user", "content": "我叫什么?"}]}, config=config)

第二轮能答对,是因为同一 thread 恢复了历史。

分层怎么理解

类型含义手段
短期本线程消息checkpointer + thread_id
长期跨线程偏好/事实外部记忆库/文件/向量库,启动时注入
压缩历史过长摘要中间件或自定义裁剪

InMemorySaver 只适合本地试验。进程一重启就没了。

常见坑

  1. 每次 uuid4() 新 thread_id → 等于永久失忆
  2. 以为 messages 参数传了就够,其实没持久化后端
  3. 把长期记忆和短期历史混在一个大 prompt 里,难维护

结论

多轮记忆是工程问题,不只是模型能力问题。
先保证 checkpointer + 稳定 thread_id,再考虑长期记忆。