现象
第一轮能答,第二轮直接忘记上下文。代码看起来也调用了 agent,却像每次新会话。
原因
很多 Agent 默认 无持久化。消息历史要跨轮保留,需要:
- 配置 checkpointer
- 每次 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 只适合本地试验。进程一重启就没了。
常见坑
- 每次
uuid4()新 thread_id → 等于永久失忆 - 以为
messages参数传了就够,其实没持久化后端 - 把长期记忆和短期历史混在一个大 prompt 里,难维护
结论
多轮记忆是工程问题,不只是模型能力问题。
先保证 checkpointer + 稳定 thread_id,再考虑长期记忆。