Manus 上下文工程
概述
Manus 是一款由 Yichao 'Peak' Ji 带领团队打造的自主 AI 智能体。该团队在战略上押注上下文工程,而非模型微调——通过塑造上下文而非重训模型,将改进的交付周期从数周压缩至数小时。他们已先后四次重构智能体框架,每次重构都源于对上下文管理更优方案的深入探索。
"如果模型进步是涨潮,我们希望 Manus 是那艘船,而不是扎在海床上的桩。" —— Yichao 'Peak' Ji
Manus 完成一项典型任务约需 50 次工具调用,输入与输出的 Token 比例平均约为 100:1。这使上下文工程成为一项首要关注点,而非优化项。
核心原则
1. 围绕 KV 缓存进行设计
Manus 将 KV 缓存命中率视为生产环境智能体最重要的单一指标。以 Claude Sonnet 为例,缓存输入 Token 的成本为 $0.30/MTok,而未缓存为 $3.00/MTok——差距高达 10 倍,同时还能显著降低延迟。
提升缓存命中率的实践: - 保持提示词前缀稳定:哪怕一个 Token 的差异,都会使该位置之后的缓存全部失效。一个常见错误是在系统提示词开头插入精确到秒的时间戳。 - 采用仅追加的上下文模式:避免修改已有的动作或观察记录。同时确保序列化结果具有确定性——许多编程语言在序列化 JSON 时不保证键的顺序稳定,这会悄无声息地破坏缓存。 - 显式标记缓存断点:部分服务商需要手动插入缓存断点。至少应确保断点覆盖系统提示词的末尾。
2. 遮蔽而非移除(工具管理)
随着 Manus 动作空间的扩展(尤其是引入 MCP 集成之后),动态添加或移除工具的朴素方案暴露出两个问题: 1. 工具定义位于上下文靠前的位置——任何修改都会使后续所有内容的 KV 缓存失效。 2. 当之前的动作引用了当前上下文中已不存在的工具时,模型会产生混淆,进而出现 schema 违规或幻觉动作。
解决方案:Manus 使用感知当前状态的状态机来管理工具可用性。与其移除工具,不如在解码阶段遮蔽(mask)Token 的 logit,从而根据当前状态禁止或强制选择特定动作。工具定义保持在前缀中稳定不变,可用性的控制在解码层实现。
Manus 还为动作名称设计了统一的前缀规范(例如,浏览器工具使用 browser_*,命令行工具使用 shell_*),以便无需借助有状态的 logit 处理器即可轻松实现组级约束。
3. 将文件系统用作上下文
Manus 将文件系统视为"终极上下文":容量无限、天然持久,且可由智能体直接操作。
驱动这一设计的三个痛点: 1. 来自网页或 PDF 的观察内容很容易超出上下文长度限制。 2. 即便仍在窗口范围内,模型性能会随上下文长度超过某一阈值而下降。 3. 即使有前缀缓存,长输入的成本依然高昂。
核心设计原则:所有压缩策略均设计为可恢复的。只要保留了 URL,网页内容可以从上下文中丢弃;只要沙箱中保留了文件路径,文档内容可以省略。这使 Manus 能够在不永久丢失信息的前提下缩短上下文长度,从而规避激进摘要所带来的不可逆信息损失风险。
4. 通过复述操控注意力
Manus 智能体会创建一个 todo.md 文件,并在任务推进过程中逐步更新它。这并非装饰性操作,而是一种刻意设计的机制,用于将智能体的目标持续保持在其近期注意力范围内。
Manus 的典型任务跨越约 50 次工具调用。若不主动管理注意力,智能体在长上下文中容易偏离主题或遗忘早期目标(即"迷失在中间"问题)。通过不断改写待办列表,Manus 将自身目标复述至上下文末尾,在无需架构改动的情况下,将模型的关注焦点偏向当前计划。
5. 保留错误信息
当智能体出错时,一个常见冲动是清理执行轨迹——重试动作、重置状态、隐藏失败。Manus 的经验却恰恰相反:将失败的动作及其观察结果保留在上下文中。
当模型看到失败的动作及其产生的错误或堆栈跟踪时,它会隐式地更新自身的判断,降低对类似动作的倾向。抹去失败等于销毁证据,使模型无法适应。Manus 认为错误恢复能力是衡量真正智能体行为的最清晰指标之一。
6. 防止少样本定势
如果上下文中充满了相似的历史"动作-观察"对,模型会倾向于沿用这一模式,即便该模式已不再最优。在批量任务中(例如审查 20 份简历),智能体容易陷入重复相似动作的节奏。
解决方案:Manus 在动作和观察中引入少量结构化变化——不同的序列化模板、交替的表达方式、顺序或格式上的轻微噪声。这种可控的随机性打破了固有模式,防止出现脆弱的过度泛化行为。
策略汇总
| 策略 | Manus 实现方式 |
|---|---|
| 缓存上下文 | 以 KV 缓存命中率为首要指标;保持前缀稳定、采用仅追加模式、确保序列化确定性 |
| 卸载上下文 | 以文件系统作为主要外部记忆;仅使用可恢复的压缩策略 |
| 缩减上下文 | 在保留引用(URL/路径)的前提下丢弃内容;绝不进行不可逆压缩 |
| 隔离上下文 | 使用感知状态的状态机进行工具遮蔽;而非多智能体并行 |
| 注意力管理 | 通过复述 todo.md 防止长任务中的目标漂移 |