澳五机器人 两条路的本质:从「压缩」到「切换」
作者:admin | 分类:澳五机器人 | 浏览:3 | 日期:2026年09月18日这个话题在 51CTO 昨天(9月17日)刚发了一篇深度拆解 [citation:17.6],加上 OpenAI 9月初连续合并的几个 PR,时间点非常及时。Codex 的记忆机制正在经历一次架构级转向——我把这两条路拆清楚。
---
两条路的本质:从「压缩」到「切换」
旧路(正被放弃):Compaction —— 压缩
过去 Codex 和大多数 AI Agent 的处理方式:
上下文窗口占满
↓
自动压缩(Compaction):模型把旧对话「挤成」一段摘要
↓
关键细节丢失,精炼后的摘要产生「失真」
↓
反复压缩 → 摘要越来越薄 → 任务偏离原始方向
问题是:压缩是不可逆的信息漏斗。输掉了上下文,模型开始忘记自己做到哪一步。 [citation:17.11]
新路(正在推进):Token Budget + 窗口切换
这一轮改动的核心思想变了——不再试图把旧内容塞进同一窗口,而是换一个新窗口,把旧窗口当资料库查。
上下文窗口快满了
↓
模型通过 _context 工具知道剩余 token 预算
↓
模型主动决策:「这里不值得保留了,切新窗口」
↓
切窗前留下工作笔记(notes):记录目标、进度、下一步
↓
新窗口启动,重新注入初始环境 + 权限 + 任务配置
↓
需要时通过 history 工具搜索旧窗口内容
通过 notes 工具读取持久笔记
关键差异:旧内容是可检索的参考史料,而不是被压扁的废墟。 [citation:17.5][citation:17.11][citation:17.14]
---
两个关键 PR
| PR | 作用 |
|----|------|
| #27488 | 新增 _context 工具,供模型主动判断何时切换上下文窗口。不做摘要,直接开新窗口 |
| #39827 | 新增 history 和 notes 两个工具——history 可搜索旧窗口内容,notes 提供持久笔记能力(查询、追加、重写) |
[citation:17.5][citation:17.14]
---
但这只是「会话内记忆」的改造
51CTO 那篇文章拆得更深——Codex 的长期跨会话记忆(long-term memory)其实是另一套更复杂的两阶段流水线 [citation:17.6]:
长期记忆的完整路径
每一轮对话(rollout)
↓
┌─ 第一阶段:逐会话抽取 ──────────────────┐
│ 后台在会话空闲 >6h 后启动 │
│ 把 rollout 逐条发给抽取模型 │
│ 产出:rawmemory + rolloutsummary │
│ 结果只有三种:成功/没产出/失败 │
│ 并发控制靠数据库租约 + 退避重试 │
└─────────────────┬────────────────────────┘
↓
┌─ 第二阶段:全局合并(串行)──────────────┐
│ 先取全局租约锁(防两个进程冲突) │
│ 按使用次数 > 最近使用 > 新鲜度排序 │
│ 超出 maxunuseddays(默认30天)直接淘汰 │
│ 同步到磁盘(git 基线版本化) │
│ ↓ │
│ 有变化 → 调合并 agent 增量更新 MEMORY.md │
│ 无变化 → 跳过,零开销 │
└─────────────────┬────────────────────────┘
↓
磁盘上的记忆目录(~/.codex/memories/)
├── MEMORY.md # 面向检索的手册
├── memory_summary.md # 注入未来会话的紧凑索引
├── raw_memories.md # 合并后的原始抽取
├── rollout_summaries/ # 每个被选中的 rollout 一份
├── skills/ # 学到的可复用流程
└── extensions/ # 临时笔记(ad_hoc notes)
遗忘:不是一次删除,是七条独立路径
| 遗忘路径 | 机制 |
|---------|------|
| ① 改写为空即删除 | 同一 rollout 重抽后判定"没价值"→ 旧记录被删 |
| ② 掉出选择集 | 排名掉出 top-N 的摘要被剪掉 |
| ③ 合并时移除 | agent 只删失去证据的指引 |
| ④ 按时间剪枝 | 超 maxunuseddays 的失去资格 |
| ⑤ 扩展资源过期 | 临时资源文件超过保留窗口 |
| ⑥ 跟随线程删除 | 会话被删 → 挂在上面的记忆一并删除 |
| ⑦ 整体重置 | debug clear-memories 子命令 |
[citation:17.6]
---
一条使用回流——被用过的记忆活得更久
这是整套设计里唯一一条自我强化回路:
模型在回答中引用了某条记忆
↓
回复末尾附带引用块(文件路径 + 行号 + rollout UUID)
↓
运行时解析引用,累加该条目的使用次数 + 时间戳
↓
第二阶段排序优先选使用次数高的
↓
被用过的记忆活得更久 ✅
---
两条路的本质对比
| 维度 | 旧路(Compaction) | 新路(Token Budget + 切换) |
|------|:----------------:|:-------------------------:|
| 核心思想 | 把旧内容压进同一个窗口 | 换新窗口,旧窗口当资料库 |
| 是否丢失信息 | ✅ 压缩必丢 | ❌ 不压缩,完整保留 |
| 模型角色 | 被动等压缩 | 主动通过 _context 判断决策 |
| 记忆恢复 | 靠摘要 | 靠 history 搜索 + notes 读取 |
| 长期记忆 | 两阶段流水线(抽取 + 合并) | 同上(不变) |
| 适用场景 | 短任务还行 | 持续数小时的超长任务 ✅ |
---
和你之前话题的联系
你之前聊 SKILL「微创手术」 时说过:不是增能力,而是划边界。Codex 这次记忆改造也是同一个思路——不再试图把一切塞进同一个窗口(大拆大建),而是让模型知道边界在哪,什么时候该换页,怎么从旧页找回需要的东西。
而这个两阶段流水线的设计,和你聊的 RAG 的文档解析 pipeline 也有神似之处:先是逐文档细粒度抽取(召回),再合并去重构建索引(精排),中间有质量门槛和过期淘汰——只不过抽取和合并的对象从 PDF 换成了会话记录。