如何给 AI 编程 Agent 下任务,才能减少返工

工作流 · · 原创

核心结论:AI 编程 Agent 返工,大多数不是模型不够强,而是任务边界不清、验收标准不清、上下文不完整。

1. 一句话结论

如果我要让 AI 编程 Agent 真正稳定产出,我最该优化的不是提示词花样,而是任务定义方式。

最有效的做法只有五件事:

  • 先讲清楚目标,不要只讲动作。
  • 明确允许修改和禁止修改的范围。
  • 给出验收标准,而不是只说“改一下”。
  • 补足上下文,让 Agent 少猜。
  • 每次只交付一个清晰闭环,不把多个问题揉成一句话。

很多返工,本质上都来自一句模糊指令:

帮我优化一下这里

这句话对人都不够清楚,对 Agent 更不够。

2. 背景

现在很多 AI 编程 Agent 已经不只是补全代码,而是会:

  • 读项目文件。
  • 搜索代码。
  • 修改实现。
  • 运行构建和测试。
  • 根据结果继续调整。

问题也正出在这里。

Agent 一旦能自己行动,模糊指令造成的损失就会被放大:

  • 它可能改对了方向,但改多了。
  • 它可能修了一个点,却破坏了另一个点。
  • 它可能为了“看起来更稳”,擅自补一堆兜底逻辑。
  • 它可能猜错你的真实目标,然后在错误方向上非常努力。

所以,AI 编程最关键的能力,不是“会不会提问”,而是“会不会下任务”。

3. 核心观点

3.1 不要只说怎么做,要先说为什么做

很多人给 Agent 的输入只包含动作,不包含目标,例如:

把这个表单拆成组件

这句话的问题是,Agent 不知道你为什么要拆。

真实目标可能完全不同:

  • 为了复用。
  • 为了缩短页面文件长度。
  • 为了隔离权限逻辑。
  • 为了让测试更好写。

如果目标不同,拆分方式就不同。

更好的写法:

目标:把页面里的“筛选区”抽成独立组件,减少页面文件复杂度。
约束:只处理筛选区,不调整表格和请求逻辑。
验收:页面交互不变,筛选参数透传,构建通过。

重点不是“更长”,而是“更清楚”。

3.2 任务边界不清,是返工的第一来源

Agent 和新人开发很像:你不说边界,它就会自己补边界。

最常见的失控方式有三种:

  • 改动范围扩大,把无关文件一起重构了。
  • 为了通过构建,顺手改了公共类型或公共工具。
  • 为了避免报错,增加了不必要的空值兼容和兜底逻辑。

所以我现在更推荐这种任务描述:

允许修改:
- src/views/order/List.vue
- src/components/OrderFilter.vue

禁止修改:
- 请求层
- 路由定义
- 全局组件

只要范围清楚,返工概率会明显下降。

3.3 验收标准比“实现思路”更重要

很多人会给 Agent 很多实现建议,但不给验收标准。

例如:

用 hooks 重构一下,顺便优化性能

这种描述很容易让 Agent 自由发挥,最后你只能重新 Review 一大轮。

更合理的写法应该是:

验收标准:
- 保持现有页面行为不变
- 首次加载请求次数不增加
- 不新增全局状态
- `pnpm build` 通过

对 Agent 来说,验收标准就是收敛条件。没有收敛条件,它就容易在“看起来合理”的方向上不断扩展。

3.4 上下文越缺,Agent 越爱猜

Agent 做错很多时候不是能力问题,而是信息不够。

尤其在这些场景里,缺上下文几乎必然返工:

  • 老项目里存在历史约定。
  • 组件库已经有现成模式。
  • 某个模块有隐式业务规则。
  • 仓库里有 AGENTS.mdREADME.md、设计约束或目录约定。

所以我更建议直接把关键上下文前置,而不是等 Agent 自己搜半天:

背景:
- 这是一个中后台项目
- 技术栈是 Vue 3 + TypeScript + Vite
- 当前页面沿用组合式 API
- 不接受为兼容旧逻辑新增兜底分支

这类信息看起来简单,但对结果影响非常大。

4. 具体方法

4.1 我现在常用的任务模板

下面这个模板,基本已经够覆盖大多数代码类任务:

背景:
- 这是一个什么项目
- 当前模块负责什么

目标:
- 这次到底要完成什么

范围:
- 允许修改哪些文件或模块
- 不允许碰哪些部分

约束:
- 技术栈约束
- 风格约束
- 不接受的实现方式

