Skip to content

ChatGPT 记忆系统工作原理深度解析

🎯 分析目标 (Goal)

  • 逆向工程:拆解记忆系统

  • 技术推断:探究其可能的技术实现

  • 用户体验:理解记忆系统如何影响交互感受

⚙️ 记忆系统工作方式 (How It Works)

  • 两大核心系统

    • 💾 已保存记忆 (Saved Memory)

      • 核心特征

        • 用户可控: 完全由用户主导
        • 事实存储: 保存关于用户的具体事实
        • 提示注入: 将保存的事实注入到系统提示(System Prompt)中
      • 触发与管理

        • 触发方式: 需要用户下达明确指令
          • 示例: 记住我... (Remember that I ...)
        • 用户界面(UI): 提供简单界面供用户查看和删除
      • 数据处理

        • 最小化检查: 仅进行基础的校验
          • 去重: 避免完全相同的记忆条目
          • 矛盾检测: 拒绝明显矛盾的陈述
            • 示例: "我是工程师" vs "我不是工程师"
          • 允许共存: 允许高度相关但不完全相同的条目并存
            • 示例: "我是软件工程师" 和 "我是后端工程师"
    • 📚 参考聊天历史 (Reference Chat History)

      • 概述

        • 复杂性: 远比“已保存记忆”系统复杂
        • 主要贡献: 被认为是提升助手响应质量的主要来源
        • 内部分层: 实验表明其可能由三个子系统构成
      • 1. 🕒 当前会话历史 (Current Session History)

        • 定义: 对用户在其他对话中最近消息的简单记录
        • 特点
          • 时间范围: 极短,通常在过去一天内
          • 记录量: 很小,似乎少于10条消息
          • 作用: 能将用户的直接引述添加到模型上下文中
      • 2. 📖 对话历史 (Conversation History)

        • 定义: 从过往对话中提取相关上下文
        • 能力 (Capabilities)
          • 跨对话引用: 能够直接引用来自不同对话的用户消息
          • 内容检索: 可通过内容描述对话描述来检索消息
        • 局限性 (Limitations)
          • 顺序不保证: 回忆消息时无法保证其原始顺序
          • 时间模糊: 无法按精确时间范围回忆 (例如“过去一小时内的所有消息”)
        • 回忆窗口 (Recall Window)
          • 直接引用: 实验显示最长可达两周
          • 摘要总结: 超过两周后,只能提供消息的摘要,而非原文
        • 索引机制推断
          • 消息内容嵌入索引
          • 对话摘要嵌入索引
        • 助手消息回忆
          • 准确性差: 回忆助手自身发送消息的准确性远低于用户消息
          • 可能原因
              1. 未存储助手消息,仅为幻觉生成
              1. 助手消息以更概括、摘要化的形式存储
      • 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 用于处理记忆请求
        1. 提取事实: 将用户消息转化为独立的事实列表
        1. 转化从句: 将事实转化为描述性从句
        1. 校验: 检查新从句与现有从句之间的矛盾和相似性
        1. 输出: 若无冲突,则输出新的从句列表
    • 系统集成
      • 提示注入: 在每次对话中将用户事实注入到 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,同时保持簇内方差低并排除异常值
        • 执行步骤
            1. 聚类: 使用 knn 等算法对用户消息向量进行聚类
            1. 评估: 使用 eval_clusters 函数评估聚类效果
            1. 迭代: 循环 1..MAX_CLUSTERS 找到最佳聚类方案
        • 洞察生成
            1. LLM摘要: 对每个簇内的文本消息,使用专门的Prompt调用LLM生成洞察文本
            1. 附加元数据: 根据簇内消息的时间戳,确定性地生成时间范围
      • 存储与使用
        • 存储: 将生成的洞察存储在一个简单的数据库表中
        • 使用: 在每次对话开始时,将相关的用户洞察附加到模型上下文中

😊 用户体验影响 (User Experience Impact)

  • 核心观点

    • ChatGPT 平台体验优于纯 API 调用
    • 记忆系统是造成这种体验差异的关键因素之一
  • 💾 已保存记忆的影响

    • 优点: 影响最直接、最明显,用户可主动定制化助手行为
    • 缺点: 需要用户具备一定的技术头脑或主动性,非技术用户可能难以利用
  • 🧠 用户洞察的影响

    • 优点
      • 自动化: 弥补了“已保存记忆”需要手动操作的不足
      • 减少摩擦: 通过预先了解用户,减少了无效和令人沮丧的交互
      • 消除歧义: 帮助模型更好地理解用户的真实意图
      • 个性化: 根据用户偏好(如技术解释 vs. 类比解释)调整响应风格
    • 作者推测: 此系统对性能提升的贡献可能超过 80%
  • 🕒 当前会话历史的影响

    • 效果模糊: 具体影响难以精确定位
    • 理论价值: 让助手了解用户最近的行为,有助于理解新对话中上下文不全的问题
    • 作者感受: 在实际使用中未曾明确感受到其带来的帮助
  • 📖 对话历史的影响

    • 作用: 模拟人类对话者所具备的共享上下文记忆
    • 益处: 避免重复、循环或前后矛盾的对话
    • 有效性前提: 高度依赖于历史信息的准确回忆有效利用

🔬 实验与发现 (Experimentation & Findings)

  • 已保存记忆实验

    • 触发: 需要明确指令 (如 记住...)
    • 不一致性: 对“我是软件工程师”保存了记忆,但对“我是登山者”未保存
    • 冲突处理: 拒绝保存矛盾信息,并提示用户选择一个版本
  • 聊天历史实验

    • 删除延迟: 提示“可能需要几天”,暗示存在某种批处理机制
    • 回忆能力测试
      • 两周内: 能准确引用用户原文
      • 三周及以上: 无法准确引用,转而提供基于主题的幻觉摘要
  • 上下文泄露分析

    • 证实存在“用户洞察”: 格式为 Records of our past conversations...
    • 证实存在“系统提示”: 包含工具定义,如 bio, python, web
  • 记忆分层证据

    • ChatGPT 自述其信息分为三类
        1. 当前会话信息 (Ephemeral Context)
        1. 用户洞察 / 助手记忆 (Persisted Memory)
        1. 对话历史 (Short-Term History Metadata)
  • 助手消息回忆测试

    • 无法直接引用: 当被要求引用自己过去的回答时,无法给出原文
    • 能准确总结: 能够准确地总结自己过去回答的核心内容