超出想象的简单!ChatGPT的记忆方案
文章介绍了ChatGPT的四层记忆架构:会话元数据、用户记忆、近期对话摘要和当前会话消息。通过预注入轻量级摘要和上下文信息,ChatGPT实现了高效且连贯的对话处理,避免了传统RAG系统的复杂性。 2025-12-12 06:7:34 Author: www.freebuf.com(查看原文) 阅读量:0 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

![图片]

当我们还在讨论向量数据库、复杂检索系统的时候,ChatGPT其实用了一个相当朴素的方案。没有向量数据库,没有复杂的RAG检索系统,只有四个简单层次的组合。

四层记忆架构

1. 会话元数据(临时层)

在会话开始时注入一次,包含:

  • 设备类型(桌面/移动端)
  • 浏览器信息和用户代理
  • 地理位置/时区
  • 订阅级别和使用模式
  • 屏幕尺寸、深色模式状态等

这些信息帮助模型根据你的环境调整回应,但不会在会话结束后持久化。

2. 用户记忆(长期事实层)

这是ChatGPT存储的稳定、长期的用户事实。作者有33个存储事实:

  • 姓名、年龄
  • 职业目标
  • 背景和过去角色
  • 当前项目
  • 学习领域
  • 健身习惯
  • 个人偏好
  • 长期兴趣

这些记忆不是猜测的,只有在以下情况下才会明确存储:

  • 用户说"记住这个"或"存储在记忆中"
  • 模型检测到符合OpenAI标准的事实(如你的姓名、职位或明确偏好),且用户通过对话默示同意

3. 近期对话摘要(跨会话连续性)

最令人意外的是这一层。我原以为ChatGPT会对过去的对话使用某种RAG系统,但它使用了轻量级摘要:

1. <时间戳>: <对话标题>  
|||| 用户消息片段 ||||  
|||| 用户消息片段 ||||

特点:

  • 只摘要用户消息,不包含助手回复
  • 大约15个摘要可用
  • 作为用户近期兴趣的松散映射,而非详细上下文

这种设计避免了传统RAG系统的复杂性:嵌入每条过去消息、对每个查询运行相似性搜索、拉取完整消息上下文。

4. 当前会话消息(即时上下文)

当前对话的普通滑动窗口,包含本次会话中所有消息的完整历史(非摘要)。

  • 基于token数量限制,而非消息数量
  • 达到限制时,当前会话中的旧消息会滚动移除
  • 但记忆事实和对话摘要保持不变
  • 此块中的所有内容都逐字传递给模型,保持完整对话上下文

工作原理

当你发送消息给ChatGPT时,按以下顺序发生:

  1. 会话开始:注入会话元数据,提供设备、订阅和使用模式上下文
  2. 每次消息:存储的记忆事实始终被包含,确保回应与你的偏好和背景一致
  3. 跨会话感知:近期对话摘要提供轻量级兴趣映射,无需拉取完整记录
  4. 当前上下文:当前会话消息的滑动窗口保持对话内连贯性
  5. Token预算:随着会话增长,旧消息会滚动移除,但记忆事实和对话摘要保持不变,保持连续性

关键点

所有信息直接进入上下文

与传统的RAG系统不同,ChatGPT没有本地查询机制。所有相关信息都是直接预注入到上下文中:

每次请求的上下文结构:  
[0] System Instructions  
[1] Developer Instructions  
[2] Session Metadata (会话开始时注入一次)  
[3] User Memory (每次都注入)  
[4] Recent Conversations Summary (每次都注入)  
[5] Current Session Messages (滑动窗口)  
[6] 用户最新消息

简单胜过复杂

ChatGPT的方法是预计算轻量级摘要并直接注入。这用详细上下文换取速度和效率。 传统RAG系统需要:

  • 嵌入每条过去消息
  • 在每个查询上运行相似性搜索
  • 拉取完整消息上下文
  • 更高的延迟和token成本

这篇文章基于实验和通过对话进行的逆向工程,而非官方文档——所以请谨慎对待

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/461895.html
如有侵权请联系:admin#unsafe.sh