LangChain的摘要记忆组件和实体记忆组件

80 阅读3分钟

摘要记忆组件

在 LangChain 中使用缓冲记忆组件要不就保存所有信息(占用过多容量),要不就保留最近的记忆信息(丢失太多重要信息),那么有没有一种情况是既要又要呢?

所以折中方案就出现了——保留关键信息(重点记忆),移除冗余噪音(流水式信息)。

在 LangChain 中 摘要记忆组件 就是一种折中的方案,内置封装的 摘要记忆组件 有以下几种。

ConversationSummaryMemory

摘要总结记忆组件,将传递的历史对话记录总结成摘要进行保存(底层使用 LLM 大语言模型进行总结) ,使用时填充的记忆为 摘要,并非对话数据。这种策略融合了记忆质量和容量的考量,只保留最核心的语义信息,有效减少了冗余,同时质量更高。

ConversationSummaryBufferMemory

摘要缓冲混合记忆,在不超过 max_token_limit 的限制下,保存对话历史数据,对于超过的部分,进行信息的提取与总结(底层使用 LLM 大语言模型进行总结),兼顾了精确的短期记忆与模糊的长期记忆。

使用注意事项

ConversationSummaryBufferMemory 会将汇总摘要的部分默认设置为 system 角色,创建系统角色信息,而其他消息则正常显示,传递的消息列表就变成:[systemsystemhumanaihumanaihuman]。

但是部分聊天模型是不支持传递多个角色为 System 的消息,并且在 langchain_community 中集成的模型并没有对多个 System 进行集中合并封装(Chat Model 未更新同步),如果直接使用可能会出现报错。

而且绝大部分聊天模型在传递历史信息时,传递的信息必须是信息组,也就是 1 条 Human 消息 + 1 条 AI 消息这种格式。

所以在使用 ConversationSummaryMemory 这种类型的记忆组件时,需要检查对应的模型传递的 messages 的规则,以及 LangChain 是否对特定的模型封装进行了更新。

除此之外,在某些极端的场合下,例如第一条提问回复内容比较短,第二条提问内容比较长,ConversationSummaryMemory 执行两次 Token 长度计算,如果不异步执行任务,对话速度会变得非常慢。

实体记忆组件(用的极其少)

实体记忆指的是跟踪对话中提到的实体,并且在对话中记住关于特定实体的既定事实,它提取关于实体的信息(使用LLM),并随着时间的推移建立对该实体的知识(使用LLM),一般使用实体记忆来存储和查询对话中引用的各种信息,比如人物、地点、事件等。

在 LangChain 内部封装了一个实体记忆类 ConversationEntityMemory,这个类可以从对话历史中提取实体并生成描述(简单来讲,就是提取关键词+对应的描述),不过 ConversationEntityMemory 预设的 Prompt 过于笨重,而且极度消耗 Token,并且对大模型的要求极高,所以实用度并不高。