验收标准:
- 功能结果
- 构建/测试要求
- 性能或行为约束

输出要求:
- 是否需要补文档
- 是否需要说明风险
- 是否需要提交 commit

这个模板的好处是,它不是为了“写得专业”,而是为了减少猜测空间。

4.2 四类常见任务,应该怎么下

场景一:修 Bug

错误示范:

这个页面有问题,你修一下

推荐写法:

背景:订单列表页切换分页后,筛选条件被重置。
目标:修复分页切换时筛选条件丢失的问题。
范围:只允许修改订单列表页和筛选参数同步逻辑。
验收:切分页后筛选条件保持不变,返回第一页时仍正确,`pnpm build` 通过。

场景二:做重构

错误示范:

把这块代码优化一下

推荐写法:

目标:把页面内超过 300 行的筛选区逻辑抽成独立组件,降低主页面复杂度。
范围:只拆 UI 和事件透传,不改接口层。
约束:不新增状态管理,不改现有接口字段,不补兜底逻辑。
验收:页面行为一致,代码职责更清晰,构建通过。

场景三:新增功能

错误示范:

加一个导出按钮

推荐写法:

背景:订单列表页需要支持按当前筛选条件导出。
目标:增加“导出当前结果”按钮。
范围:允许修改列表页、导出按钮组件、导出请求封装。
约束:导出参数必须复用当前筛选条件,不单独维护第二份状态。
验收:筛选后导出参数正确,未筛选时使用默认查询条件,构建通过。

场景四:写文章或文档

错误示范:

帮我写一篇总结

推荐写法:

目标:写一篇适合公开发布的知识库文章。
读者:有 3 到 5 年经验的前端工程师。
风格:结论先行,少空话,多方法。
结构:背景、核心观点、具体方法、常见问题、结论。

4.3 交付闭环不要过大

Agent 擅长的是“一个闭环一个闭环地推进”,不擅长在一句话里同时完成五种目标。

例如下面这种任务就很危险:

顺便把页面重构一下,再优化请求层,再补几个测试,然后把 UI 改漂亮一点

这类需求混合了:

  • 架构调整
  • 功能修复
  • 工程验证
  • 视觉改造

对人来说都应该拆,对 Agent 更应该拆。

更合理的方式是:

  1. 先修行为问题。
  2. 再做结构重构。
  3. 再补测试。
  4. 最后做视觉优化。

每一步都能验证,每一步都能回滚。

5. 常见问题

5.1 为什么我已经写得很长了,Agent 还是做错?

因为“长”不等于“清楚”。

很多长提示的问题在于:

  • 背景很多,但目标不清楚。
  • 限制很多,但验收标准没有量化。
  • 说了很多偏好,却没说这次到底不能碰什么。

判断标准很简单:

如果把这段任务描述给团队里的新同事,他仍然会追问,那给 Agent 也一样不够清楚。

5.2 我要不要把实现细节全部规定死?

不用。

如果你已经非常确定实现路径,可以明确约束;如果你只是要结果,不一定要把过程锁死。

更实用的原则是:

  • 目标和边界要明确。
  • 关键约束要明确。
  • 非关键实现细节可以留给 Agent 发挥。

不要把任务写成“只允许按我脑子里的每一步执行”,否则 Agent 的价值会被你自己抵消掉。

5.3 为什么我总感觉 Agent 喜欢过度设计?

因为很多指令里隐含了错误激励,比如:

  • “顺便优化一下”
  • “尽量写稳一点”
  • “把能处理的边界都处理了”

这类话很容易诱导 Agent 主动增加抽象、兼容分支和兜底逻辑。

如果你追求的是代码质量和一致性,反而应该说得更硬一点:

  • 不增加无关抽象。
  • 不补兜底兼容。
  • 不改无关模块。
  • 不猜不存在的业务分支。

6. 我的结论

AI 编程 Agent 的上限,越来越像“团队里一个执行力很强但需要被清楚管理的工程师”。

所以真正决定结果质量的,不只是模型能力,而是我有没有把任务定义清楚。

我的当前做法很简单:

  • 先写目标,不先写动作。
  • 先定边界,不让 Agent 自己扩散。
  • 先定验收,不让任务无限延伸。
  • 先补上下文,不让它靠猜。
  • 一次只交付一个闭环。

如果这五点做好,返工会明显下降,Review 成本也会一起下降。

7. 可直接复用的任务模板

背景:
- 

目标:
- 

允许修改:
- 

禁止修改:
- 

约束:
- 

验收标准:
- 

输出要求:
-