Agentic Coding 工作流:从提示词到循环工程
一次让我重新想清楚工作流的翻车
今年三月初,我接了一个看起来简单的任务:修复用户反馈模块的导出功能——CSV 导出的表头和内容列数不一致,导致 Excel 打开后错位。我把这个任务丢给 Agent,prompt 写得很随意:「修复 CSV 导出表头和数据列不一致的问题」。
二十分钟后,Agent 返回了一大段 diff。表头确实修好了,但它顺手重构了整个导出模块的目录结构,把三个测试文件的 import 路径全部改了,还把一个已经废弃的 JSON 导出函数也做了「优化」。我花了四十分钟把无关改动回退,比我自己手写修复还慢。
问题不在模型能力,在于我没有给它一个可执行的工作流。我给了它一个目标,但没给边界、验证标准和回退条件。这次翻车让我意识到:Agentic Coding 的核心不是写好 prompt,而是设计一个从上下文到验证的完整循环。
从提示词到循环:一个正在发生的范式转移
Andrej Karpathy 在 2025 年底提出「Vibe Coding」这个概念时,描述的是开发者凭感觉跟 AI 对话、快速出原型的状态。不到一年,行业就发现这种模式在真实工程场景里撑不住——需求会变、上下文会丢、验证会漏。
Anthropic 在 2026 年初发布的《Agentic Coding Trends Report》中指出,采用 Agentic 编码的团队在「多步骤工程任务」上的交付质量,比纯 prompt 驱动方式高出 40% 以上,但前提是他们建立了结构化的工作流1。DeepLearning.AI 的课程《Spec-Driven Development with Coding Agents》把这种结构化方法叫做「规格驱动开发」:先写清楚规格,再让 Agent 按规格执行,用验证循环确保结果不偏离2。
Addy Osmani 在 2026 年 6 月的博文「Loop Engineering」中把这种转变概括得更直接:「你不再是一个亲自 prompt agent 的人。你要设计的是那个替你 prompt 的系统。」3
这三条线索指向同一个结论:Agentic Coding 的竞争力不在于你能写出多精巧的 prompt,而在于你能不能把「理解上下文 → 制定计划 → 执行修改 → 验证结果 → 沉淀经验」这条链路变成可重复、可检查的工程循环。
五个环节的工程化拆解
我把这条链路拆成五个环节。每个环节都有它该做的事、容易犯的错和可以对照的检查标准。
上下文:让 Agent 看到你看到的
上下文不只是当前打开的文件。它包括代码结构、文档、历史决策、团队约定和当前任务目标。Agent 犯的大部分「自作主张」错误,根源都是上下文缺失——它不知道不该做什么,就只能猜。
稳定约束(编码规范、架构边界、技术栈选型)应该沉淀到项目级文件(如 CLAUDE.md、AGENTS.md)。临时目标(本次任务范围、不碰的模块、验收标准)应该写在任务描述里。两者混在一起会让 Agent 分不清长期规则和临时偏好。
// ❌ 坏做法:约束散落在 prompt 里,每次重写
const prompt = `
修复 CSV 导出问题。注意我们的项目用的是 TypeScript,
不要改目录结构,测试放在 tests/ 目录下,导出模块不要
动其他文件...
`
// ✅ 好做法:稳定约束在项目文件,临时目标在任务卡片
// CLAUDE.md(长期约束,自动加载):
// - TypeScript 严格模式
// - 测试放 apps/tests/,不放 apps/src/
// - 单个文件不超过 500 行
// 任务描述只写本次目标:
const taskCard = `
## Goal
修复 CSV 导出表头与数据列数不一致
## Constraints
- 只改 export/csv.ts 和对应测试
- 不动目录结构和废弃函数
`项目文件的优势在于它是持久化的——Agent 每次启动都自动加载,不需要你反复在 prompt 里复述同样的规则。Anthropic 的 Agent SDK 文档明确建议,持久规则应该放在 CLAUDE.md 里而不是初始 prompt 里,因为 CLAUDE.md 在每次请求时都会重新注入,而 prompt 会在上下文压缩时丢失4。
计划:在动手前发现需求缺口
复杂任务直接让 Agent 动手写代码,就像不画图纸就砌墙。计划阶段的核心价值不是产出文档,而是在动手前暴露需求缺口和隐含假设。
DeepLearning.AI 的规格驱动课程强调「项目宪章」(project constitution)的概念——用一份结构化的 markdown 文件定义目标、边界、技术约束、已有决策、子任务划分和验收标准2。这比 prompt 多了强制思考的过程。
<!-- ❌ 坏做法:一句话 prompt,隐含假设全靠猜 -->
<!--
"给搜索结果加个分页"
问题:每页多少条?后端分页还是前端分页?
要不要改 URL 参数?空结果怎么处理?
-->
<!-- ✅ 好做法:结构化任务卡片,隐含假设显式化 -->
## Goal
搜索结果页增加分页功能
## Constraints
- 每页 20 条,后端分页
- URL 参数用 ?page=N,支持直接访问
- 空结果复用现有的 EmptyState 组件
## Out of Scope
- 不改搜索接口协议
- 不做无限滚动
- 不加服务端渲染优化计划阶段的另一个关键作用是给 Agent 设定「不做清单」。我的经验是,明确告诉 Agent 不碰哪些东西,比告诉它做什么更有效——因为模型的默认行为是尽可能多做。
执行:保护工作区,控制变更半径
执行阶段最容易失控。Agent 修改了不相关的文件、重写了已有的实现、静默吞掉了错误——这些都不是模型「不听话」,而是工作流没有设置防护栏。
Claude Code 的 Agent SDK 提供了多层控制:工具权限(哪些工具可以自动执行)、Hooks(在工具执行前后拦截检查)、预算上限(防止无限循环)4。关键是把这些控制当作工程基础设施来配置,而不是每次都靠人盯着。
// ❌ 坏做法:Agent 无限制执行,出问题才发现
// 直接跑一个开放 prompt,不设上限
const result = await query({
prompt: "improve this codebase"
// 没有 maxTurns,没有 allowedTools,没有 budget
})
// ✅ 好做法:限制工具范围、设置预算、配置检查钩子
const result = await query({
prompt: "修复 CSV 导出表头与数据列数不一致",
options: {
allowedTools: ["Read", "Edit", "Bash"], // 只给必要工具
settingSources: ["project"], // 加载项目规范
maxTurns: 15, // 防止无限循环
effort: "high", // 匹配任务复杂度
// Hooks 可以在工具执行前拦截危险操作
}
})Addy Osmani 在 Loop Engineering 博文里提出一个重要概念:把「做事的 Agent」和「检查的 Agent」分开3。写代码的模型给自己打分,就像学生批改自己的作业——它倾向于认为自己的输出是对的。一个独立的验证步骤(甚至用不同模型)能显著提高质量。
验证:从「生成了代码」到「有证据支持」
验证是把 Agentic Coding 从玩具变成工程工具的分水岭。没有验证的 Agent 输出只是「看起来像代码的文本」,有验证的输出才是「可以交付的工程变更」。
不同任务需要不同的验证方式。不是所有任务都需要写单元测试——类型检查、构建通过、浏览器验收、截图对比、日志检查都可以是有效的验证手段。关键是验证方式要和任务风险匹配。
// ❌ 坏做法:Agent 说「修好了」就信了
// 没有运行任何验证命令,完全依赖模型的自我评估
// Agent 输出:"已修复 CSV 导出问题,测试应该能通过。"
// 实际上测试跑都没跑
// ✅ 好做法:在任务卡片中定义验证命令,Agent 必须执行并报告结果
// Acceptance 部分:
// - pnpm --filter web check-types 通过
// - pnpm --filter web test -- --grep "CSV export" 通过
// - 手动验证:导出 10 行数据,确认表头和列数一致美团技术团队在 AI Coding 实践中总结了「Red-Green-Refactor」三阶段验证循环:先写一个会失败的测试(Red),让 Agent 实现功能使测试通过(Green),再让 Agent 重构代码保持测试仍然通过(Refactor)5。每个阶段都有自动化验证作为护栏。
复盘:把一次经验变成可复用资产
复盘不是写总结报告。它是把这次任务中发现的模式沉淀为可复用的工程资产——规则更新到项目文件、边界条件补进测试、常见问题写成 Skill、重复操作升级为 Hook 或模板。
<!-- ❌ 坏做法:复盘写成流水账,下次还会犯同样的错 -->
<!--
"3月5日修复了CSV导出问题,Agent多改了目录结构,
以后需要注意。"
问题:没有可执行的行动项,三个月后新人还会踩同一个坑。
-->
<!-- ✅ 好做法:复盘产出可落地的工程改进 -->
## 本次发现
Agent 在没有明确约束时会自行扩展修改范围
## 改进项
- [x] 在 CLAUDE.md 中增加「不修改无关目录结构」约束
- [x] 新增 export 模块的快照测试,防止目录结构被改
- [x] 创建 export-fix Skill 模板,包含标准任务卡片一条端到端任务链路
把五个环节串起来,一个完整的 Agentic Coding 任务链路如下:
这条链路把「写代码」放在中间,而不是第一步。前面的上下文加载和计划确认决定了 Agent 能不能做对事,后面的验证和复盘决定了交付质量和经验是否可复用。
以「修复首页搜索接口报错」为例,实际执行过程:
- 加载上下文:读取 Header 搜索组件、API 调用模块、最近的 git log
- 判断复杂度:涉及 UI + API 两层,属于中等复杂,需要计划
- 生成计划:先定位错误类型 → 确定失败态处理方案 → 最小修改 → 验证
- 人确认:不重做 Header UI,不改后端接口协议
- 执行:在 API 层增加错误捕获,UI 层显示降级状态
- 验证:类型检查通过 → 单元测试覆盖错误分支 → 浏览器验证降级展示
- 复盘:把「API 调用缺少错误处理」这个模式补进项目的 API 模块规范
三种典型场景的对比实践
场景一:修复 lint 错误
| 维度 | 无工作流 | 有工作流 |
|---|---|---|
| 输入 | 「修一下 lint 报错」 | 任务卡片 + 受影响的文件范围 |
| 上下文 | Agent 自己猜 | 项目规范自动加载 |
| 执行边界 | 可能重构不相关文件 | 明确只改 lint 报错行 |
| 验证 | Agent 说「修好了」 | 实际运行 lint 命令确认 |
| 耗时 | 20 分钟 + 15 分钟回退 | 8 分钟一步到位 |
场景二:实现新功能
| 维度 | 纯 prompt 驱动 | 规格驱动 |
|---|---|---|
| 需求理解 | 一句话,隐含假设不透明 | 结构化任务卡片,假设显式化 |
| 计划 | 无,Agent 直接动手 | 先出计划,人确认后再执行 |
| 变更范围 | 不可控,可能超出预期 | 受 Out of Scope 约束 |
| 验收 | 主观判断「看起来对了」 | 自动化验证 + 手动检查 |
| 可复用性 | 零,下次还要从头来 | 任务卡片成为模板 |
场景三:跨模块重构
| 维度 | 单次大任务 | 拆分为循环 |
|---|---|---|
| 风险 | 一次改太多,回退困难 | 每步可验证,逐步推进 |
| 上下文 | 超出窗口限制,信息丢失 | 每个子任务上下文可控 |
| 验证 | 最后一起验证 | 每步独立验证 |
| 中断恢复 | 从头来 | 从中断点继续 |
| 人参与度 | 要么全程盯,要么全放手 | 关键节点检查,中间自动 |
工作流成熟度对比
| 成熟度 | 上下文管理 | 计划 | 验证 | 复盘 |
|---|---|---|---|---|
| L0 - 原始 | 全靠 prompt | 无 | 无 | 无 |
| L1 - 有约束 | 项目文件 | 口头约定 | 手动跑命令 | 口口相传 |
| L2 - 结构化 | 任务卡片 | 书面计划 | 自动化验证 | 写入文档 |
| L3 - 循环化 | 自动加载 + 按需注入 | Agent 生成 + 人确认 | 验证循环内置 | 自动沉淀为 Skill |
什么时候不要让 Agent 自动推进
不是所有任务都适合让 Agent 端到端自动执行。以下场景应该让 Agent 做探索、梳理和方案比较,但不直接进入写文件阶段:
- 需求目标仍在变化,团队还没达成共识
- 涉及生产数据或用户隐私,误操作代价不可逆
- 需要跨团队确认接口契约,Agent 没有信息源
- 验证环境不可用(依赖未就绪、第三方服务宕机),且没有替代检查手段
- 安全敏感区域(鉴权、加密、支付逻辑),需要人逐步审查
这些场景不是不能用 Agent,而是要把 Agent 的角色从「执行者」切换为「分析者」。让它读代码、找问题、列方案、做对比,但最终修改由人来决定。
团队采用路径与质量指标
先把 Agentic Coding 工作流用在低风险、可验证的任务上——修 lint、补文档、整理测试失败、实现小型功能。等团队积累足够样例和信心后,再扩大到跨模块功能和长期自动化。
可以用四类指标观察采用效果:
| 指标 | 含义 | 观察方式 | 健康值参考 |
|---|---|---|---|
| 返工率 | 同一任务需要人工纠偏的次数 | PR 评论、任务日志 | < 20% |
| 验证覆盖 | 是否运行了匹配风险的检查 | 交付报告 | 100% 关键任务 |
| 变更集中度 | diff 是否只改相关文件 | diff 范围审查 | > 80% 相关 |
| 接管成本 | 人能否从中途理解并继续 | 计划和摘要质量 | 5 分钟内理解 |
这些指标比「Agent 生成了多少行代码」更接近真实的工程价值。返工率高说明上下文或计划阶段有问题;验证覆盖低说明团队还在「信任 Agent 的自我评估」;变更集中度低说明执行边界没设好;接管成本高说明计划产出不够清晰。
交付前检查清单
以下清单按任务阶段分组,可以在每次 Agentic Coding 任务中逐项检查:
上下文阶段
- 项目级约束文件(CLAUDE.md / AGENTS.md)已更新到最新
- 任务相关的代码文件路径已明确列出
- 历史决策和已有约定已记录在 Agent 可访问的位置
计划阶段
- 任务目标用一句话可以清晰描述
- 约束条件(不碰什么)已显式列出
- 验收标准已定义,且可以用命令验证
- Out of Scope 已标注,避免 Agent 自行扩展
执行阶段
- Agent 的工具权限已收窄到必要范围
- maxTurns 或预算上限已设置
- Hooks 或权限规则已配置,拦截危险操作
验证阶段
- 验证命令已实际运行(不只是 Agent 声称通过)
- 验证结果已作为证据记录在交付报告中
- 验证方式与任务风险匹配(不是所有任务都需要单测,但关键路径必须有)
复盘阶段
- 本次发现的问题模式已记录
- 可复用的改进项已转化为具体行动(更新规范 / 补测试 / 建模板)
- 重复出现的问题已考虑升级为自动化(Skill / Hook / 模板)
小结
Agentic Coding 工作流的本质是把「写 prompt 碰运气」变成「设计循环工程」。上下文让 Agent 看到全貌,计划在动手前暴露假设,执行阶段控制变更范围,验证提供交付证据,复盘把经验变成可复用资产。这五个环节形成的循环不是一次性的,而是随着每次任务不断加固——项目文件越来越精准,任务模板越来越成熟,验证手段越来越自动化。
最终决定 Agentic Coding 效果的,不是你用了多强的模型,而是你的工作流能不能让模型在正确的边界内、用正确的方式、做正确的事。
参考资料
Footnotes
-
Anthropic. 2026 Agentic Coding Trends Report. 2026. ↩
-
DeepLearning.AI. Spec-Driven Development with Coding Agents. Course. ↩ ↩2
-
Addy Osmani. Loop Engineering. Blog, June 2026. ↩ ↩2
-
Anthropic. How the Agent Loop Works - Claude Code Docs. Official Documentation. ↩ ↩2
-
美团技术团队. AI Coding 与单元测试的协同进化:从验证到驱动. 2025. ↩