By accumulating small steps, one can reach a thousand miles.

AI代理的上下文工程:构建Manus的经验教训

  • 围绕KV缓存进行设计
    • 保持你的提示前缀稳定
    • 使你的上下文只追加
    • 在需要时明确标记缓存断点
  • 遮蔽,而非移除工具
    • 随着代理能力的增强,其行动空间自然变得更加复杂——简单来说,工具数量爆炸式增长。最近流行的MCP只会火上浇油。如果你允许用户自定义工具,相信我:总会有人将数百个神秘工具插入到你精心策划的行动空间中。结果,模型更可能选择错误的行动 或采取低效的路径。简而言之,你武装过度的代理变得更加愚蠢。
    • 一个自然的反应是设计一个动态行动空间——可能是使用类似于RAG的方法按需加载工具。但我们的实验表明了一个明确的规则:除非绝对必要,避免在迭代过程中动态添加或移除工具
      • 在大多数LLM中,工具定义在序列化后位于上下文的前部,通常在系统提示之前或之后。因此任何更改都会使后续所有动作和观察的KV缓存失效。
      • 当先前的动作和观察仍然引用当前上下文中不再定义的工具时,模型会感到困惑。如果没有约束解码,这通常会导致模式违规或幻觉动作。
    • 大多数模型提供商和推理框架支持某种形式的响应预填充,这允许你在不修改工具定义的情况下约束动作空间
  • 使用文件系统作为上下文
    • 压缩策略始终设计为可恢复的
  • 通过复述操控注意力
    • 通过不断重写待办事项列表,Manus将其目标复述到上下文的末尾。这将全局计划推入模型的近期注意力范围内,避免了"丢失在中间"的问题,并减少了目标不一致。实际上,它使用自然语言来使自己的注意力偏向任务目标——而不需要特殊的架构变更。
  • 保留错误的内容
    • 代理会犯错。这不是bug——这是现实。语言模型会产生幻觉,环境会返回错误,外部工具会出现异常行为,意外的边缘情况随时都会出现。在多步骤任务中,失败不是例外;它是循环的一部分。
    • 根据我们的经验,改善代理行为最有效的方法之一出奇地简单:将错误的尝试保留在上下文中。当模型看到一个失败的行动——以及由此产生的观察结果或堆栈跟踪——它会隐式地更新其内部信念。这会改变其先验,降低重复相同错误的可能性。 事实上,我们认为错误恢复是真正代理行为的最明显指标之一。然而,在大多数学术工作和公共基准测试中,这一点仍然代表性不足,它们通常关注理想条件下的任务成功。
  • 不要被少样本示例所困
    • 少样本提示是提高LLM输出的常用技术。但在代理系统中,它可能会以微妙的方式适得其反。语言模型是优秀的模仿者;它们模仿上下文中的行为模式。如果你的上下文充满了类似的过去行动-观察对,模型将倾向于遵循该模式,即使这不再是最优的。
    • 解决方法是增加多样性。Manus在行动和观察中引入少量的结构化变化——不同的序列化模板、替代性措辞、顺序或格式上的微小噪音。这种受控的随机性有助于打破模式并调整模型的注意力。
    • 不要让自己陷入少样本学习的窠臼。你的上下文越单一,你的智能体就变得越脆弱。