一、概述
当我问ChatGPT它还记得我什么时,它列出了33个事实,从我的名字和职业目标到我目前的健身程序。但它实际上是如何存储和检索这些信息的?为什么感觉如此无缝?
经过广泛的实验,我发现ChatGPT的记忆系统比我预期的要简单得多。没有矢量数据库。对话历史记录没有RAG。相反,它使用四个不同的层:适应您环境的会话元数据、长期存储的明确事实、最近聊天的轻量级摘要以及您当前对话的滑动窗口。
这篇文章准确地分析了每个层的工作原理,以及为什么这种方法可能优于传统检索系统。这里的一切都通过分析ChatGPT对话所得,不是来自OpenAI官方消息。
二、ChatGPT的上下文结构
在了解大模型记忆之前,了解ChatGPT收到的每条消息的整个上下文很重要。结构看起来像这样:
[0] System Instructions
[1] Developer Instructions
[2] Session Metadata (ephemeral)
[3] User Memory (long-term facts)
[4] Recent Conversations Summary (past chats, titles + snippets)
[5] Current Session Messages (this chat)
[6] Your latest message
前两个组成部分定义了高级行为和安全规则。他们不是这篇文章的重点。有趣的部分从会话元数据开始。
三、会话元数据
这些细节在会话开始时注入一次。它们不是永久储存的,也不会成为长期记忆的一部分。这个区块包括:
- 设备类型(桌面/移动)
- 浏览器+用户代理
- 大致位置/时区
- 订阅级别
- 使用模式和活动频率
- 近期模型使用分布
- 屏幕尺寸、黑暗模式状态、JS启用等。
数据的示例是:
Session Metadata:
- User subscription: ChatGPT Go
- Device: Desktop browser
- Browser user-agent: Chrome on macOS (Intel)
- Approximate location: India (may be VPN)
- Local time: ~16:00
- Account age: ~157 weeks
- Recent activity:
- Active 1 day in the last 1
- Active 5 days in the last 7
- Active 18 days in the last 30
- Conversation patterns:
- Average conversation depth: ~14.8 messages
- Average user message length: ~4057 characters
- Model usage distribution:
* 5% gpt-5.1
* 49% gpt-5
* 17% gpt-4o
* 6% gpt-5-a-t-mini
* etc.
- Device environment:
- JS enabled
- Dark mode enabled
- Screen size: 900×1440
- Page viewport: 812×1440
- Device pixel ratio: 2.0
- Session duration so far: ~1100 seconds
这些信息有助于大模型根据您的环境定制响应,但会话结束后,这些信息都不会持续存在。
四、用户记忆
ChatGPT有一个专用工具,用于存储和删除有关用户的稳定、长期事实。这些是数周和数月积累的碎片,形成一个持久的"配置文件"。
就我而言,该模型有33个存储的事实------例如:
- 我的名字,年龄
- 职业目标
- 背景和过去的角色
- 当前项目
- 我正在学习的领域
- 健身常规
- 个人喜好
- 长期利益
这些不是猜测的;它们只有在以下时候才会明确存储:
- 用户说"记住这个"或"将这个存储在记忆中",或者
- 该模型检测到符合OpenAI标准的事实(例如您的姓名、职位或声明的偏好),用户通过对话隐含同意
这些记忆作为单独的块注入到每个未来的提示中。
如果您想添加或删除任何东西,您可以简单地说:
- "把这个保存在记忆中..."
- "从记忆中删除这个..."
示例:
- User's name is Manthan Gupta.
- Previously worked at Merkle Science and Qoohoo (YC W23).
- Prefers learning through a mix of videos, papers, and hands-on work.
- Built TigerDB, CricLang, Load Balancer, FitMe.
- Studying modern IR systems (LDA, BM25, hybrid, dense embeddings, FAISS, RRF, LLM reranking).
五、最近的对话总结
这部分最让我吃惊,因为我预计ChatGPT会在过去的对话中使用某种RAG。相反,它使用轻量级摘要。目前很多开源Chat项目也使用摘要而非RAG,例如Claude最近发布的Skills。
ChatGPT使用以下格式保存最近对话摘要列表:
1. <Timestamp>: <Chat Title>
|||| user message snippet ||||
|||| user message snippet ||||
观察:
- 它只总结了我的信息,没有模型输出的信息。
- 大约有15个摘要可用。
- 它们充当了我最近兴趣的松散地图,而不是详细的背景。
- 这个块让ChatGPT在聊天中具有连续性,而无需提取完整的成绩单。
传统的RAG系统需要:
- 向量化过去的每一条信息
- 在每个查询上运行相似性搜索
- 拉入完整的消息上下文
- 更高的延迟和Token成本
ChatGPT的方法更简单:预先计算轻量级摘要并直接注入它们,这种方式获得了更好速度和效率,丢失了对话的详细背景信息。
六、当前会话信息
这是当前对话的正常滑动窗口。它包含本会话中交换的所有消息的完整历史记录(未汇总)。
我们无法知晓ChatGPT内部确切的Token数限制,但它确实证实了:
- 上限基于Token计数,而不是消息数量
- 一旦达到限制,当前会话中的旧消息就会丢弃(但用户记忆和对话摘要仍然存在)
- 此块中的所有内容逐字传递给模型,保持完整的对话上下文
这就是让Agent在会议中连贯推理的原因。
七、这一切是如何共同运作的
当您向ChatGPT发送消息时,情况如下:
-
**会话开始:**会话元数据被注入一次,提供有关您的设备、订阅和使用模式的ChatGPT上下文。
-
**每条信息:**您存储的用户记忆(就我而言是33个)始终包含在内,确保回复与您的偏好和背景一致。
-
**交叉聊天意识:**最近的对话摘要提供了您兴趣的轻量级地图,无需提取完整的对话清单。
-
**当前上下文:**当前会话信息的滑动窗口在对话中保持一致性。
-
**令牌预算:**随着会话的增长,旧消息丢弃,但属于您个人的用户记忆和对话摘要仍然存在,保持连续性。
这种分层方法意味着ChatGPT可以实现个性化的上下文感知,而无需搜索数千条历史消息耗费额外的成本。
八、结论
ChatGPT的记忆系统是一个多层架构,平衡了个性化、性能和Token效率。通过结合短暂的会话元数据、明确的长期事实、轻量级对话摘要和当前消息的滑动窗口,ChatGPT实现了一件了不起的事情:它感觉个人和上下文感知,没有传统RAG系统的计算开销。
这里的关键见解是,并非所有东西都需要传统意义上的"记忆"。会话元数据实时适应您的环境。明确的用户记忆持续存在。对话摘要以最简练的文字提供连续性没有细节的内容支持。当前会话保持连贯性。这些动态组件一起------随着会话的进行和您的偏好变化而更新------营造出一个真正了解您的系统的错觉。
对于用户来说,这意味着ChatGPT可以随着时间的推移而感觉越来越个性化,而不需要明确的知识库管理。对于开发人员来说,这是实用工程的一课:有时更简单、更精心设计的方法优于复杂的检索系统,特别是当你控制整个交互流程时。
权衡是显而易见的:ChatGPT为了速度和效率而牺牲了详细的历史背景信息。但对于大多数对话来说,这正是正确的平衡。系统会记住重要的东西(您的偏好、目标和最近的兴趣),同时保持快速和响应。
原文地址:I Reverse Engineered ChatGPT's Memory System, and Here's What I Found!