本文翻译自博客上发布的文章:I Reverse Engineered ChatGPT’s Memory System, and Here’s What I Found!。作者通过逆向工程发现了 ChatGPT 的记忆系统的实现方式,与普遍猜测不同,ChatGPT 并没有使用复杂的向量数据库或针对对话历史的 RAG(检索增强生成)技术。相反,它采用了一种分层架构,主要由以下四个核心部分组成:

会话元数据 (Session Metadata)
- 这是在会话开始时一次性注入的临时信息,包括设备类型、浏览器信息、大致位置、订阅等级以及使用模式(如活跃频率)。
- 这些信息帮助模型根据用户当前的软硬件环境调整回复,但不会在会话结束后保留。
用户记忆 (User Memory)
- 这是一个专门用于存储长期事实的工具,例如用户的姓名、职业目标、健身习惯及个人偏好。
- 作者的案例中存储了 33 个事实。这些信息通常在用户明确要求(如“记住这个”)或模型检测到关键信息并获得隐含确认时被存储。
- 这些记忆作为一个独立的模块,会被注入到每一次未来的提示词(Prompt)中。
近期对话摘要 (Recent Conversations Summary)
- 系统不会检索过去对话的完整记录,而是保留一份轻量级的摘要列表。
- 该列表包含时间戳、对话标题以及用户消息的片段。
- 这种方法充当了用户近期兴趣的“粗略地图”,在避免高延迟和 Token 成本的同时,维持了跨对话的连续性。
当前会话消息 (Current Session Messages)
- 这是当前对话的完整历史记录,采用滑动窗口机制。
- 其容量基于 Token 数量限制而非消息条数。当达到限制时,旧消息会被移除,但用户记忆和对话摘要依然保留,以确保当前对话的连贯性。
传统的 RAG 系统需要对每条过去的消息进行嵌入(Embedding)和相似度搜索,成本高且延迟大。ChatGPT 的方法通过预计算轻量级摘要并直接注入,牺牲了部分历史细节,换取了更快的响应速度和更高的效率。
原文
当我问 ChatGPT 它记得关于我的什么时,它列出了从我的名字和职业目标到我目前的健身计划等 33 个事实。但它实际上是如何存储和检索这些信息的呢?为什么感觉如此无缝?
经过广泛的实验,我发现 ChatGPT 的记忆系统比我预期的要简单得多。没有向量数据库。没有基于对话历史的 RAG(检索增强生成)。相反,它使用四个不同的层:适应你环境的会话元数据、长期存储的显式事实、最近聊天的轻量级摘要以及当前对话的滑动窗口。
这篇博客详细剖析了每一层是如何工作的,以及为什么这种方法可能优于传统的检索系统。这里的所有内容都来自于通过对话对 ChatGPT 行为的逆向工程。OpenAI 并没有公布这些实现细节。
ChatGPT 的上下文结构
在理解记忆之前,重要的是要理解 ChatGPT 接收到的每条消息的完整上下文。结构如下:
[0] 系统 指令
[1] 开发者 指令
[2] 会话 元数据 (临时的)
[3] 用户 记忆 (长期 事实)
[4] 最近 对话 摘要 (过去的 聊天, 标题 + 片段)
[5] 当前 会话 消息 (本次 聊天)
[6] 你的 最新 消息
前两个组件定义了高级行为和安全规则。它们不是本博客的重点。有趣的部分始于会话元数据。
这些细节在会话开始时注入一次。它们不会永久存储,也不会成为长期记忆的一部分。该块包括:
- 设备类型(桌面/移动端)
- 浏览器 + 用户代理 (User agent)
- 大致位置/时区
- 订阅级别
- 使用模式和活动频率
- 近期模型使用分布
- 屏幕尺寸、深色模式状态、JS 启用状态等
会话元数据的一个示例如下:
会话元数据:
- 用户订阅: ChatGPT Go
- 设备: 桌面浏览器
- 浏览器用户代理: Chrome on macOS (Intel)
- 大致位置: 印度 (可能是 VPN)
- 本地时间: ~16:00
- 账户时长: ~157 周
- 近期活动:
- 过去 1 天内活跃 1 天
- 过去 7 天内活跃 5 天
- 过去 30 天内活跃 18 天
- 对话模式:
- 平均对话深度: ~14.8 条消息
- 平均用户消息长度: ~4057 个字符
- 模型使用分布:
* 5% gpt-5.1
* 49% gpt-5
* 17% gpt-4o
* 6% gpt-5-a-t-mini
* 等等
- 设备环境:
- JS 已启用
- 深色模式 已启用
- 屏幕尺寸: 900×1440
- 页面视口: 812×1440
- 设备像素比: 2.0
- 目前会话持续时间: ~1100 秒
这些信息帮助模型根据你的环境定制回复,但在会话结束后没有任何内容会保留。
用户记忆
ChatGPT 有一个专用工具用于存储和删除关于用户的稳定、长期事实。这些是经过数周和数月积累形成的持久“档案”。
在我的案例中,模型存储了 33 个事实——诸如:
- 我的姓名、年龄
- 职业目标
- 背景和过往角色
- 当前项目
- 我正在研究的领域
- 健身计划
- 个人偏好
- 长期兴趣
这些不是猜测出来的;只有在以下情况时才会明确存储:
- 用户说“记住这个”或“把这个存入记忆”,或者
- 模型检测到符合 OpenAI 标准的事实(如你的姓名、职位或陈述的偏好)且用户在对话中隐含同意
这些记忆作为一个单独的块注入到未来的每一个提示词(prompt)中。
如果你想添加或删除任何内容,只需说:
- “把这个存入记忆……”
- “从记忆中删除这个……”
示例:
- 用户名字是 Manthan Gupta。
- 曾在 Merkle Science 和 Qoohoo (YC W23) 工作。
- 偏好通过视频、论文和动手实践相结合的方式学习。
- 构建了 TigerDB, CricLang, Load Balancer, FitMe。
- 正在研究现代 IR 系统 (LDA, BM25, 混合, 密集嵌入, FAISS, RRF, LLM 重排序)。
最近对话摘要
这一部分最让我惊讶,因为我原本以为 ChatGPT 会在过去的对话中使用某种 RAG。相反,它使用了一个轻量级的摘要。
ChatGPT 以这种格式保存最近对话摘要的列表:
1. <时间戳>: <聊天标题>
|||| 用户消息片段 ||||
|||| 用户消息片段 ||||
观察结果:
- 它只总结我的消息,而不是助手的。
- 大约有 15 个摘要可用。
- 它们作为我最近兴趣的粗略地图,而不是详细的上下文。
此块让 ChatGPT 具有跨聊天的连续感,而无需拉取完整的文字记录。
传统的 RAG 系统需要:
- 嵌入每条过去的消息
- 对每个查询运行相似性搜索
- 拉取完整的消息上下文
- 更高的延迟和 token 成本
ChatGPT 的方法更简单:预先计算轻量级摘要并直接注入。这用详细的上下文换取了速度和效率。
当前会话消息
这是当前对话的常规滑动窗口。它包含本会话中交换的所有消息的完整历史记录(未摘要)。
我没能从 ChatGPT 那里得到确切的 token 限制,但它确实确认了:
- 上限基于 token 数量,而非消息数量
- 一旦达到限制,当前会话中的旧消息会被移除(但记忆事实和对话摘要保留)
- 此块中的所有内容都逐字传递给模型,保持完整的对话上下文
正是这一点允许助手在会话内进行连贯的推理。
它们是如何协同工作的
当你向 ChatGPT 发送消息时,会发生以下情况:
会话开始:会话元数据注入一次,给 ChatGPT 提供关于你的设备、订阅和使用模式的上下文。
每条消息:你存储的记忆事实(在我的例子中是 33 个)始终包含在内,确保回复符合你的偏好和背景。
跨聊天感知:最近对话摘要提供了你兴趣的轻量级地图,无需拉取完整的文字记录。
当前上下文:当前会话消息的滑动窗口保持对话内的连贯性。
Token 预算:随着会话的增长,旧消息被移除,但你的记忆事实和对话摘要保留,保持连续性。
这种分层方法意味着 ChatGPT 可以感觉个性化和具有上下文感知能力,而无需搜索数千条过去消息的计算成本。
结论
ChatGPT 的记忆系统是一个多层架构,平衡了个性化、性能和 token 效率。通过结合临时的会话元数据、显式的长期事实、轻量级的对话摘要和当前消息的滑动窗口,ChatGPT 实现了非凡的成就:它感觉个性化且具有上下文感知能力,而没有传统 RAG 系统的计算开销。
这里的关键见解是,并非所有东西都需要成为传统意义上的“记忆”。会话元数据实时适应你的环境。显式事实跨会话持久存在。对话摘要提供没有细节的连续性。而当前会话保持连贯性。这些动态组件——每一个都随着会话的进行和你的偏好演变而更新——共同创造了一个真正了解你的系统的错觉。
对于用户来说,这意味着 ChatGPT 可以随着时间的推移感觉越来越个性化,而无需显式的知识库管理。对于开发者来说,这是实用工程的一课:有时更简单、更精选的方法优于复杂的检索系统,特别是当你控制整个管道时。
权衡是显而易见的:ChatGPT 牺牲了详细的历史上下文以换取速度和效率。但对于大多数对话来说,这正是恰当的平衡。系统记住了重要的事情(你的偏好、目标和最近的兴趣),同时保持快速和响应灵敏。
*本博客基于通过对话进行的实验和逆向工程,而非官方文档——所以请持保留态度。