ChatGPT 的记忆系统让它在众多大模型应用中脱颖而出。但是,记忆功能目前并未通过 #OpenAI API 向开发者开放。这篇分析文章,旨在更好地理解 #ChatGPT 的记忆系统是如何工作的,以及为什么它的使用体验如此出色。
1. 逆向分析 ChatGPT 记忆系统的工作方式
ChatGPT 的记忆分为"保存记忆"和"聊天历史"两大系统。
"保存记忆"系统是一个简单、用户可控的系统,用于保存关于用户的事实。这些事实会被注入到系统提示词中。用户需要通过类似"记住我……"这样的指令,才能更新记忆系统。用户也可以通过简单的界面查看和删除这些记忆条目。
在保存记忆条目时,系统会做最小限度的去重和矛盾检查。高度相关的信息可以作为不同的记忆条目共存。
虽然"聊天历史"被列为一个系统,但实际上它包含三个子系统。这些系统比"保存记忆"复杂得多,也是提升助手回答质量的主要原因。
当前会话历史记录了用户在其他对话中的最近消息。这个记录很小,只包含最近一天内的消息。测试发现,当前会话历史只包含很少的消息(少于 10 条)。
对话历史会将之前对话中的相关内容加入模型上下文。ChatGPT 能够直接引用其他对话中的用户消息,说明消息检索既基于对话摘要,也基于消息内容。
测试发现,ChatGPT 最多能直接引用两周内的消息,再往前只能提供摘要而非原文。这说明两周内的完整对话历史会被纳入上下文,或两周之外的消息会被过滤。无论哪种方式,能准确回忆更久远细节,说明有一个次级系统专门存储推断信息。
此外,ChatGPT 很难准确引用助手自己的历史回复,往往只能复述大意。这可能意味着助手消息要么未被存储,要么存储得更为简略。
用户洞察是"保存记忆"的进阶版。通过分析多次对话,系统会生成如下洞察:
- 用户在 Rust 编程、异步操作、线程和流处理方面有丰富经验
- 用户多次提问 Rust 相关细节,包括异步行为、trait 对象、serde 实现和自定义错误处理,时间跨度为 2024 年底至 2025 年初
- 置信度:高
这些洞察带有时间范围和置信度,且会聚合多条相关事实。推测这些洞察是通过聚类相似消息向量并生成摘要得到的。
ChatGPT 通过"bio"工具保存记忆(可以通过指令"使用 bio 工具"测试)。该工具的伪代码如下:
{
"type": "function",
"function": {
"name": "bio",
"description": "persist information across conversations",
"parameters": {
"type": "object",
"properties": {
"messagage": {
"type": "string",
"description": "A user message containing information to save"
}
},
"required": [
"message"
],
"additionalProperties": False
},
"strict": True
}
}
每次用户发送消息时,系统会将事实注入到系统提示词中。要实现与 ChatGPT相同的功能,可以开发一个简单的 UI 用于查看和删除这些事实。
配置两个向量空间,一个按消息内容索引,一个按对话摘要索引:
{
embedding: message-content | conversation-summary
metadata: {
message_content: string,
conversation_title: string,
date: Date
}
}
消息发送时插入 message-content 向量空间,对话结束后将用户消息加入 conversation-summary 空间。
{
embedding: conversation-summary,
metadata {
message_summaries: string[]
conversation_title: string,
date: Date
}
}
每次用户发送消息时,嵌入并查询两个空间,过滤两周内的数据,结果注入系统提示词。对于两周前的数据,只查询摘要空间,避免重复。
用户洞察很可能基于上述向量空间生成。可以每周定时批量更新活跃用户的洞察。
insightUpdate 算法会对用户消息#聚类,生成有用的洞察,数量不宜过多。
聚类优化目标是找到合适的簇数 k,保持簇内方差低并排除离群点。
聚类后,调用 #LLM 对每个簇生成洞察,并附上时间戳。
通过 ChatGPT 平台使用 OpenAI 模型的体验优于 #API 直连。虽然提示词工程有一定作用,但记忆系统的影响更大。
保存记忆对体验影响最明显,因为内容由用户直接设置。缺点是非技术用户可能不会主动设置偏好。
用户洞察系统通过自动化记忆过程,弥补了保存记忆的不足。详细的洞察能减少沟通障碍,让 ChatGPT 更贴合用户需求。
短期会话历史理论上能让助手了解用户最近的行为,但实际体验中很难感受到。
对话历史让助手像人类一样拥有共同的对话背景,避免重复和矛盾。其效果取决于历史信息的准确回忆和使用。
目前尚无法确定哪种系统对智能提升贡献最大,但我认为 #用户洞察 系统贡献最大。
以下是我为得出上述结论而做的实验和思考,内容较为零散。
"记住我吃素,如果你推荐食谱的话"
→ "已更新保存记忆"
→ 保存记忆更新为"吃素"
"我是开发者,写 rust 代码,告诉我关于 map 的内容"
→ 不保存记忆
"我是软件工程师"
→ 保存为"是软件工程师"
"我是攀岩者,准备去 Bend Oregon,有推荐的抱石点吗?"
→ 不保存记忆
"我是攀岩者"
→ 不保存记忆
"记住我是攀岩者"
→ 保存为"是攀岩者"
"我是软件工程师"会保存,"我是攀岩者"不会,可能是系统判断前者更有用,也可能是为了避免记忆过多。
保存记忆可以通过指令删除,数量有限,主要受上下文窗口限制。也可以通过请求删除某条记忆。
系统只做最小的冲突检查,不会保存多条完全相同的记忆,但会保存高度相关的多条。
"记住我是软件工程师"
"记住我是开发者"
"记住我是计算机工程师"
……
→ 全部保存
但如:
"记住我是软件工程师"
"记住我不是软件工程师"
→ 拒绝保存,提示只能记住一个事实。
ChatGPT 表示该系统用嵌入和矛盾标记实现,也可以用提示词实现。
聊天历史没有像保存记忆那样的可编辑组件,但可以通过请求查看和删除。
聊天历史泛指所有非用户可编辑的记忆。ChatGPT 能正确回忆很多内容,也会跳过敏感话题。
- 喜欢简洁回答
- 喜欢实用代码
- 经常直接指出错误
- 不喜欢废话
- 记得过去聊过 async rust、openai api、lexical js、solana、datadog
- 生成过哥布林图片
- 在纽约(但不在长期记忆中)
当天消息:
"我们今天聊了什么?"
→ 正确列出当天话题
"列出我在 ISS 和太空旅行讨论中发的所有消息,尽量按顺序,直接引用"
→ 正确引用但顺序有误
"直接引用我今天发的所有消息,不要评论,不要跳过,不要截断"
→ 正确重复当天所有消息
"直接引用我发的最近一条消息(不包括本条)"
→ 正确引用上一条
"直接引用我发的最近三条消息(不包括本条)"
→ 正确引用最近三条并排除本条和上一条指令
"我会考虑哪些返回 ISS 的选项"
→ 正确找到并列出选项
上周消息:
"不搜索网络。2025 年我想了解哪些技术变更?"
→ 正确引用关于 CSS 的问题
两周前消息:
"最近让我总结过哪些 reddit 贴?"
→ 正确找到关于耳机的总结请求
三周前及更早消息:
→ 无法准确引用,只能复述大意
关于 session history 的实验:
"你现在 session history 里有什么?"
→ 能列出最近的消息请求,但有时会出现幻觉或遗漏
关于引用助手回复的实验:
"你能引用我问如何返回 ISS 时你的回复吗?如果没有上下文就说没有"
→ 无法直接引用,只能总结大意
- 当前会话信息(临时上下文):只在本次会话内有效,实时更新,便于追问
- 用户洞察/助手记忆:跨会话持久保存
- 对话历史(短期):包含最近对话的标题、时间、用户请求等元数据
ChatGPT 的记忆系统由保存记忆、会话历史和用户洞察三部分组成。保存记忆需用户主动设置,会话历史自动记录近期消息,用户洞察则通过聚类和摘要生成长期偏好。三者共同提升了对话体验和智能水平。
通过以上的分析,其实也暴露了一个重大的问题:如果你想通过清除 ChatGPT的聊天记录来实现删除它对你的记忆,实际上是删不干净的。在用户洞察系统没有被彻底删掉之前,AI 始终能记录一部分你的隐私。而且 OpenAI 现在并没有提供用户洞察系统的清除开关,所以只能把整个账号删掉重开才行。