Agent 短期记忆与会话恢复:Thread 和 Checkpointer
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一小节,咱们留下了一个问题:“用户第一次告诉 Agent 的信息,下一次提问时怎样才能继续使用?”
很多同学会觉得,只要使用同一个 agent 对象连续调用两次就可以了。
比如:
await agent.invoke({
messages: [{ role: 'user', content: '订单 A1024 的退款金额是 3000 元。' }]
})
await agent.invoke({
messages: [{ role: 'user', content: '刚才说的是哪个订单?' }]
})
但是,这两次 invoke() 默认是两次独立调用。第二次只提交了“刚才说的是哪个订单”,第一轮的内容并没有再次传入。
也就是说:两次调用使用的虽然是同一个 agent ,模型也并不会因此自动拥有上一轮记忆。
那么怎么办呢?
最简单的办法就是,由 Agent 应用直接读取历史消息,再把整段历史消息重新拼到 messages 里面。
但是,第五章已经学过,LangChain 的 Agent 内部其实是一张 LangGraph。除了 messages,Graph State 中还可能包含任务状态、摘要、上传文件和其他运行数据。
如果每个项目都手动加载、拼接和保存这些 State,代码就会很乱了。
那么,如果想要解决这个问题,就得用到一个东西了,那就是 短期记忆
短期记忆到底是什么
LangChain 把同一个会话中的记忆称为 Short-term Memory,也就是短期记忆。
咱们先用一句话来理解:
短期记忆就是 Agent 在同一个会话中保存并继续使用之前 State 的能力。
比如,用户在售后会话 A 中告诉 Agent:“订单 A1024 的退款金额是 3000 元。”
随后继续追问:“这个金额需要人工审核吗?”
第二句话中没有再次出现订单号和退款金额。
Agent 想要理解“这个金额”指的是什么,就必须继续使用会话 A 前面保存的 State。
但是,如果同一个用户新建了会话 B,再问一遍“这个金额需要人工审核吗”,Agent 默认不应该把会话 A 的订单信息带进来。
所以,所谓的 “短期” 并不是说 “保存的时间短”,而是说 这份记忆的使用范围只在当前会话中
当前会话的状态完全可以在 PostgreSQL(一个数据库) 中保存几个月。只要这份状态仍然只属于当前会话,没有自动共享给其他会话,它依然属于短期记忆。
那么,短期记忆中保存的到底是什么?
最常见的是历史消息,比如:
- HumanMe
本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
