一直以来都很好奇ChatGPT的记忆功能到底是如何实现的,因为在使用它的过程中,这个记忆的体验确实很好。
正好今天刷到一篇博客,作者逆向拆解了一番,
发现这个记忆系统比想象的要简单许多。
“
链接在此: https://manthanguptaa.in/posts/chatgpt_memory/
先来看下ChatGPT每次收到用户发送的信息的时候的整个上下文结构。
[0]系统指令
[1]开发者指令
[2]会话session的元数据
[3]用户记忆(长期)
[4]最近对话的摘要
[5]当前session的对话记录
[6] 最新发送的消息
会话session的元数据是非常临时性的,并不属于长期记忆,不会永久存储。
这部分的元数据包括了一些设备信息、订阅等级、当地时间、最近使用什么模型等等,
就看上去是一些基本信息。
一个session元数据示例:
用户记忆是长期存储的。ChatGPT 有专门的工具来帮助用户积累存储或者删除记忆。
这部分记忆包括各种:
你的名字
职业生涯目标
背景
学习领域
个人喜好
...
这些记忆不是ChatGPT自己猜是否需要存储,
而是当用户明确说“帮我记住...“或者“存储这部分记忆"时,ChatGPT 才会记住。
当然,这部分的记忆能写入,也能删除。
除了会话session元数据和用户记忆,还有一个部分是近期对话内容总结。
这里并没有采取传统的RAG做法。
传统的RAG有非常大的弊端,
它需要向量化每一个过往的消息、做相似度查询匹配、延迟高、token消耗大。
ChatGPT的做法非常简单,只总结用户发送的消息,直接把总结好的内容注入到上下文中。
按照作者的观察,ChatGPT有15个总结摘要可用,这个摘要一般是下面这种格式:
1. <Timestamp>: <Chat Title>
|||| 用户消息片段1||||
|||| 用户消息片段2||||
最后就是当前session的消息记录。
这部分就是包含了完整的对话消息了,不做任何的总结摘要。
但这里要注意的是,它实质上是一个滑动窗口。
如果这个窗口的上下文已经达到了限制,那旧的消息就会被删去,但是用户记忆和消息历史摘要是保留的。
这样既确保了ChatGPT不会忘记你,也确保了整个对话的连贯性。
最后,总结一下,当我们把消息发送给ChatGPT的时候,会发生什么:
会话开始:元数据注入,包括你的设备,订阅信息,模型使用习惯
每条消息都包含了存储的用户记忆,这样保证了ChatGPT的回答是符合你的喜好的
跨聊天的感知:轻量级的近期对话总结
当前的上下文:使用了一个滑动窗口来保证当前对话的一致性
Token 预算:当Token达到上限之后,旧的消息就会被删去,但是记忆和对话的摘要总结仍然保留。
>/ 作者: Bubble