请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

聊天履历和state需要分别存储吗

老师好。
在使用 MongoSaver 或者 PostgresSaver 时,会话履历一直是保存在 state 中的。

因为state会持久化存储到数据库,所以再打开之前的会话,可以根据 thread_id 从 snapshot 中获取到当时的 state,遍历 messages 便可以获取聊天履历。

如果使用总结技术优化记忆的话,state 中的履历就会被删除和更新,就不能再直接通过 graph 的 snapshot 获取之前的履历了。在这种情况下,需要单独再管理一份聊天履历用于用户查看吗?这种情况的最佳实践是什么?

正在回答 回答被采纳积分+3

1回答

tomiezhang 2025-04-18 21:41:31

你的理解是正确的,这也是构建一般的chatbot常见的一个问题,即对话记录的完整性,与memroy上下文窗口长度限制。一般的话需要你在类似PostgresSaver中全量存储所有的对话记录,然后增加摘要节点,并在state中增加类似state['summary']的节点进行过往历史记录摘要,将摘要也要存储进PostgresSQL中,关键在于对于存储的message要打上清晰的标记,这样在UI界面进行历史记录展示的时候,可以选择忽略掉summary标记的消息即可。

0 回复 有任何疑惑可以回复我~
  • 提问者 abulaka #1
    谢谢老师。
    再问一下。
    
    因为启用 PostgresSaver 以后,state 是被 langgraph 来管理的,会自动把 state 存储至 postgresql。
    
    在 state 中增加类似 state['summary'] 的节点进行过往历史记录摘要也没问题。但是既然要减少上下文长度,肯定需要对 state['messages'] 进行裁剪,model.invoke 函数接收的参数应该也是裁剪后的 state['messages'] 。那我用于 UI 界面展示的历史记录,是不是只能自己在自己的表里保存一份,而不能借助于 PostgresSaver 管理的表?
    或者说,在进行历史摘要时,我应该通过重放获取用于 UI 界面展示的历史记录呢?还是通过自定义 table 保存历史记录?
    回复 有任何疑惑可以回复我~ 2025-04-21 08:31:25
  • tomiezhang 回复 提问者 abulaka #2
    你肯定要有一份完整的原始记录在单独的表中,在摘要的时候只读不存
    回复 有任何疑惑可以回复我~ 2025-04-21 13:06:23
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号