Appearance
ChatGPT 记忆系统工作原理深度解析
🎯 分析目标 (Goal)
⚙️ 记忆系统工作方式 (How It Works)
两大核心系统
💾 已保存记忆 (Saved Memory)
📚 参考聊天历史 (Reference Chat History)
概述
- 复杂性: 远比“已保存记忆”系统复杂
- 主要贡献: 被认为是提升助手响应质量的主要来源
- 内部分层: 实验表明其可能由三个子系统构成
1. 🕒 当前会话历史 (Current Session History)
- 定义: 对用户在其他对话中最近消息的简单记录
- 特点
- 时间范围: 极短,通常在过去一天内
- 记录量: 很小,似乎少于10条消息
- 作用: 能将用户的直接引述添加到模型上下文中
2. 📖 对话历史 (Conversation History)
- 定义: 从过往对话中提取相关上下文
- 能力 (Capabilities)
- 跨对话引用: 能够直接引用来自不同对话的用户消息
- 内容检索: 可通过内容描述或对话描述来检索消息
- 局限性 (Limitations)
- 顺序不保证: 回忆消息时无法保证其原始顺序
- 时间模糊: 无法按精确时间范围回忆 (例如“过去一小时内的所有消息”)
- 回忆窗口 (Recall Window)
- 直接引用: 实验显示最长可达两周
- 摘要总结: 超过两周后,只能提供消息的摘要,而非原文
- 索引机制推断
- 按消息内容嵌入索引
- 按对话摘要嵌入索引
- 助手消息回忆
- 准确性差: 回忆助手自身发送消息的准确性远低于用户消息
- 可能原因
- 未存储助手消息,仅为幻觉生成
- 助手消息以更概括、摘要化的形式存储
3. 🧠 用户洞察 (User Insights)
- 定义: 一个不透明、更高级的自动化记忆系统
- 生成来源: 通过分析用户的多个对话自动提炼而成
- 格式示例 (Leaked Prompt)
User has extensive experience and knowledge in Rust programming...
User has asked multiple detailed questions about... from late 2024 through early 2025
Confidence=high
- 核心属性
- 时间范围标记: 包含洞察来源的时间跨度
- 固定区间:
...from February and March 2025
- 开放区间:
...from January 2025 onwards
- 固定区间:
- 置信度标记: 标明洞察的可靠程度
- 可能反映了用于生成该洞察的消息数量或向量相似度
- 主题聚合: 一条洞察可能包含多个相关联的用户事实,暗示了某种分组/聚类机制
- 时间范围标记: 包含洞察来源的时间跨度
- 推断机制:
- 基于消息历史的向量嵌入
- 寻找相近的向量簇
- 对簇内消息进行摘要生成
💻 技术实现推断 (Plausible Technical Implementation)
💾 已保存记忆 (Saved Memories)
- 核心:
bio
工具 (Tool) - 工具定义 (Function Schema)
name
: "bio"description
: "persist information across conversations"parameters
:message
(string)
- 处理流程
BIO_PROMPT
: 一个专门的 LLM Prompt 用于处理记忆请求- 提取事实: 将用户消息转化为独立的事实列表
- 转化从句: 将事实转化为描述性从句
- 校验: 检查新从句与现有从句之间的矛盾和相似性
- 输出: 若无冲突,则输出新的从句列表
- 系统集成
- 提示注入: 在每次对话中将用户事实注入到 System Prompt
- 管理界面: 建立简单UI供用户查看和删除
- 核心:
📚 参考聊天历史 (Reference Chat History)
1. 🕒 当前会话历史 (Current Session History)
- 实现: 极其简单
- 方法: 从
ChatMessage
表中按用户和时间戳过滤,并取最新的N条记录
2. 📖 对话历史 (Conversation History)
- 架构: 检索增强生成 (RAG)
- 向量空间 (Vector Spaces)
- 空间一: 以
message-content
为索引 - 空间二: 以
conversation-summary
为索引
- 空间一: 以
- 数据流
- 消息发送时 -> 嵌入并存入
message-content
空间 - 对话结束/不活跃 -> 生成对话摘要 -> 存入
conversation-summary
空间
- 消息发送时 -> 嵌入并存入
- 查询流程
- 用户发送新消息 -> 嵌入消息 -> 查询各个向量空间
- 两周内: 查询
message-content
空间以获取原文 - 两周外: 查询
conversation-summary
空间以获取摘要 - 将检索到的相关上下文注入到 Prompt 中
3. 🧠 用户洞察 (User Insights)
- 生成时机: 非实时,可能是通过批处理任务
- 例如: 每周运行的 Cron Job
- 核心挑战: 如何在不过时、不重复、不矛盾的情况下保持洞察的更新
UserInsightUpdate
Lambda 算法推断- 问题建模: 聚类优化问题 (Clustering Optimization)
- 目标: 找到最佳的簇数量
k
,同时保持簇内方差低并排除异常值 - 执行步骤
- 聚类: 使用
knn
等算法对用户消息向量进行聚类
- 聚类: 使用
- 评估: 使用
eval_clusters
函数评估聚类效果
- 评估: 使用
- 迭代: 循环
1..MAX_CLUSTERS
找到最佳聚类方案
- 迭代: 循环
- 洞察生成
- LLM摘要: 对每个簇内的文本消息,使用专门的Prompt调用LLM生成洞察文本
- 附加元数据: 根据簇内消息的时间戳,确定性地生成时间范围
- 存储与使用
- 存储: 将生成的洞察存储在一个简单的数据库表中
- 使用: 在每次对话开始时,将相关的用户洞察附加到模型上下文中
- 生成时机: 非实时,可能是通过批处理任务
😊 用户体验影响 (User Experience Impact)
核心观点
- ChatGPT 平台体验优于纯 API 调用
- 记忆系统是造成这种体验差异的关键因素之一
💾 已保存记忆的影响
- 优点: 影响最直接、最明显,用户可主动定制化助手行为
- 缺点: 需要用户具备一定的技术头脑或主动性,非技术用户可能难以利用
🧠 用户洞察的影响
- 优点
- 自动化: 弥补了“已保存记忆”需要手动操作的不足
- 减少摩擦: 通过预先了解用户,减少了无效和令人沮丧的交互
- 消除歧义: 帮助模型更好地理解用户的真实意图
- 个性化: 根据用户偏好(如技术解释 vs. 类比解释)调整响应风格
- 作者推测: 此系统对性能提升的贡献可能超过 80%
- 优点
🕒 当前会话历史的影响
- 效果模糊: 具体影响难以精确定位
- 理论价值: 让助手了解用户最近的行为,有助于理解新对话中上下文不全的问题
- 作者感受: 在实际使用中未曾明确感受到其带来的帮助
📖 对话历史的影响
- 作用: 模拟人类对话者所具备的共享上下文记忆
- 益处: 避免重复、循环或前后矛盾的对话
- 有效性前提: 高度依赖于历史信息的准确回忆和有效利用
🔬 实验与发现 (Experimentation & Findings)
已保存记忆实验
- 触发: 需要明确指令 (如
记住...
) - 不一致性: 对“我是软件工程师”保存了记忆,但对“我是登山者”未保存
- 冲突处理: 拒绝保存矛盾信息,并提示用户选择一个版本
- 触发: 需要明确指令 (如
聊天历史实验
- 删除延迟: 提示“可能需要几天”,暗示存在某种批处理机制
- 回忆能力测试
- 两周内: 能准确引用用户原文
- 三周及以上: 无法准确引用,转而提供基于主题的幻觉摘要
上下文泄露分析
- 证实存在“用户洞察”: 格式为
Records of our past conversations...
- 证实存在“系统提示”: 包含工具定义,如
bio
,python
,web
等
- 证实存在“用户洞察”: 格式为
记忆分层证据
- ChatGPT 自述其信息分为三类
- 当前会话信息 (Ephemeral Context)
- 用户洞察 / 助手记忆 (Persisted Memory)
- 对话历史 (Short-Term History Metadata)
- ChatGPT 自述其信息分为三类
助手消息回忆测试
- 无法直接引用: 当被要求引用自己过去的回答时,无法给出原文
- 能准确总结: 能够准确地总结自己过去回答的核心内容