2025年在开发创业产品的时候,有一个比较困扰团队的问题就是“记忆”模块怎么写:一方面行业里从Mem0开始各种刷榜SOTA的第三方记忆服务就层出不穷,从RAG到GraphRAG到艾宾浩斯遗忘曲线,怎么高端大气上档次怎么来。另一方面实际一试呢,就非常像接入了一个又一个阿尔兹海默+强迫性幻想综合患者。
正好看到一位印度的AI工程师Manthan Gupta 通过逆向工程拆解了 ChatGPT 的记忆功能。(原文地址:https://manthanguptaa.in/posts/chatgpt_memory/)
你会发现大道至简,作为大家公认实现得相对较好的记忆系统,ChatGPT没有用 RAG,而且就几层大家都能想到的信息一起输入:
1.会话元数据:时间、设备、是否付费、活跃度等等
2.当前会话窗口的最新会话和所有历史会话记录(超 token 限制的话截断)
3.跨会话窗口的 15 条左右历史会话摘要,只总结用户提问,不总结模型回答
4.user profile 级别的全局记忆,大概几十条,按照特定要求记录的用户姓名职业兴趣等长期事实,或者用户明确要求记录的东西
以下是原文的详细翻译:
我逆向工程了 ChatGPT 的记忆系统,这是我的发现!
作者:Manthan Gupta | 日期:2025年12月9日
当我询问 ChatGPT 记得关于我的什么信息时,它列出了 33 件事,从我的名字、职业目标到目前的健身习惯。它是如何存储和检索这些信息的?为什么感觉如此无缝?
经过大量的实验,我发现 ChatGPT 的记忆系统比我预期的要简单得多。没有向量数据库。没有基于对话历史的 RAG(检索增强生成)。
相反,它使用了四个独特的层级:适应你环境的会话元数据、长期存储的显式事实、近期聊天的轻量级摘要以及当前对话的滑动窗口。
这篇博客将详细拆解每一层是如何工作的,以及为什么这种方法可能优于传统的检索系统。这里的所有内容都来自于通过对话逆向工程 ChatGPT 的行为。OpenAI 并没有公开这些实现细节。
ChatGPT 的上下文结构 (Context Structure)
在理解记忆之前,重要的是要理解 ChatGPT 在处理每一条消息时接收到的完整上下文。结构如下:
[0] 系统指令 (System Instructions)
[1] 开发者指令 (Developer Instructions)
[2] 会话元数据 (Session Metadata)(临时性的)
[3] 用户记忆 (User Memory)(长期事实)
[4] 近期对话摘要 (Recent Conversations Summary)(过去的聊天,标题 + 片段)
[5] 当前会话消息 (Current Session Messages)(本次聊天)
[6] 你最新的消息
前两个组件定义了高层行为和安全规则,不是本博客的重点。有趣的部分从会话元数据开始。
会话元数据 (Session Metadata)
这些细节在会话开始时注入一次。它们不会被永久存储,也不会成为长期记忆的一部分。这一块包括:
设备类型(桌面/移动端)
浏览器 + 用户代理 (User Agent)
大致位置/时区
订阅等级
使用模式和活动频率
近期模型使用分布
屏幕尺寸、深色模式状态、JS 启用状态等
会话元数据的示例:
Plaintext
SessionMetadata:-Usersubscription:ChatGPTGo-Device
esktopbrowser-Browseruser-agent:ChromeonmacOS(Intel)-Approximatelocation:India(maybeVPN)-Localtime:~16:00-Accountage:~157weeks-Recentactivity:-Active1dayinthelast1-Active5daysinthelast7-Active18daysinthelast30-Conversationpatterns:-Averageconversationdepth:~14.8messages-Averageusermessagelength:~4057characters-Modelusagedistribution:*5%gpt-5.1*49%gpt-5*17%gpt-4o*6%gpt-5-a-t-mini*etc.-Deviceenvironment:-JSenabled-Darkmodeenabled-Screensize:900x1440-Pageviewport:812x1440-Devicepixelratio:2.0-Sessiondurationsofar:~1100seconds
这些信息帮助模型根据你的环境调整回答,但在会话结束后,这些信息都不会保留。
用户记忆 (User Memory)
ChatGPT 有一个专门的工具用来存储和删除关于用户的稳定的、长期的事实。这些是数周和数月积累下来的片段,形成了一个持久的“档案”。
在我的例子中,模型存储了33 个事实——比如:
我的名字、年龄
职业目标
背景和过去的职位
当前项目
我正在研究的领域
健身习惯
个人偏好
长期兴趣
这些不是猜测出来的;只有在以下情况时它们才会被显式存储:
用户说“记住这个”或“把这个存入记忆”;或者
模型检测到一个符合 OpenAI 标准的事实(如你的名字、职位或陈述的偏好),并且用户通过对话隐含地同意了。
这些记忆作为一个单独的块被注入到每一个未来的提示词 (Prompt) 中。
如果你想添加或删除任何内容,只需说:
示例:
用户的名字是 Manthan Gupta。
曾在 Merkle Science 和 Qoohoo (YC W23) 工作。
偏好通过视频、论文和动手实践混合的方式学习。
构建了 TigerDB, CricLang, Load Balancer, FitMe。
正在研究现代信息检索系统 (LDA, BM25, 混合检索, 稠密嵌入, FAISS, RRF, LLM 重排序)。
近期对话摘要 (Recent Conversations Summary)
这一部分最让我惊讶,因为我原以为 ChatGPT 会在过去的对话中使用某种 RAG。结果它使用的是一个轻量级摘要。
ChatGPT 按照这种格式保留了一份近期对话摘要的列表:
1. <时间戳>: <聊天标题> |||| 用户消息片段 |||| |||| 用户消息片段 ||||
观察:
这个块让 ChatGPT 在不拉取完整记录的情况下,拥有跨聊天的连续感。
传统的 RAG 系统需要:
嵌入 (Embedding) 每一条过去的消息
对每个查询运行相似性搜索
拉取完整的消息上下文
更高的延迟和 Token 成本
ChatGPT 的方法更简单:预计算轻量级摘要并直接注入。这是用详细的上下文换取速度和效率。
当前会话消息 (Current Session Messages)
这是目前对话的常规滑动窗口。它包含本次会话中交换的所有消息的完整历史记录(未摘要)。
我无法从 ChatGPT 那里套出确切的 Token 限制,但它确实确认了:
这就是允许助手在一次会话中连贯推理的原因。
这一切是如何协同工作的
当你向 ChatGPT 发送消息时,会发生以下情况:
会话开始:会话元数据被注入一次,给 ChatGPT 提供关于你的设备、订阅和使用模式的上下文。
每一条消息:你存储的记忆事实(我这里是 33 条)总是包含在内,确保回答符合你的偏好和背景。
跨聊天感知:近期对话摘要提供了你兴趣的轻量级地图,而无需拉取完整的记录。
当前上下文:当前会话消息的滑动窗口保持对话内的连贯性。
Token 预算:随着会话增长,旧消息会被移出,但你的记忆事实和对话摘要保留,保持连续性。
这种分层方法意味着 ChatGPT 可以让人感觉是个性化且具有上下文感知的,而没有搜索成千上万条过去消息的计算成本。
结论
ChatGPT 的记忆系统是一个多层架构,平衡了个性化、性能和 Token 效率。通过结合临时的会话元数据、显式的长期事实、轻量级对话摘要和当前消息的滑动窗口,ChatGPT 实现了一些了不起的事情:它让人感觉个性化且具有上下文感知,却没有传统 RAG 系统的计算开销。
这里的关键洞察是,并非所有东西都需要成为传统意义上的“记忆”。
会话元数据实时适应你的环境。
显式事实跨会话持久存在。
对话摘要提供没有细节的连续性。
当前会话保持连贯性。
这些动态组件结合在一起——随着会话进行和你的偏好演变而更新——创造了一个真正了解你的系统的错觉。
对于用户来说,这意味着 ChatGPT 随着时间的推移会感觉越来越个性化,而无需显式的知识库管理。对于开发者来说,这是实用工程的一课:有时更简单、更精心策划的方法胜过复杂的检索系统,尤其是当你控制整个流程时。
权衡是显而易见的:ChatGPT 牺牲了详细的历史背景来换取速度和效率。但对于大多数对话来说,这正是恰当的平衡。系统记住了重要的事情(你的偏好、目标和近期兴趣),同时保持快速和响应灵敏。
(注:本博文基于通过对话进行的实验和逆向工程,非官方文档——请辩证看待。)