【译】ChatGPT的记忆机制

一、概述

当我问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发送消息时,情况如下:

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

  2. **每条信息:**您存储的用户记忆(就我而言是33个)始终包含在内,确保回复与您的偏好和背景一致。

  3. **交叉聊天意识:**最近的对话摘要提供了您兴趣的轻量级地图,无需提取完整的对话清单。

  4. **当前上下文:**当前会话信息的滑动窗口在对话中保持一致性。

  5. **令牌预算:**随着会话的增长,旧消息丢弃,但属于您个人的用户记忆和对话摘要仍然存在,保持连续性。

这种分层方法意味着ChatGPT可以实现个性化的上下文感知,而无需搜索数千条历史消息耗费额外的成本。

八、结论

ChatGPT的记忆系统是一个多层架构,平衡了个性化、性能和Token效率。通过结合短暂的会话元数据、明确的长期事实、轻量级对话摘要和当前消息的滑动窗口,ChatGPT实现了一件了不起的事情:它感觉个人和上下文感知,没有传统RAG系统的计算开销。

这里的关键见解是,并非所有东西都需要传统意义上的"记忆"。会话元数据实时适应您的环境。明确的用户记忆持续存在。对话摘要以最简练的文字提供连续性没有细节的内容支持。当前会话保持连贯性。这些动态组件一起------随着会话的进行和您的偏好变化而更新------营造出一个真正了解您的系统的错觉。

对于用户来说,这意味着ChatGPT可以随着时间的推移而感觉越来越个性化,而不需要明确的知识库管理。对于开发人员来说,这是实用工程的一课:有时更简单、更精心设计的方法优于复杂的检索系统,特别是当你控制整个交互流程时。

权衡是显而易见的:ChatGPT为了速度和效率而牺牲了详细的历史背景信息。但对于大多数对话来说,这正是正确的平衡。系统会记住重要的东西(您的偏好、目标和最近的兴趣),同时保持快速和响应。


原文地址:I Reverse Engineered ChatGPT's Memory System, and Here's What I Found!