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

303 阅读6分钟

想象一下,你雇了一个实习生(AI大模型),他学东西超快,能力超强,几乎什么都会。但你发现他有个致命的毛病:记性不好,而且容易分心

  • 你让他去完成一个包含10个步骤的复杂任务,比如“去客户公司取回合同,复印三份,一份给法务部,一份给财务部,最后把原件送到总裁办公室归档”。
  • 当他做到第3步“复印三份”时,可能就已经忘了最初的目标是“取回合同”,也忘了最后要送给谁。他可能会拿着复印件,然后问你:“老板,接下来干嘛?” 这就是 “目标漂移” (Goal Drift)
  • 更糟糕的是,如果你给他的指令太长,他只对开头和结尾的印象最深,中间部分很容易忽略掉。这就是AI研究中提到的 “中间遗忘” (Lost in the Middle) 问题。

Manus这篇文章要解决的,就是AI Agent(人工智能代理)在处理需要很多步骤(比如几十上百次工具调用)的复杂任务时,如何克服这种“聪-明的健忘症”。

核心思想是什么?——“不要改造大脑,而是给它一个好用的笔记本”

文章提出的核心思想非常巧妙,不是去尝试“治好”AI的健忘症(这需要改造AI模型本身,非常困难),而是用一种聪明的工作方法来绕过这个问题。

这个方法就是:强制AI把所有要做的事情,以及每一步的进展,都清清楚楚地写在一个“笔记本”上,并且每做完一小步,就要重新看一遍、整理一遍这个笔记本。

这个“笔记本”,就是我们在之前讨论中提到的 todo.md 文件。

这个过程,文章称之为 “上下文工程” (Context Engineering) 。意思就是,我们不去改变AI,而是精心设计和管理我们“喂”给AI的信息(即“上下文”),来引导它的行为和注意力。


整个方法的精髓所在,具体分为以下几个步骤:

第一步:先思考,写下计划 (Plan First)

  • 当接到一个复杂任务时,AI Agent的第一件事不是马上动手干活。
  • 而是先“动脑筋”,把完成整个任务需要的所有步骤,一条一条地写进一个todo.md文件里。这就像你给那个实习生一支笔和一个便签本,让他把自己要干的活先写下来。

第二步:只看清单,干一件事 (Focus on One Item)

  • AI看着清单上的第一项任务,然后集中精力去完成这一项。比如,清单第一项是“调用A工具获取数据”。

第三步:更新清单,划掉已完成的 (Update the List)

  • 一旦完成了第一项任务,AI 不会 马上接着做第二项。
  • 它会做一件至关重要的事:重新生成一整个todo.md文件。在这个新版本的文件里,它会把刚刚完成的第一项任务用删除线划掉(或者打个勾 [x]),并可能记录下这一步的结果(比如“数据已成功获取”)。

第四步:循环往复,直到全部完成 (Loop until Done)

  • AI会拿着这个 更新后 的清单,再次从头看起,找到下一个未完成的任务,然后重复第2步和第3步。

这个方法为什么神奇?

因为AI的注意力总是在它接收到的信息的 “末尾” 。通过在每一步之后都 “重写整个清单” ,Manus实际上是把 “总目标”和“下一步计划” 这些最重要的信息,在每一次决策前,都重新放到了上下文的末尾。

这就像你每当那个健忘的实习生做完一件事,就把他拉过来,指着笔记本对他说: “很好,这件事做完了。别忘了,我们的最终目标是把合同归档,你现在需要去做下一件事——复印。去吧!”

通过这种方式,AI的注意力被人为地、反复地拉回到主任务上,从而避免了走神和忘记目标。


那如何才能生成完整的todo.md

第一步:准备“原料” (The Ingredients)

要让厨师(AI)做出一桌好菜,你必须先给他准备好所有新鲜、优质的食材。这里的“食材”,就是我们之前精心设计的 “洋葱模型”上下文

在生成 todo.md 之前,我们的平台必须自动地、完整地将以下四层信息打包好:

  1. 核心任务指令 (要干什么?):

    • 目标: “在UserService中实现RegisterWithEmail方法”
    • 输入/输出: (email, password) -> (user_id, error)
    • 验收标准: 成功时返回用户ID,邮箱重复时返回特定错误等。
  2. 代码环境上下文 (在哪里干?):

    • 相关数据模型: User结构体的定义。
    • 相关函数签名: database.SaveUser(...)utils.HashPassword(...)等需要调用的函数。
    • 目标文件路径: services/user_service.go
  3. 功能意图上下文 (为什么干?):

    • 用户故事: “作为一个新用户,我希望能够使用邮箱和密码注册账户...”
    • 相关逻辑图(PUML): 用户注册的完整时序图,让AI明白这一步在整个流程中的位置。
  4. 项目规范上下文 (按什么规矩干?):

    • 架构原则: “本项目为微服务架构...”
    • 编码规范: “错误处理必须使用errors.Wrap...”

这些信息会被打包成一个结构化的JSON对象,作为AI制定计划的唯一事实来源。

第二步:精心设计“指令” (The Master Prompt)

有了食材,现在需要给厨师(AI)一份精确的“菜谱”。这份菜谱就是一个精心设计的 “Master Prompt” (主指令) 。这个指令的目标不是让AI写代码,而是让它 扮演一个规划者

这个Prompt应该包含以下几个部分:

  1. 角色扮演 (Role-Playing):

    • “你是一位拥有15年经验的资深软件架构师和技术负责人。” (设定高标准)
  2. 任务描述 (Task Description):

    • “你的任务是为下游的一个AI开发者代理(AI Developer Agent),根据我提供的完整上下文信息,创建一份详细、清晰、可执行的行动计划。请以Markdown格式输出这份计划,文件名为todo.md。”
  3. 对计划的要求 (Requirements for the Plan):

    • 逻辑必须严密: 步骤的顺序必须符合软件开发的正常逻辑(例如,先定义接口,再实现,最后写测试)。”
    • 步骤必须原子化: 每个步骤都应该是一个单一、具体、可执行的小动作(例如‘读取文件’、‘写入方法签名’,而不是‘开发功能’)。”
    • 必须包含验证环节: 计划中必须明确包含编写单元测试、运行测试以及根据测试结果进行修正的步骤。”
    • 必须包含规范检查: 在计划的最后,必须有一个步骤是回顾和检查所有代码变更是否符合项目规范。”
    • 必须包含上下文快照: 在计划的开头,要简要总结最终目标和关键约束,以便AI Agent在后续的每一步都能看到。”
  4. 提供上下文数据 (Providing the Context):

    • “请严格根据以下JSON对象中提供的上下文信息来制定计划:\n{...我们打包好的完整JSON...}

第三步:生成与输出 (Generation & Output)

当AI接收到这个精心设计的指令和完整的上下文数据后,它就会输出一份高质量的、结构化的 todo.md