前沿重器[67] | 北邮腾讯MemoryOS:分层记忆模式解决大模型长记忆问题(上)

大模型向量数据库机器学习

前沿重器

栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经是20年的事了!)

2024年文章合集最新发布!在这里:再添近20万字-CS的陋室2024年文章合集更新

往期回顾

在之前的大模型多轮的文章里有谈过在长对话下大模型存在遗忘问题(心法利器[131] | 盘点踩过大模型多轮对话的坑),这次为大家分享的是最近北邮腾讯联合出品的MemoryOS,利用分层存储解决了这种长记忆记忆问题,全篇通读下来,公式推理不多,但感觉很多细节都很有借鉴价值,信息的分层拆解、中长期记忆的构造、Prompt思路、RAG思路干预对话内容、Agent化设计等,请听我来讲解。

这篇文章我会分上下两篇,上篇聚焦论文,下一篇聚焦他的开源代码。关键链接如下。

开篇补充说一下,本打算讲一讲比较经典的论文MemoryBank(https://arxiv.org/pdf/2305.10250.pdf),不过考虑到MemoryOS已经足够体现我想在MemoryBank的问题,所以我就不重复说了,不过我还是建议大家去看看,里面的分析、综述和设计还是很有价值的。

背景

还是复述一下背景,大模型虽然具有很强的理解和文本生成能力,但是在多轮对话层面,还是会有很多问题,尤其是长对话信息的保存,一旦对话长,很多信息就容易丢失,造成对话的不连贯、某些信息的断层。

其实这个问题并不新鲜,早在这篇文章里:前沿重器[25] | 聊聊对话系统:多轮对话,我就详细讲过,一般都是需要很完整完善的对话管理模块,专门把这个信息管理起来才行,里面有完整的对话状态跟踪、对话流程决策,同时也有检索式多轮、生成式多轮的研究。(PS:我曾经比较完整地聊过对话系统的结构以及有关技术,虽说现在大模型版本下很多技术都有了更新和变化,但是最终似乎都会收敛到这套思路下,非常建议大家参考:前沿重器[21-25] | 合集:两万字聊对话系统

在这篇文章里,作者给出的同样是一套完整的方案,这里的关键词是,分层存储和动态更新。分层存储是指对对话过程的信息,按照短期、中期、长期来分别维护,动态更新则很好理解,就是在对话过程中进行实时更新,按需调取。之所以敢称为OS,是因为他确实是一个涵盖分层存储、动态更新、自适应检索和上下文生成的完整方案,说白了借助他便可快速构造对话系统。

详细方案

直接上图,非常清楚。

picture.image

MemoryOS

整个系统主要分为4个部分:记忆存储、记忆更新、记忆检索、响应生成。

  • 记忆存储(Memory Storage):分三层组织构建记忆信息:短期记忆(STM)用于及时对话,中期记忆(MTM)用于重复话题的总结,长期个人记忆(LPM)用于用户偏好,确保记忆的完整性和有效利用。
  • 记忆更新(Memory Updating):该模块管理动态记忆刷新,通过对话链先进先出(FIFO)方式从 STM 到 MTM 的更新,以及使用分段分页策略和基于热度的替换从 MTM 到 LPM 的更新。
  • 记忆检索(Memory Retrieval):该模块通过特定查询检索相关记忆,首先通过语义相关性识别段落,然后检索相关的对话页面。最后,它将 LPM 中的个人属性和 STM 中的上下文信息结合起来生成响应,整合所有相关记忆以生成响应。
  • 响应生成(Response Generation):处理数据并生成适当的响应。它将从 STM、MTM 和 LPM 中检索到的结果整合到一个连贯的提示中,从而生成上下文连贯和个性化的响应。

记忆存储

这里是3个子模块,短期记忆、中期记忆、长期记忆。

短期记忆(STM)以“一轮”为一个“Page”记忆单元,包括本轮用户提问(Q)、模型响应(R)和时间戳(T),而为了跟踪这个记忆单元在整个对话内的信息,通常还需要一些记录对话的额外信息,一般是对话ID、用户ID等信息,而关键的是还会有一些大模型分析的信息,例如这一轮对话和上文的连贯性信息,这里组成了metapage。

中期记忆(MTM)关注的是一个片段,具有相同话题的片段。此处使用语义和字面相似度来衡量段落和话题片段之间的相似度,大家可以参考。

长期记忆(LPM)记录的是重要的个人细节和特征,甚至可能是跨对话的,这里既有用户的,也有AI助手的,都包含。

  • 用户:记录静态的固定属性,年龄性别姓名等,也有动态更新的用户数据库,包括个人的习惯、兴趣等。
  • AI助手:固定的个人角色信息,包括性别,这个来源会比较多,可以是互动过程中的设置,也可以是用户自定义的,在对话里面约束的等等。

记忆更新

存储模块关注的是里面可以存什么,以及以什么结构存,更新的只关注的是怎么处罚、怎么抽取以及怎么存入。这里其实就两条机制,STM到MTM、MTM到LPM。

STM的结构很简单,就是一条队列,即先进先出。从上文可知,STM内部就是最朴素原始的对话,他是队列形式,当对话足够长,超出了队列,最老的那一轮内容就会出来,进入MTM。

STM中的老对话被扔入MTM,会涉及两个工作,一个是段落的删除,一个是段落到LPM。这里需要评估一个段落的热度,热度用于评估这个段落的价值,当这个段落价值下降到一定程度且MTM达到数量上限,就会被扔掉(说白了就是末位淘汰)。热度的评价公式如下。

热度是3个因素分别的加权求和,对应3个因素是被检索次数、段落内的轮数和时间衰减系数。

对MTM中,热度超过一定阈值的段落,就会进入LPM。这些信息会被整合进入MTM中,根据上文给出的用户、AI助手的结构。此处构造了90多个维度的个性化用户特征,分为三个类别:基本需求与个性、与AI的对齐维度以及内容平台兴趣标签,这些信息可以从新进入的段落中提取。此处出于严谨此处还有退出机制,当标签数量过多时,会采取先进先出的策略,而新出的内容,会把上述的Linteration置位0,段落热度瞬间下降,从而确保整个系统信息的新鲜度。

记忆检索

检索的时候,便是这3个记忆模块都会去检索。

STM的检索还是比较简单的,直接用最近的上下文即可。

MTM分两阶段,首先通过前文提及的Fscore获取最相关的片段,然后从片段找出语义最相关的K轮对话,另外别忘了更新visit和recency的数值。

LPM则是对用户数据库和AI助手库分别检索出前10个相关信息作为背景知识。

响应生成模块

将本轮用户的提问、上述检索到的内容以及各种辅助信息,经过整合(prompt)输入到大模型中,完成最终回复的生成。

小结

这篇论文的思路我挺欣赏的,具有较强的使用参考意义,能记忆通过可解释的方式进行拆解,并进行分别处理,这对很多需要多轮对话、深入了解用户信息才能回复的场景,都具有很强的价值,同时也具有很好的可拓展性,整个记忆模块的信息除了可以来源于对话,还可以来源于外界,在LPM中可以快速增补,例如一些对话式推荐的场景,可以加入用户的历史购买记录等,另外,信息的筛选思路也比较朴素,可以作为一个比较强的baseline了。

然而可惜的是,论文里不少细节都没有讲,例如这个向量召回,就讲的比较模糊,显然这里很多召回都是不对称的,这个向量模型是如何构造、训练的并没有讲明白,工程层面这些记忆内容又是如何做的也没有体现,实在比较可惜。

下一篇文章,我将会详细讲讲这篇论文对应的开源项目:https://github.com/BAI-LAB/MemoryOS,敬请期待。

picture.image

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论