请稍等 ...
×

采纳答案成功!

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

企业内部rag系统,对话记忆存储的问题

老师好,最近我在开发企业内部的rag问答系统,现在公司的需求是要保存所有用户和人工智能的聊天对话,并且需要有聊天记忆,现在弄的我就不太清楚怎么做,是否要使用这章学的内容用ConversationChain和ConversationBufferMemory,但是要实现长时记忆和永久记忆是不是就要用redis和mysql了。

目前我的想法是每个用户的前10条对话历史存在redis,其余所有对话历史存在mysql,然后将10条对话历史转成字符串嵌入到PromptTemplate里面,加上预设提示词和用户问题一起发给大模型。

还有一种设计是使用ChatPromptTemplate、MessagesPlaceholder、HumanMessage和AIMessage,将10条历史对话记录循环组合HumanMessage和AIMessage,并用消息占位MessagesPlaceholder加入到ChatPromptTemplate中,再发给大模型。

这两种设计是不是可以的?还是说要用其他方式,老师有什么建议呢?

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

1回答

tomiezhang 2025-03-27 03:16:50

您提出的两种方案都是可行的,但我更推荐使用 ChatPromptTemplate 和 MessagesPlaceholder 的第二种方案。这种方法通过 HumanMessage 和 AIMessage 保持对话的结构化格式,对现代大语言模型更友好,能更清晰地区分用户和 AI 角色,也更符合 LangChain 的最佳实践。

存储层面,您的设计思路是合理的:将活跃用户的最近对话(如10条)存储在 Redis 中以提供快速访问,同时将所有历史对话保存到 MySQL 中实现永久存储。Redis 可以使用列表结构,以用户ID为键存储最近的对话,而 MySQL 则需要设计包含用户ID、角色、内容和时间戳等字段的表结构。

在实现上,我建议创建一个自定义的记忆管理器,负责在 Redis 和 MySQL 之间协调数据。当用户发送新消息时,系统会从 Redis 加载最近的对话历史,将其转换为适当的消息格式(HumanMessage/AIMessage),然后通过 MessagesPlaceholder 注入到 ChatPromptTemplate 中。对话完成后,新的交互会被保存到 Redis 和 MySQL 中。

可以考虑实现记忆摘要功能(对较早的对话进行总结)、多级记忆管理(根据时间和重要性区分处理不同的记忆)以及个性化记忆存储。这样的设计既满足了保存所有对话历史的业务需求,又通过只提供最相关的历史给模型来优化性能和提升回答质量。

此外,针对Memory的RAG检索策略可能需要不断调优,比如增加问题重写,来增加命中相关记忆的概率等等,这里有许多的坑要填...


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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