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

xxx

  1. 会话元数据 (Session Metadata)

    • 这是在会话开始时一次性注入的临时信息,包括设备类型、浏览器信息、大致位置、订阅等级以及使用模式(如活跃频率)。
    • 这些信息帮助模型根据用户当前的软硬件环境调整回复,但不会在会话结束后保留。
  2. 用户记忆 (User Memory)

    • 这是一个专门用于存储长期事实的工具,例如用户的姓名、职业目标、健身习惯及个人偏好。
    • 作者的案例中存储了 33 个事实。这些信息通常在用户明确要求(如“记住这个”)或模型检测到关键信息并获得隐含确认时被存储。
    • 这些记忆作为一个独立的模块,会被注入到每一次未来的提示词(Prompt)中。
  3. 近期对话摘要 (Recent Conversations Summary)

    • 系统不会检索过去对话的完整记录,而是保留一份轻量级的摘要列表。
    • 该列表包含时间戳、对话标题以及用户消息的片段。
    • 这种方法充当了用户近期兴趣的“粗略地图”,在避免高延迟和 Token 成本的同时,维持了跨对话的连续性。
  4. 当前会话消息 (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 发送消息时,会发生以下情况:

  1. 会话开始:会话元数据注入一次,给 ChatGPT 提供关于你的设备、订阅和使用模式的上下文。

  2. 每条消息:你存储的记忆事实(在我的例子中是 33 个)始终包含在内,确保回复符合你的偏好和背景。

  3. 跨聊天感知:最近对话摘要提供了你兴趣的轻量级地图,无需拉取完整的文字记录。

  4. 当前上下文:当前会话消息的滑动窗口保持对话内的连贯性。

  5. Token 预算:随着会话的增长,旧消息被移除,但你的记忆事实和对话摘要保留,保持连续性。

这种分层方法意味着 ChatGPT 可以感觉个性化和具有上下文感知能力,而无需搜索数千条过去消息的计算成本。

结论

ChatGPT 的记忆系统是一个多层架构,平衡了个性化、性能和 token 效率。通过结合临时的会话元数据、显式的长期事实、轻量级的对话摘要和当前消息的滑动窗口,ChatGPT 实现了非凡的成就:它感觉个性化且具有上下文感知能力,而没有传统 RAG 系统的计算开销。

这里的关键见解是,并非所有东西都需要成为传统意义上的“记忆”。会话元数据实时适应你的环境。显式事实跨会话持久存在。对话摘要提供没有细节的连续性。而当前会话保持连贯性。这些动态组件——每一个都随着会话的进行和你的偏好演变而更新——共同创造了一个真正了解你的系统的错觉。

对于用户来说,这意味着 ChatGPT 可以随着时间的推移感觉越来越个性化,而无需显式的知识库管理。对于开发者来说,这是实用工程的一课:有时更简单、更精选的方法优于复杂的检索系统,特别是当你控制整个管道时。

权衡是显而易见的:ChatGPT 牺牲了详细的历史上下文以换取速度和效率。但对于大多数对话来说,这正是恰当的平衡。系统记住了重要的事情(你的偏好、目标和最近的兴趣),同时保持快速和响应灵敏。


*本博客基于通过对话进行的实验和逆向工程,而非官方文档——所以请持保留态度。