长时运行智能体的上下文工程
防止多轮智能体能力衰减的四种手段:压缩而不是截断、结构化笔记、子智能体隔离、即时检索。
问题所在
长时运行的智能体有一种典型的失败方式:不是崩溃,而是缓慢漂移。早期决策被遗忘,工具输出不断堆积,模型开始基于过时的上下文做优化。
上下文窗口是一份有限预算。每个 token 都在争夺注意力,而相关性会随着距窗口边缘的距离衰减。
四种有效的手段
1. 压缩而非截断
要做的是总结并重启,而不是砍掉尾部。总结中必须保留:
- 当前目标及其验收标准
- 已做出以及已否决的决策(否则被否决的方案会被反复重提)
- 未解决的阻塞项及其负责人
- 实际在用的文件路径与标识符
朴素截断保留的是近期噪声、丢弃的是早期意图,完全搞反了。
2. 结构化草稿本
把状态放在窗口之外的文件里,让智能体重读而非回忆:
progress.md # 已完成 / 进行中
decisions.md # 决策及其理由,只追加
blockers.md # 卡在哪里、为何卡住
只追加的日志优于可变状态——历史本身就是上下文。
3. 子智能体隔离
把自包含的子任务派给子智能体。它拥有干净的窗口,在死胡同里烧的是自己的 token,只把结论回传。这是保持主线程整洁的最高杠杆动作。
4. 即时检索
传递指针(路径、查询条件、ID),而不是载荷。在真正需要的那一刻才读文件。把「可能相关的东西」预加载进来,正是窗口在工作开始前就被塞满的原因。
如何判断有效与否
别凭感觉,盯这些指标:
| 信号 | 健康 | 正在劣化 |
|---|---|---|
| 上下文体积 | 跨轮次稳定 | 单调增长 |
| 重复提问 | 罕见 | 反复重问已解决项 |
| 返工 | 罕见 | 重提已否决方案 |
| 文件改动面 | 聚焦 | 频繁触碰无关模块 |
如果智能体重提它自己已经否决过的方案,说明压缩环节丢了决策历史——先修总结模板,别急着怪模型。