<p align="right"><font color="#3f3f3f">2025年07月19日</font></p>
> 原文链接:[AI代理的上下文工程:构建Manus的经验教训](https://manus.im/zh-cn/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus)
## 文章概述
作者Yichao 'Peak' Ji分享了构建AI代理产品Manus过程中在上下文工程方面的实践经验。这是一篇技术经验总结,重点讨论了如何通过优化上下文设计来提升AI代理的性能。
## 核心决策:选择上下文学习而非端到端训练
### 关键观点
作者团队选择基于前沿模型的上下文学习能力构建代理,而非从开源基础模型训练端到端的代理模型。
### 注解与理解
**历史背景**:在BERT时代(2018年),模型需要针对每个新任务进行微调,这个过程通常需要数周时间。作者在上一个创业项目中就遭遇了这种缓慢的反馈循环问题。
**技术转折点**:GPT-3和Flan-T5的出现标志着上下文学习时代的开始,使得无需训练即可适应新任务成为可能。
**实用考量**:选择上下文学习的核心原因是迭代速度——从数周缩短到数小时。这对于尚未达到产品市场契合度(PMF)的快速迭代产品至关重要。
**形象比喻**:作者用"潮水和船"比喻模型进步与产品的关系——如果模型进步是涨潮,那么产品应该是随潮水上升的船,而不是固定在海底的柱子。
## 核心原则1:围绕KV-Cache设计
### 技术原理
KV-cache是大语言模型推理优化的关键技术,通过缓存相同前缀的键值对来减少重复计算。
### 重要性量化
- **成本差异**:以Claude Sonnet为例,缓存的输入tokens成本为0.30美元/百万tokens,未缓存的成本为3美元/百万tokens——10倍差异
- **使用模式**:在Manus中,平均输入输出token比例约为100:1,这使得缓存优化变得极其重要
### 实践策略
**1. 保持提示前缀稳定**
- **常见错误**:在系统提示开头包含精确到秒的时间戳
- **问题根源**:由于LLM的自回归特性,即使单个token的差异也会使该token之后的整个缓存失效
- **实用建议**:如果需要时间信息,考虑放在提示的末尾或使用相对稳定的时间格式
**2. 确保上下文仅追加**
- **避免修改**:不要修改之前的动作或观察结果
- **序列化一致性**:确保JSON对象的键值顺序稳定(许多编程语言的序列化库不保证键的顺序)
- **技术细节**:这种不一致会悄无声息地破坏缓存效果
**3. 明确标记缓存断点**
- **应用场景**:某些模型提供商或推理框架不支持自动增量前缀缓存
- **最低要求**:确保断点至少包含系统提示的结尾
- **考虑因素**:需要考虑潜在的缓存过期问题
## 核心原则2:掩码而非移除工具
### 问题背景
随着代理能力扩展,工具数量急剧增长。特别是用户可配置工具的情况下,可能会有数百个工具被加入到动作空间中。
### 动态工具管理的问题
**1. 缓存失效**
- **技术原因**:工具定义通常位于上下文前部(系统提示前后),任何变更都会使后续所有动作和观察的KV-cache失效
- **性能影响**:这种失效会显著增加推理时间和成本
**2. 上下文不一致**
- **具体问题**:当之前的动作和观察仍然引用已不再定义的工具时,模型会产生困惑
- **后果**:在没有约束解码的情况下,这通常导致架构违规或幻觉动作
### Manus的解决方案:状态机+掩码
**技术实现**:使用上下文感知的状态机管理工具可用性,通过掩码token logits来阻止或强制选择特定动作。
**响应预填充技术**:
- **Auto模式**:模型可选择调用或不调用函数
- **Required模式**:模型必须调用函数,但选择不受限制
- **Specified模式**:模型必须从特定子集中调用函数
**命名规范策略**:
- **前缀设计**:所有浏览器相关工具以`browser_`开头,命令行工具以`shell_`开头
- **实用优势**:允许轻松强制代理仅从特定工具组中选择,无需使用有状态的logits处理器
## 核心原则3:文件系统作为上下文
### 现有方案的局限性
**上下文窗口问题**:
- **容量限制**:虽然现代前沿LLM提供128K+tokens的上下文窗口,但在真实代理场景中往往不够
- **性能衰减**:模型性能在超过特定上下文长度后会下降
- **成本问题**:长输入成本高昂,即使有前缀缓存
**传统压缩方案的风险**:
- **信息丢失**:过度压缩不可避免地导致信息丢失
- **预测困难**:无法预测哪个观察结果在十步之后可能变得关键
- **逻辑风险**:任何不可逆的压缩都存在风险
### Manus的文件系统方案
**核心理念**:将文件系统视为终极上下文——无限大小、天然持久、可直接操作。
**可恢复压缩策略**:
- **网页内容**:只要保留URL,就可以丢弃网页内容
- **文档内容**:只要保留沙箱中的路径,就可以省略文档内容
- **优势**:在不永久丢失信息的情况下缩减上下文长度
**对未来架构的思考**: 作者推测,如果状态空间模型(SSM)能够掌握基于文件的内存——将长期状态外化而非保持在上下文中——那么它们的速度和效率优势可能会开启新一类代理。代理式SSM可能是神经图灵机的真正继承者。
## 核心原则4:通过复述操控注意力
### 观察到的行为模式
Manus在处理复杂任务时会创建`todo.md`文件,并在任务进展过程中逐步更新,勾选已完成的项目。
### 技术原理
**注意力机制问题**:
- **任务复杂性**:Manus中的典型任务平均需要约50次工具调用
- **注意力漂移**:在长上下文或复杂任务中,模型容易偏离主题或忘记早期目标
- **"迷失在中间"问题**:长序列中间的信息容易被忽略
**复述机制的作用**:
- **强化目标**:通过不断重写todo列表,将目标复述到上下文的末尾
- **注意力引导**:将全局计划推入模型的近期注意力范围
- **自然语言偏置**:使用自然语言来引导模型关注任务目标,无需特殊架构变更
## 核心原则5:保留错误信息
### 常见的错误处理误区
传统做法倾向于隐藏错误:清理跟踪记录、重试动作或重置模型状态。这种做法看似更安全、更可控,但代价是消除了证据。
### 错误作为学习材料的价值
**学习机制**:
- **隐式更新**:当模型看到失败的动作及其结果观察或堆栈跟踪时,会隐式更新其内部信念
- **先验调整**:这会使其先验远离类似动作,降低重复相同错误的概率
- **适应能力**:错误恢复是真正代理行为的最清晰指标之一
**实践建议**:将错误轨迹保留在上下文中,让模型从失败中学习。
### 学术研究的不足
作者指出,错误恢复在大多数学术工作和公共基准测试中仍然代表性不足,这些测试往往关注理想条件下的任务成功。
## 核心原则6:避免Few-shot陷阱
### Few-shot提示的副作用
**模仿本性**:语言模型是优秀的模仿者,它们会模仿上下文中的行为模式。如果上下文充满了相似的过去动作-观察对,模型会倾向于遵循该模式,即使不再是最优选择。
**危险场景**:
- **重复决策任务**:当使用Manus帮助审查20份简历时,代理经常陷入节奏——仅仅因为在上下文中看到了这种模式就重复类似的动作
- **负面后果**:导致漂移、过度泛化或有时出现幻觉
### 解决方案:增加多样性
**结构化变化**:
- **序列化模板**:使用不同的序列化模板
- **表述变化**:采用替代措辞
- **格式噪声**:在顺序或格式上引入轻微噪声
**受控随机性**:这种受控的随机性有助于打破模式并调整模型的注意力。
**核心原则**:上下文越统一,代理就越脆弱。
## 总结与思考
### 上下文工程的本质
作者将上下文工程描述为一门新兴科学,对代理系统来说已经是必需的。无论模型变得多么强大、快速和便宜,都无法替代对内存、环境和反馈的需求。
### 迭代学习的重要性
Manus团队通过反复重写、死胡同和数百万用户的真实世界测试学到了这些经验。作者强调这些不是普遍真理,而是对他们有效的模式。
### 实践哲学
文章以"Stochastic Graduate Descent"(随机梯度下降)来形容他们的手动架构搜索、提示调整和经验猜测过程——不够优雅,但确实有效。
### 未来展望
作者以"代理的未来将一次一个上下文地构建"结尾,强调了上下文工程在AI代理开发中的基础性作用。
## 关键技术概念补充
**KV-Cache**:键值缓存,是Transformer架构中的优化技术,通过缓存之前计算的键值对来避免重复计算。
**约束解码**:限制模型输出必须符合特定格式或结构的技术。
**状态空间模型(SSM)**:一种不同于Transformer的神经网络架构,在处理长序列时具有效率优势,但缺乏完全注意力机制。
**响应预填充**:在模型生成响应之前预先填充部分内容,用于引导或约束输出格式。