AI开发

从AI指令式开发到规范驱动工 程化

2.6万字 约129min
416阅读

一、AI指令式开发及其陷阱

1.1 最初的 AI 开发流程

今年依托 AI 完成了两个 Vue + Node 全栈项目并成功上线。摸索出一套完整的 AI 开发链路:有产品想法后,先让 DeepSeek 发散思路、然后提出建议完善计划、输出项目计划书,再将完整方案直接交给 CodeBuddy 落地编码。代码生成完成后,通过浏览器直观验收效果,针对页面报错、功能异常反复迭代修改,多轮调试后完成项目上线。这套流程可以跑通,意味着我们已经可以使用AI完成初级的项目从计划到开发再到上线了。但复盘了两个上线项目后发现,这套模式存在结构性、根本性的缺陷:整个开发链路高度依赖「单人决策 + 单一主智能体」,无职责分离、无独立校验、无标准化约束,本质是粗放的人工驱动模式,这是典型的AI指令式开发。

1.2 AI指令式开发的核心陷阱

AI指令式开发看似是极速落地的开发模式,背后藏着三个致命问题,也是后期 Bug 频发、维护成本飙升的根源。

第一:需求方案是描述性的,而非可验收的。

AI 生成的项目计划书,只会定义「要做什么」,不会定义「做到什么标准才算合格」。比如方案只会写「实现账号登录功能」,但不会明确边界规则:空输入禁用提交按钮、非法格式实时校验、密码错误脱敏提示、高频错误账号锁定等核心细节。当我们直接把模糊方案交给 CodeBuddy 时,AI 会默认需求已经完全闭环,直接启动编码工作,最终产出的代码必然缺失大量边界逻辑。

第二:验收靠主观体感,而非标准化验证

过去判断功能是否完成的标准非常简单:页面能打开、主流程能跑通,就算验收通过。但真实业务的边界场景、异常处理、并发冲突、容错机制,完全没有系统性覆盖。这些被忽略的隐性问题,不会在开发阶段暴露,只会在项目上线后转化为用户投诉、线上报错、半夜紧急修 Bug,极大拉高了运维和迭代成本。

第三:实战经验碎片化,无法沉淀复用。

我们能清晰感知到「CodeBuddy 容易遗漏接口异常处理」「AI 代码缺少边界校验」等问题,但无法系统化总结根因,更无法形成可复用的规范。每开启一个新项目,都要重复踩坑、重复试错,经验无法沉淀为团队、个人的工程资产。这并非工具本身的缺陷,而是交互模式的底层问题。传统「我指令、AI 执行」的指令式开发,适配的是快速试错的小需求;而企业级、可维护的 AI 开发,必须切换为规范驱动模式:提前定义标准、明确验收规则,让 AI 按规格落地,让人独立校验结果。

1.3 核心模式对比:指令式 VS 规范驱动

两种模式的本质差异,是「事后补救」与「事前约束」的工程思维差距; 模式转变的核心真谛:把质量判断、标准定义,从执行之后提前到执行之前。

维度指令式开发规范驱动开发
输入依据模糊想法 + 粗略计划书可落地 Spec + 严格接口契约
AI 角色定位被动执行人工指令按规范生成、按契约对齐、按标准验收
质量保障时机代码生成后,人工事后审查代码生成前,提前定义完成标准
可维护性逻辑依赖事后修补、迭代救火依赖事前约束、标准化落地
经验沉淀方式碎片化、不可复用、无法传承固化为项目 Rules、Spec 模板、工程规范

二、核心概念厘清

在讲具体方法之前,我们需要先把后面会用到的核心概念过一遍。这些名词在文档和社区里频繁出现,但很少有人把它们之间的关系讲清楚。我会尽量简短解释每个概念,重点说明它们各自解决什么问题、以及和相邻概念的区别。 如果你想深入了解每个概念的底层机制、配置方式与适用场景,文末附带独立文章链接。

2.1 模型、Harness、智能体

1、模型(纯大脑,只会想、不会动)

模型即大语言模型,例如 Claude Opus、GPT-5.5、DeepSeek V3。它的本质是文本的输入和输出。你问它“怎么写一个 Vue 组件”,它会给出代码建议,但它无法自行修改文件、运行测试、查看报错。模型是大脑,但没有手,它能告诉你怎么做,自己无法帮你做。

2、Harness(让大脑能稳定干活的整套操作系统)

Harness 是模型之外的全部基础设施。微软 Agent Framework 的官方定义:Agent Harness 是运行时脚手架,负责把语言模型转化成可以执行工作的 Agent。它包含以下组件:

  • 工具:让模型能读文件、写代码、执行命令。Cursor、CodeBuddy 插件、GitHub Copilot 提供的基础执行能力都属于这一层。工具解决“能做什么”。
  • Rules:始终生效的约束,回答“在这个项目里,我们永远怎么做事”。
  • Skills:按需加载的操作手册,回答“这类任务按什么步骤做”。
  • Memory:自动积累的经验笔记,回答“上次发生了什么”。
  • 编排逻辑:决定谁来做、怎么协调。Subagents、Agent Teams、Workflows 都是编排层的实现。
  • MCP / A2A:工具连接层和跨智能体通信层,解决“怎么连外部世界”“怎么把任务委派给别的 Agent”。
  • Hooks:强制执行层,回答“必须发生什么”。

完整公式:Agent = Model + Harness。

3、智能体 Agent(会思考、会动手、会闭环干活)

智能体是模型加上 Harness 之后形成的完整形态:拿到一句模糊需求,它可以自主思考分析、拆解任务、规划步骤、调用工具、校验结果,发现问题后迭代调整。你只需要说“帮我实现登录功能”,它会自行判断优先读取哪些文件、先写前端还是后端、完成后如何验证。用计算机架构类比更容易理解:

  • 模型是 CPU:提供原始推理能力
  • 上下文窗口是内存:有限、易失的工作记忆
  • Harness 是操作系统:负责整理上下文、提供工具调用接口、管理记忆与任务编排
  • Agent 是一台完整的计算机:CPU 加上操作系统,组合起来才能运行

打个比方:模型是大脑,Harness 是操作系统和工具箱,智能体是能独立干活的人。大脑提供推理能力,Harness 提供执行环境,两者组合起来才形成智能体。

工具和智能体的核心区别在于自主规划能力。 工具能执行,但不会自己决定“先做什么、后做什么”;智能体能拆解任务、规划步骤、判断依赖关系。这个“规划”能力,来自 Harness 里的编排逻辑。

4、三个层次在真实产品中的对应关系

  • 模型:Claude、GPT、Gemini、DeepSeek、Qwen、GLM、Kimi、Llama、Mistral、Grok、Doubao、Hunyuan、Pangu、MiniMax、ERNIE、MiMo、Spark、Step、SenseNova、Command、Gemma、Phi
  • Harness(开源) :DeepSeek Harness、Codex Harness、LangChain Deep Agents、OpenCode、Pi、Reasonix、Hermes、OpenClaw、Grok Build、Amp、Cline、Muse Code
  • Harness(商业/运行时) :Claude Code、GitHub Copilot、Harness AI 3.0
  • 智能体·CLI Agent:Claude Code、Codex CLI、Gemini CLI、Aider、Goose、Amp、OpenCode、Qwen Code、Kimi Code、Plandex、OpenHands、SWE-agent
  • 智能体·IDE 原生 Agent:Cursor、Windsurf、Zed、Kiro、Trae、JetBrains Junie
  • 智能体·IDE 插件/扩展:GitHub Copilot、CodeBuddy 插件、通义灵码、Cline、Continue、Cody、Tabnine、Codeium、Amazon Q Developer、JetBrains AI、文心快码、Augment
  • 智能体·云端长跑 Agent:Devin、Codex Cloud、Cursor Cloud、Copilot Coding Agent、Replit Agent、Bolt.new、CodeBuddy NPC、Manus、Jules、Qoder、Google Antigravity
  • 智能体·PR Review Agent:CodeRabbit、Greptile、Cursor Bugbot、Qodo、Sourcery、Codacy、Sourcegraph Amp Review
  • 智能体·开源自主 Agent:OpenHands、SWE-agent

这些产品本质上都是专用人工智能(ANI),不是 通用人工智能(AGI)。它们的能力边界受限于 模型、Harness 的配置——配置了哪些工具、哪些 Skills、什么编排逻辑,决定了它能做什么、不能做什么。

2.2 Rules、Skills、Memory:智能体的三层知识体系

智能体存在一个核心矛盾:它需要掌握大量项目知识,但上下文窗口容量有限。如果把所有规范、流程、项目背景全部塞进系统提示词,会稀释模型注意力,降低执行效果。Rules、Skills、Memory 就是用来解决这个矛盾的三层机制。

1、Rules 是项目的“宪法”

解决是:在这个项目里,我们永远怎么做事。 核心特征是始终生效。规则内容会自动追加到每一轮对话上下文的开头,AI 在生成任何代码前,就知晓项目规范。 Rules 适合存放高频、简短、可机械执行的约束:代码风格、技术栈偏好、目录结构约定。CodeBuddy 支持多层级规则:项目规则存放在 .codebuddy/rules/,纳入版本控制,可团队共享;用户规则全局生效,跨项目复用。实践约束:规则尽量控制在500行以内,过长反而稀释模型注意力。

2、Skills 是按需加载的“操作手册”

解决的是:遇到这类任务时,按哪些步骤执行。 Skills 和 Rules 最本质差异是加载时机:Rules 常驻上下文;Skills 仅当 Agent 判断任务相关时才加载。Skills 使用渐进式披露机制:会话初始只加载每个 Skill 的名称与简介(约100词);当匹配任务时,才将完整 SKILL.md 载入上下文。 Skills 适合存放多步骤可复用流程:代码审查清单、发布检查步骤、安全审计流程、故障排查手册。

3、Memory 是自动积累的“经验笔记”

解决的是:上次发生了什么。 它和人工编写的静态约束 Rules 互为补充。CodeBuddy 的 Auto Memory 系统支持跨会话持久记忆检索:用户级记忆保存在 ~/.codebuddy/CODEBUDDY.md,项目级记忆放在项目根目录 CODEBUDDY.md。 Memory 存在明显局限:如果有知识需要稳定可靠复用,应该写成 Rule,不要依赖自动生成的 Memory。记忆会不断累积、过期,甚至互相冲突。

一句话概括三层分工:Rules 管“人设与红线”,Skills 管“怎么把某类活干对”,Memory 管“记住上次的教训”。

2.3 MCP、A2A、Hooks:连接、协作与强制执行

1、MCP(模型上下文协议)

解决的是:Agent 怎么连接外部世界。 MCP 是标准化AI应用对接外部工具、数据源的开放协议。有了MCP,不必为每个AI工具单独开发数据库、Git、文件系统对接能力,协议定义统一接口。MCP基于JSON-RPC 2.0,在Hosts、Clients、Servers之间建立通信。核心能力是动态工具发现:Agent可以自动读取MCP服务暴露的工具列表与描述。CodeBuddy、Claude Code、GitHub Copilot均已支持MCP。

2、A2A(Agent-to-Agent Protocol)

解决的是:Agent 怎么和另一个 Agent 协作。 简单区分:MCP是给Agent装上“手”,用来访问文件、Git、数据库;A2A是让Agent找到“同事”,可以把任务委派给其他智能体,不需要暴露自身内部逻辑。一个实用判断:如果你打算写MCP服务来协调多个Agent,那方向错了,这类场景应该使用A2A。

3、Hooks:比Rules更强的硬约束

Rules属于软约束——它告诉AI应该怎么做,但AI理论上可以忽略。Hooks是硬约束,在Agent生命周期的指定节点强制执行shell命令或HTTP处理器,AI无法绕过。典型场景:拦截危险命令、提交前自动执行lint、写入文件前扫描敏感信息。Claude Code文档把Hooks定位为:必须发生的事情,交给Hook。放到工程实践上,Hooks补齐了一个关键认知:规范驱动不只有“告诉AI怎么做”,还包含“强制AI必须做到”。

2.4 Subagents、Agent Teams、Workflows:三种编排形态

前面讲的 Rules、Skills、Memory 都是单个智能体的内部机制。当任务复杂到需要多个智能体协作时,Harness 的编排层就派上用场了。当前主流工具提供了三种编排形态,它们的核心差异在于谁持有编排计划。 这里我们讲得细一点,第四章直接讲怎么用。

1、 Subagents(子代理)

当主 Agent 遇到与某个子代理专业领域匹配的任务时,它会将该任务委派给子代理,子代理独立工作并返回结果。Subagents( 子代理 )有独立的上下文窗口和受限的工具权限,干完活把结果交回给主 Agent,中间探索过程不污染主对话。核心价值在于上下文保留——子代理在自己的上下文中运行,防止主对话被污染,同时通过专业化知识提高特定任务的成功率。

接地气的比喻 零工市场 :你家装修,需要一个人帮你盯着某个环节。你去零工市场叫了一个电工,告诉他“把厨房的插座都换成带开关的”,他干完活给你一个总结“换好了,一共 6 个,线路没问题”,然后就走。你不知道他在过程中试了几种接线方式,也不关心——你只拿到结果。

两种调用模式
1、自动模式由主 Agent 判断调用时机,子代理拥有独立上下文,执行时不污染主会话,但调用过程中不能中途干预;
2、 手动模式允许用户主动选择并完全替代主 Agent,适用于需要深度定制交互流程的场景。两者在行业里已成为通用范式——自动模式让主 Agent 自行判断何时派发,手动模式由用户明确触发。不同工具命名不同,Claude Code 用 auto / default 区分,Windsurf 用 Interactive / Automatic 区分。

两种执行方式:
1、串行执行是默认行为:主 Agent 逐轮决策——派一个子代理出去,等它回来,再根据结果决定下一步。这种方式适合有依赖关系的任务链。
2、并行执行需要显式触发。主流工具都支持并行子代理,只是触发方式不同:CodeBuddy 通过省略 subagent_type 参数进入 Fork 模式,Claude Code 通过 fork 模式创建继承完整上下文的子代理,Cursor 用 /multitask 命令启用异步并行,GitHub Copilot CLI 用 /fleet 派发并行子代理,Codex 则要求用户显式请求并行。并行执行能显著缩短多任务总耗时——传统串行模式下重构、测试、审查三个任务约需 47 分钟,并行后总耗时缩短至约 19 分钟。

Subagents 分两个级别:project 级只在当前工作区生效,user 级适用于所有项目,配置一次即可跨项目复用。

典型使用场景:代码审查、代码库探索、日志总结、单模块生成。判定标准是“只要结果,不需要讨论”。

Agent Teams( 智能体团队)

Agent Teams,可以协调多个 agent 实例组成团队协作的机制。通过共享任务列表、成员间消息通信和集中式管理完成复杂任务。一个会话作为团队领导(team-lead),负责协调工作、分配任务和汇总成果;其余成员各自独立工作,拥有自己的上下文窗口,并通过消息系统直接相互沟通 。

接地气的比喻驻场项目组:你有一个装修项目,需要同时推进水电、木工、油漆三个环节。你组了一个项目组:一个工头(Lead)负责分配任务和协调,三个工人各自负责一个环节,工人之间可以直接喊话——“我这边电线走完了,你可以开始封墙了”。工头不用传话,工人自己对进度。

和 Subagents 最本质的区别是通信拓扑:Subagents 只能向主 Agent 汇报结果,而 Agent Teams 的成员之间可以直接发消息,你甚至可以绕过领导直接 @ 某个成员对话。团队成员共享一个任务列表,任务有三个状态(待处理、进行中、已完成),支持依赖关系——某个任务依赖的前置任务没完成,它就不能被认领。

Token 消耗显著高于单会话,因为每个成员都是独立的完整实例。成员之间不隔离文件修改,必须手动划分文件所有权,否则会互相覆盖。

典型使用场景:研究与评审(多个成员同时调研问题的不同方面,然后分享和质疑彼此的发现)、新模块开发(每个成员负责独立模块)、竞争性假设调试(并行测试不同假设)、跨层协调(前端、后端、测试各由不同成员负责)。判定标准是“任务需要协商和讨论,且可以拆成互不重叠的文件范围”。

Workflows(动态工作流)

Workflows是一段 JavaScript 编排脚本,可以在后台调度数十甚至数百个子代理协作完成任务。 脚本本身可读、可改、可重跑,包含agent()、parallel() 等调用,每次 agent() 都派出一个独立子代理工作;脚本拿到中间结果后,可以分支、可以并行、可以再投递给下一批子代理。

接地气的比喻固定流水线:你要批量处理 500 个文件。你不会一个个叫零工,而是写一份施工计划:第一步派 10 个工人同时扫描前 50 个文件,第二步把结果汇总,第三步对发现问题的文件派 3 个工人交叉验证,第四步生成报告。计划写好后,你不在现场盯着,流水线自己跑。每个工人干完活,结果自动传给下一个环节。

Workflows 和 Subagents、Agent Teams 最本质的区别是“谁持有编排计划”。Subagents 和 Agent Teams 的下一步动作都由主agent逐轮决策,所有中间结果都落进上下文窗口;而 Workflow 把循环、分支、中间结果都交给脚本本身管理,主agent的上下文里只剩最终答案。

这意味着编排逻辑可读、可改、可重跑。Workflow 脚本保存在 session 目录下,你可以打开阅读它的逻辑。如果某个编排流程你会反复使用(比如每次分支都跑的审查流程),可以用 /save-workflow 保存为项目级或用户级命令,之后用 /名字 直接调用。

Workflows 支持对抗性验证:可以让独立代理在报告之前对彼此的发现进行审查,或从多个角度起草方案再相互权衡,单次结果的可信度比“一遍过”高得多。

典型使用场景:全 monorepo 的接口契约巡检、一组 issue 的批量分诊、跨多个仓库的交叉印证调研、大型迁移。判定标准是“任务规模大、需要对抗验证、且流程可复用”。

一句话区分三者

1、Subagents 是“叫个零工来干活,干完汇报”——主 Agent 逐轮决策,结果汇总回主上下文。
2、Agent Teams 是“组个项目组,工人之间能互相喊话”——领导协调,成员自行协商,共享任务列表。
3、Workflows 是“写份施工计划,流水线自己跑”——脚本持有编排逻辑,中间结果存在脚本变量里,不占用主对话上下文。

使用这三种形态的前提是:Craft 主 Agent 已经判断“这个任务需要协作”,或者你主动触发。我们平时在对话框里直接说需求、改 Bug,用的是 Craft 主 Agent 模式,它自己规划、自己执行、自己验证,相当于一个人单线程干所有活,不属于这三种编排形态中的任何一种。 这些编排模式不是 CodeBuddy 独有的。Claude Code 有几乎完全对应的三件套,Cursor 有异步子代理和 worktree 隔离,Codex 有并行多 agent 支持,GitHub Copilot 有自定义代理和 handoff 链。我在第四章会详细展开它们的适用场景和实操方式。

2.5 Spec:这次做什么、怎么算做对了

Spec 属于任务输入层的核心工件,解决的是:这次任务要做什么,怎么才算完成、做对。 它和Rules、Skills不在同一层级:Rules、Skills是长期可复用资产;Spec是单次功能交付的输入。

一份合格Spec包含:摘要(一两句话描述功能)、用户故事(谁、要做什么、目的)、验收标准(可测试、可观察条件)、功能需求、非功能需求、边界条件。 验收标准必须是可观察事实。例如写“无效订阅源URL会展示明确错误提示”,而不是模糊描述“系统要妥善处理错误”。

Spec定义“做什么”,Plan定义“怎么做”,二者需要分离。你投入撰写Spec的精力,应当和手动开发这个功能相当。这部分实践细节,第三章展开。

2.6 AI 代码质量的真正敌人:不是写不对,是审不出

大众普遍存在一个认知误区:认为 AI 天生容易写出烂代码、漏洞代码。但 2025 年多项工程实证研究给出了相反结论:在常规业务场景下,AI 生成代码的缺陷率、复杂度、规范性,并不劣于人工手写代码。AI 开发真正的质量危机,不是生成能力差,而是人类审查机制失效。传统人工编码存在天然质量闸门:看不懂就写不顺、写不顺就会自查、逻辑不通不敢提交。但 AI 输出的代码天生工整、命名规范、结构自洽,极易让人产生「解释深度错觉」——看似完全读懂,实则忽略了隐性边界、异常分支、架构偏差、并发漏洞,直接放行合并。这就是 AI 项目 Bug 隐性爆发的根源:问题不在编码环节,而在审查环节的松懈与缺失。因此,现代 AI 工程的质量校验,早已从「开发结束后的末端卡点」,升级为全流程持续验证体系:自动化 Lint、单元测试、对抗式独立审查、端到端工作流校验,缺一不可。质量不再靠人工体感,而是靠工程体系兜底。

2.7 规范驱动:解决技术债扩散的唯一解药

AI 开发最大的工程风险,不是单文件代码不整洁,而是高速迭代带来的架构漂移与技术债扩散。人工开发速度慢,问题是点状、可控的;但 AI 生成代码效率极高,一旦没有前置约束、统一规范,每一次迭代都会把不标准写法、不统一架构、不严谨逻辑批量扩散到整个项目,后期重构与修复成本呈指数级上涨。规范驱动开发的核心变革,一句话讲透:把质量治理从「事后修补」,彻底提前为「事前定义、事中约束、全程可校验」。规范驱动不是堆砌文档、不是形式主义,而是将验收标准、边界条件、接口契约、架构约束、项目红线,全部转化为 AI 可识别、可执行、可落地的 Spec、Rules、Skills。让 AI 告别「自由发挥、凭猜测编码」,转变为「按规格交付、按流程执行、按标准验收」。同时,将零散的临时提示、碎片化经验沉淀为标准化 Skills,还能彻底解决 AI 开发中最头疼的指令膨胀、上下文腐化问题,长期保持智能体执行精准、逻辑稳定、不跑偏。

2.8 这些概念怎么串起来

经过前面所有概念拆解,我们用一张总表,收束整套 Harness 工程体系。所有能力各司其职、共同构成可控、可维护的 AI 开发架构。

概念在 Harness 中的位置回答的问题
Rules系统提示词层永远怎么做、红线是什么
Skills工具/能力层这类任务按什么步骤做对
Memory记忆层上次发生了什么、经验是什么
Spec任务输入层这次做什么、怎么算做对
Subagents/Teams/Workflows编排层谁来做、如何分工协同
MCP工具连接层怎么连接外部工具与资源
A2A跨智能体通信层怎么把任务委派给其他 Agent
Hooks强制执行层流程必须执行、不可绕过的约束

大模型决定 AI 的脑力上限,而 Harness 整套工程体系,决定了 AI 开发项目的质量下限和可维护性上限。从指令式开发走向规范驱动开发,本质就是从依赖模型玄学,走向可控、可沉淀、可复用的工程体系。如果你想深入了解每个概念的机制、配置方式和适用场景,我单独写了一篇《AI 应用开发核心概念与词汇扫盲》。下面直接进入正题:怎么从「扔想法」转向「写规格」。

三、思维跃迁:扔掉模糊计划书,落地标准化 Spec

前两章中,我们区分了「指令式开发」与「规范驱动开发」的本质差异,也厘清了模型、Harness、Rules、Skills、Spec 等整套 AI 工程底层体系。绝大多数人 AI 开发翻车、项目越做越乱、Bug 源源不断、迭代越改越崩,根本原因不是不会写代码,而是开发启动前没有定义清楚合格标准。传统人工开发可以靠经验兜底,但 AI 开发极度依赖前置约束。没有标准,AI 就只能靠模型概率“猜需求”,开发者只能靠肉眼体感“做验收”。而 Spec 驱动的核心价值,不是让代码写得更快,而是让每一次开发都可验证、可追溯、可维护、可迭代。把质量标准从事后补救,提前为事前定义;把主观感觉的验收,升级为客观标准的清单。这就是规范驱动 AI 工程体系的核心基石。本章我们落地整套最关键的实操转型:放弃扔想法式开发,全面进入 Spec 规格驱动开发。

3.1 计划书为什么不够用

我早期的 AI 开发流程,也是业内最主流的方式:有了产品想法后,先和大模型发散梳理,然后产出一份项目计划书,再直接整段交给 AI 去写代码。这套流程虽然能快速跑通 Demo、实现业务主流程,但完全撑不起工程级、可维护、低返工的正式项目。它存在一个结构性的致命缺陷:项目计划书本质是 Plan,只回答 “要怎么做”,却不回答 “怎么算做完、怎么算做对”。它只会规划模块顺序与实现步骤,但不会定义完成标准、边界规则和异常处理。最终开发者只能凭体感验收 —— 主流程能跑、页面能打开,就判定开发完成,导致所有边界场景、异常逻辑、安全约束与极端用例全部处于失控状态。而 Spec 恰好补齐了这套流程的短板:它的核心价值不是描述功能,而是定义验收标准,把模糊的主观感受,转化为客观、可测试、可逐条核对的工程落地清单。

3.2 一份可验收的 Spec 长什么样

Spec 是规范驱动开发的核心工件,拥有固定、通用、可落地、可复用的标准结构。一份合格的 Spec,必须覆盖「是什么、谁来用、做什么、怎么算对、不能做什么」。下面是可直接复用的生产级 Spec 模板以及具体如何写:

摘要:控制在一两句话,只定义功能定位,不写实现细节。作用是让人和 AI 统一认知,避免理解跑偏。示例:「用户设置页,允许已登录用户修改头像、昵称和密码,完成个人信息管理」。

用户故事:固定句式:「作为…我想…以便…」。这个句式的核心价值,是强制你写清楚使用者、行为、业务价值。写不出“以便”的功能,大概率是冗余需求,可以直接不做。

验收标准(最重要):验收标准是 Spec 的灵魂,也是后续编码、审查、测试、上线的唯一依据。每一条验收标准必须满足:前置条件明确 + 操作明确 + 结果可观察。下面是典型的优劣对比:

模糊写法(错误)可验收写法(正确)
处理密码错误密码错误时,页面顶部显示“用户名或密码错误”,不透露具体错误类型
支持头像上传选择超过 2MB 的图片时,提示“图片不能超过 2MB”,不执行上传
保证账号安全连续 5 次密码错误后,账号锁定 15 分钟,期间正确密码也无法登录

模糊写法的通病:没有对错判定标准,AI 怎么写都不算错,你永远无法彻底验收。可验收写法的核心:任何人拿着标准,都能统一判断通过或不通过。

功能需求:和验收标准互为补充。验收标准是「用户视角的表现」,功能需求是「系统视角的规则」。例如验收标准是“密码错误统一提示”,功能需求是“用户密码必须经过 bcrypt 哈希存储,禁止明文保存”。

非功能需求:必须量化、禁止空话。不要写“性能好、安全性高”,要写:登录接口 P95 响应 ≤ 500ms、全程 HTTPS、Token 有效期 24 小时、刷新 Token 7 天。

边界条件:AI 最容易遗漏的部分,也是线上 Bug 最多的地方。固定六个枚举维度:空值输入、格式错误、内容超限、重复并发、网络异常、权限越界。只要按这六点遍历,绝大多数边界问题都能提前覆盖。

不做什么:和“做什么”同样重要。明确排除范围,避免 AI 擅自扩展功能、过度开发,导致项目臃肿、架构漂移、需求不可控。

3.3 Spec 写作的四个技巧

Spec 不需要文采,只需要规范。掌握四个技巧,就能写出工业级可验收规格。

  • 技巧一:统一使用「当……时,应该……」句式。强制绑定场景与结果,彻底杜绝模糊描述。
  • 技巧二:每条验收标准只写一件事。不要合并多个场景。拆分后可以逐条勾选验收,问题精准定位,不会出现“半对半错”的模糊状态。
  • 技巧三:边界条件用「如果……会怎样」自问自答。针对每一个功能,逐一假设极端场景,逼自己补全边界。
  • 技巧四:不确定项标记「待定」,开发前必须清零。Spec 允许迭代完善,但禁止带着未知项进入开发。一旦存在待定,AI 会自行猜测补全规则,结果大概率偏离预期。

3.4 从需求到 Spec 的实操流程

不要自己苦思冥想写全 Spec,正确方式是「人机协同澄清需求」。

  • 第一步:禁止先写代码,先让 AI 反向提问。新开对话直接输入:我要实现 [功能描述]。先不要写代码。针对这个需求,列出你还需要我确认的边界条件和验收标准,每个问题给出你的建议选项。这一步会挖出大量你完全想不到的隐性规则。
  • 第二步:逐条确认,不模糊、不敷衍、不“你看着办”。你一旦说“你看着办”,AI 一定会选择最省事、最不严谨、最不安全的实现方式。不确定的内容标记待定,开发前统一清零。
  • 第三步:整理成文件,纳入版本控制。在项目根目录建立 specs/ 文件夹,每个功能一个 md 文件。Spec 和代码同等重要,需求变更必须先改 Spec,再改代码。

3.5 让 Spec 真正约束 AI

只写 Spec 没用,默认情况下 AI 不会主动读取和遵守。必须通过 Rules 将 Spec 变成强制约束。在 .codebuddy/rules/ 新建 spec-driven.md。配置完成后,新开对话测试:让 AI 实现对应功能,先读 Spec、再写代码即代表规则生效。

3.6 让独立验证更可靠

验证是 Spec 驱动中最容易被跳过、也最不能跳过的环节。原因很简单:生成代码的 AI 和验证代码的 AI,不能是同一个会话。 自己评自己永远偏正面——它知道自己为什么这么写,会默认自己的实现是合理的。独立验证者没有这层心理包袱,它只拿着 Spec 逐条对照,看到的只是代码实际写了什么。 独立验证的核心操作只有一条:开一个干净的新会话,不继承生成阶段的任何上下文。

验证发现的问题分三类处理

验证过程中发现实现和 Spec 不一致,不要直接改代码。先判断是哪种类型的不一致,再决定改哪个。

  • 第一类:Spec 错误。 验收标准本身写得不对,或者和实际需求有偏差。处理方式是先改 Spec,再改代码。
  • 第二类:实现错误。 代码不符合 Spec 的要求。处理方式是直接改代码,不需要动 Spec。
  • 第三类:Spec 遗漏。 验证时发现某个行为 Spec 里没写,但实际需要处理。处理方式是先补 Spec,再改代码。

验证频率按风险分级

完整行为验证的成本不低,如果每个任务都做,整体效率会被拖慢。把验证资源集中在高风险任务上,才能在质量和效率之间取得平衡 。不需要每个任务都做完整的端到端验证。按任务风险分级:

  • 高风险任务(涉及资金、权限、数据安全、核心流程):必须做完整的行为验证,验证者需要实际运行环境,逐条走查所有验收标准。
  • 中风险任务(普通业务功能、用户交互):做静态检查加关键路径的行为验证。不必逐条走查全部验收标准,但核心路径必须实际跑通。
  • 低风险任务(文案调整、样式微调、配置变更):静态检查即可。让 AI 读一遍代码,确认改动符合 Spec 中对应的验收标准就行,不需要实际运行。

3.7 Spec 的边界:管什么、不管什么

很多人写 Spec 要么太泛、要么太死,核心边界只有一句话:Spec 管结果和标准,不管实现和过程。Spec 只定义“做什么、怎么算对”,不定义“具体怎么写、用什么方案”。写太细会锁死 AI 优化空间,让架构和代码强耦合。同时要分清四大工程工件的层级关系: 通用约束放 Rules、单次需求放 Spec、流程步骤放 Skills、经验教训放 Memory,互不重叠、各司其职。

工件内容定位生命周期
Spec本次功能的需求、边界、验收标准单次功能周期
Rules项目永久编码红线、规范长期全局生效
Skills可复用流程、审查步骤、标准动作按需加载复用
Memory历史经验、踩坑记录、项目偏好动态积累

3.8 完整案例:用户设置页 Spec 落地全流程

本节用真实项目的「用户设置页」,完整走一遍从需求澄清、Spec 定稿、任务拆分、开发验证到上线归档的全流程。每个阶段都有具体的操作、产出和判断依据,读者可以照着做。

阶段一:需求澄清,让 AI 先提问

  • 操作:新开一个对话,输入需求描述,明确要求 AI 先不要写代码,而是列出需要确认的边界条件和验收标准。"我要实现用户设置页,已登录用户可以修改头像、昵称和密码。先不要写代码,列出你还需要我确认的边界条件和验收标准,每个问题给出你的建议选项。"
  • 产出:AI 列出了 12 个需要确认的问题,包括头像格式和大小限制、昵称长度限制、密码修改要不要验证旧密码、修改成功后要不要重新登录、接口失败怎么提示。
  • 操作:逐条回答,不确定的标记“待定”。回答时不要用“你看着办”,否则 AI 会选最省事的实现。

阶段二:Spec 定稿,完整文件结构

Spec 管“做什么”和“怎么算做对”,不管“怎么做”。功能需求写“密码必须哈希存储”,不写“用 bcrypt 具体怎么实现”;验收标准写“密码错误时显示统一提示”,不写“用 try-catch 捕获错误”。 把澄清结果整理成 specs/user-settings.md。下面是一份完整的 Spec 文件结构:

阶段三:可行性检查,修正 Spec 矛盾

Spec 初稿写完后,先让 AI 读一遍,检查三个问题:有没有互相矛盾的要求?有没有技术上做不到或成本过高的?有没有遗漏的依赖? 这个阶段改 Spec 只要五分钟,写完之后再发现要改代码,可能要半天。可行性检查是成本最低的修正时机。 AI 排查出两处冲突:

问题原 Spec冲突原因修正后
头像更新上传后立即更新后端接口为异步,无法即时获取上传成功后刷新获取新头像 URL
改密后行为强制重新登录现有架构不支持强制下线刷新 token,不强制登出

阶段四:拆任务、标依赖、定顺序(含并行调度)

让 AI 根据 Spec 拆分任务清单,每个任务标注依赖关系、文件范围、对应的验收标准、同时判断哪些任务可以并行。

任务依赖文件范围对应验收标准可否并行
后端接口无server/routes/settings.js6、8、13✅ 可与昵称组件并行
前端头像组件后端接口src/views/Settings/AvatarUploader.vue1-5❌ 依赖后端
前端昵称组件无src/views/Settings/NicknameEditor.vue6-8✅ 可与后端并行
前端密码组件后端接口src/views/Settings/PasswordEditor.vue9-13❌ 依赖后端
集成测试全部组件tests/settings.spec.ts1-14❌ 依赖全部

阶段五:按依赖顺序生成代码(含并行调度)

按依赖拓扑排序执行。无依赖且可并行的任务同时启动,有依赖的任务等前置完成后启动。 并行执行的前提是文件所有权不重叠。如果两个任务改同一个文件,必须串行执行,否则会互相覆盖。Agent Teams 的成员之间不隔离文件修改,必须手动划分文件所有权。在拆任务阶段就把文件范围标注清楚,执行时严格按照标注分配,是避免冲突的关键。

如果你使用的是支持 Agent Teams 或类似协作机制的工具,可以用更结构化的方式描述团队分工:"创建一个团队:一个成员负责后端接口 server/routes/settings.js,一个成员负责前端昵称组件 src/views/Settings/NicknameEditor.vue。两者文件不重叠,不需要协商。后端接口完成后,@前端头像组件成员和@前端密码组件成员分别开始工作。"

到这里,需求已经澄清、Spec 已定稿、任务已拆分、代码已生成。接下来四个阶段全部围绕“验证”展开:先逐模块验证,再端到端验证,再根据验证结果决定改 Spec 还是改代码,最后归档。

阶段六:逐模块独立验证

每个模块写完后,立刻在隔离环境中验证它自己负责的验收标准。 不要等全部写完再验证。 这个阶段的核心是尽早发现问题。一个模块写完立刻验证,比全部写完再验证,返工量少得多。但验证的粒度是“模块级”,完整功能——端到端验证放到下面。前后端功能模块验证示例:

阶段七:全新会话端到端独立验证

所有模块完成后,开一个干净的新会话,在真实运行环境中验证完整用户路径。 验证者需要拿到三样东西:Spec 文件、实现代码、运行环境。验证者打开浏览器,逐条执行 14 条验收标准,输出结构化报告:

阶段八:先改 Spec,再改代码

  • 操作:验证发现的问题,先判断是 Spec 错还是实现错,再决定改哪个。 "本次验证发现的问题属于“Spec 错误”——原 Spec 写“昵称清空后提示不能为空”,但实际交互是直接禁用提交按钮,用户无法触发提交。这不是代码错误,是 Spec 不合理"
  • 修正:先把 Spec 第 7 条改成“昵称清空后,提交按钮禁用,输入框出现视觉警示”,再让代码对齐新规则。
  • 关键原则:Spec 始终是唯一事实来源,代码向 Spec 对齐,而不是 Spec 向代码妥协。

阶段九:Spec 归档入库

  • 操作:全部验收通过后,Spec 提交 Git,和代码放在同一个 commit 里。后续需求变更,先改 Spec,再改代码。
  • 产出:specs/user-settings.md 成为这个功能的唯一事实来源。后续如果产品经理说“昵称长度改成 30 字符”,先改 Spec 第 6 条,再让 AI 按新 Spec 重新生成。新人接手时,Spec 就是最好的功能文档。

如果改造的是存量功能,还需要做对等验证。 本节案例是新建功能,不涉及原有行为。但如果你改造的是一个已经上线的旧功能,需要在改造前先记录它的当前行为——输入什么、输出什么、什么情况下报错。改造完成后,用同一组输入跑一遍新实现,对比输出是否一致。

怎么记录当前行为: 打开浏览器,把核心路径手动走一遍,记录每一步的输入和输出。如果原有代码有测试用例,直接跑一遍,把结果保存下来。

怎么对比: 改造完成后,用同一组输入跑一遍新实现。如果原有测试用例还在,直接跑;如果没有,手动走一遍核心路径,逐条对比输出是否一致。不需要覆盖所有场景,但核心路径和关键边界条件必须覆盖。

对等验证是存量项目改造最大的风险点——新功能不对可以再改,但原有行为被破坏,可能上线后才发现,修复成本高得多。

3.9 落地实操指南

前面八节分别讲了 Spec 的写法、约束、验证和完整案例。这一节把所有落地相关的内容收拢到一起,方便你直接照着执行。

目录与版本管理

Spec 统一放在项目根目录的 specs/ 下。功能少时扁平存放,功能多时按模块分组(specs/auth/、specs/user/)。命名用 功能名.md 或 编号-功能名.md,保持一致性比选哪种更重要。功能上线后 Spec 不删除,需求变更时先改 Spec 再改代码,两者放在同一个 commit 里提交。每季度审查一次 Spec 目录,超过半年没更新且功能已稳定的归档,和代码不一致的更新或删除。

依赖管理与评审机制

一个功能往往依赖另一个功能。在每个 Spec 文件顶部加 dependencies 段落,写清楚依赖哪个 Spec 的哪个接口或数据结构。按依赖拓扑排序执行,被依赖的先做。如果两个 Spec 互相依赖,说明拆分有问题——应该合并或重新划分边界。

评审机制分两种:个人项目隔一天再看一遍,刚写完时你觉得每句话都清楚,隔一天再看往往会发现模糊点;团队项目让至少一个其他人评审,核心任务是回答“我能不能看懂每条验收标准并判断通过还是不通过”。评审聚焦三个重点:验收标准是否可测试、边界条件是否完整、功能需求和用户故事是否一致。评审意见写在 Spec 文件末尾的“评审记录”段落里。

效果度量

用四个指标判断 Spec 驱动有没有真正起作用:

  • 返工率:因需求没写清楚而返工的次数,应明显下降。
  • 验收标准覆盖率:上线前通过独立验证的验收标准比例,理想是 100%。长期低于 80% 说明 Spec 写得太粗或验证不到位。
  • Spec 修改频率:开发中 Spec 被修改的次数。过高说明前期澄清不够,过低说明 Spec 可能只是形式。
  • 验证发现问题的类型分布:“实现错误”占多数说明 Rules 约束不够,“Spec 错误”或“Spec 遗漏”占多数说明 Spec 本身的质量需要提升。

不需要精确统计,用一两周记录就能看出趋势。四个指标都在向好,说明流程在起作用;某个指标持续恶化,针对性地调整。

与其他方法论的关系

Spec 驱动和 TDD、BDD、ADR 不冲突,是互补关系:

  • TDD:Spec 的验收标准可以直接转化为测试用例。Spec 定义“应该表现什么”,TDD 的测试验证“实际表现什么”。
  • BDD:BDD 的 Given-When-Then 句式和 Spec 的验收标准句式(“当……时,应该……”)本质相同,区别在于 Spec 还直接用于约束 AI 生成和独立验证。
  • ADR:ADR 记录架构决策的理由,Spec 记录功能需求和验收标准。ADR 放 docs/adr/,Spec 放 specs/,两者共存。

Spec 驱动的价值不是取代已有工程实践,而是在 AI 开发场景下补充了一个环节:把“怎么算做对了”从模糊感觉变成可执行清单。

常见失败模式与避坑

必须由人决策的内容:功能范围、验收取舍、安全性能底线、Spec 变更确认。其余实现、枚举、验证、修复可交由 AI。判断标准:如果一个决策会影响“什么算做对了”,它必须由人决定;如果只影响“怎么做”,可以交给 AI。

五种常见失败模式:

  • Spec 沦为形式:提交后从未被引用。判断信号:Spec 文件提交后没有在开发中被读取过。
  • 验收标准不可测试:写了“界面要美观”这类无法判断的标准。判断信号:独立验证时验证者无法给出明确结论。
  • Spec 和代码双向漂移:代码改了 Spec 没改。判断信号:验证时频繁发现“代码和 Spec 对不上”。
  • 过度依赖 Spec 丧失灵活性:需求变更时坚持“先改 Spec”导致响应变慢。判断信号:Spec 变成了阻碍而不是工具。
  • Spec 数量膨胀无人维护:大量过时 Spec 留在仓库里。判断信号:specs/ 目录里有超过半年没更新也没有归档的文件。

第四章 多智能体协作——从认知到判断

在第二章中,我们已经厘清了 Subagents、Agent Teams、Workflows 三种智能体编排形态的核心定义与基础差异,但知晓概念不等于具备落地能力,绝大多数开发者都卡在同一个瓶颈:能分清三种形态是什么,却不知道在真实项目里该不该拆分、怎么拆分、该用哪一种。本章将补齐这一关键实践闭环,通过三组真实对照实验,直观验证多智能体形态的适用边界、落地前提与典型踩坑点,并沉淀出一套可直接复用的智能体拆分判断框架;同时我们必须明确:多 Agent 不是开发标配,只是工程工具箱里的一种工具,有明确的适用范围与固有弊端,拆分从来不是目的,合适才是,盲目堆叠多智能体只会造成协调成本飙升、上下文割裂、逻辑冲突等问题,最终效果反而不如单 Agent,因此本章的核心目标不是教你一味拆分,而是帮你建立落地判断力:精准区分什么时候该拆、什么时候坚决不拆,让你在任意项目中都能合理选择单智能体或多智能体协作方案。

4.1 先区分四种模式:从日常对话到多 Agent 编排

在开始之前,先明确一个核心立场:多 Agent 不是必须的,它只是工具箱里的一件工具,有明确的适用边界,也有实实在在的弊端。 拆分不是目的,合适才是目的。盲目堆叠多 Agent 会带来协调成本飙升、文件冲突、上下文割裂等问题,反而比单 Agent 更糟。这一章的目标不是教你“怎么拆”,而是教你“什么时候该拆,什么时候不该拆”。

我们先澄清一个最容易混淆的点:你平时在对话框里说需求、改 Bug,用的是 Craft 主 Agent 模式,不属于 Subagents、Agent Teams、Workflows 中的任何一种。这四种模式的核心区别在于 谁持有计划,以及你在哪里启动它。下面把每种模式的创建/启动方式说清楚。

Craft 主 Agent:直接对话就能用

  • 启动方式:打开Agent对话输入框,切换到 Craft 模式,或者直接在输入框里输入需求。Craft 会自主完成多文件代码生成和改写, 它自己规划、自己执行、自己验证。整个过程只有一个执行者。
  • 适用场景:日常改 Bug、写功能、单文件或少量文件的改动。如果改动逻辑上是原子的(即使跨了前后端),也应该用 Craft 在同一个上下文里一次性完成,不要拆。

Subagents:先创建,后调用

创建方式有两种:

方式一:在 IDE 设置页创建(推荐) 。打开设置页的 Agent Tab,点击 Create Agent 按钮。选中的是 User Agent Tab 则创建 user 级别的 Subagent(全局生效),反之则是 project 级别(仅当前项目生效)。

方式二:在 CLI 中创建。 运行 /agents 命令打开子代理管理界面,选择“创建新代理”,然后选择项目级或用户级,用自然语言描述这个子代理的用途和适用场景,AI 会帮你生成配置,你可以在编辑器中微调系统提示词和工具权限。

创建完成后,Subagent 存储为带有 YAML 前置内容的 Markdown 文件。项目级位于 .codebuddy/agents/,用户级位于 ~/.codebuddy/agents/。

调用方式:

  • agentic 模式:主 Agent 自动判断调用时机,当它发现某个子任务匹配某个 Subagent 的专长时,会自动派出去。这种模式下你不能中途干预,要么等它完成,要么手动中断对话。
  • manual 模式:你在 Agent 选择框中手动选中,它会完全替代主 Agent 来工作。

你也可以在对话中显式指定,比如:“用 code-reviewer 子代理检查我最近的更改”。

适用场景:聚焦型独立任务——代码审查、代码库探索、日志总结、单模块生成。判定标准是“只要结果,不需要讨论”。

Agent Teams:用自然语言描述即可创建

启动方式:不需要预先配置,也不需要写脚本。你直接在对话里用自然语言告诉 CodeBuddy 你想要什么样的团队,它会根据你的描述自动创建团队、生成成员、分配任务。

比如你说:“创建一个团队从不同角度探索这个问题:一个负责用户体验,一个负责技术架构,一个扮演挑刺者。”Agent就会创建团队和共享任务列表,为每个角色生成独立的成员,并协调各成员的工作。

调用方式:团队创建完成后,终端会显示所有成员及其状态。你可以用 @成员名 直接和任意成员对话,不需要经过领导中转。输入 @all 可以向所有成员广播消息。

适用场景:需要协商和讨论的复杂任务——全栈功能开发(前后端需要对齐契约)、跨层协调、竞争性假设调试。判定标准是“任务需要协商和讨论,且可以拆成互不重叠的文件范围”。

Workflows:加关键词或直接请求

Workflows不需要我们自己写脚本。 脚本由Agent根据你的任务描述现场生成。你要做的是两件事:第一,把任务描述清楚——比如“扫描 src/ 下所有组件的类型安全问题,对发现问题的文件派两个独立代理交叉验证,最后输出报告”;第二,脚本生成后阅读它的编排逻辑,确认没问题再运行。如果某个编排流程你会反复使用,可以保存为命名命令,之后直接调用。 它的启动方式有三种:

  • 途径一:在提示里加 ultracode 关键词。 当输入中出现 ultracode 时,CodeBuddy 会为这个任务写一份 JavaScript 编排脚本。
  • 途径二:用自然语言直接请求。 直接说“用一个 workflow 跑这个任务”,CodeBuddy 同样会为你生成编排脚本。
  • 途径三:把整个会话调到 ultracode 模式。 用 /effort ultracode 命令把 effort 等级设到最高,之后会话里每一个有分量的任务,CodeBuddy 都会先规划成 Workflow 再执行。

运行方式:Workflow 在后台运行,你的会话保持响应。脚本保存在 session 目录下,你可以打开阅读它的编排逻辑。如果某个编排流程你会反复使用,可以用 /save-workflow 保存为项目级或用户级命令,之后直接调用。

适用场景:代码库级审计、大规模迁移、需要交叉验证的研究任务。判定标准是“任务规模大、需要对抗验证、且流程可复用”。

一张表收束四种模式

模式怎么启动谁持有计划适用场景
Craft 主 Agent直接在对话框说话Craft 自己日常开发、原子性改动
Subagents先 /agents 创建,再自动或手动调用Craft 主 Agent聚焦型独立任务
Agent Teams用自然语言描述团队团队领导 + 成员协商多域可独立并行
Workflows加 ultracode 或直接请求脚本代码大规模、可复用流程

为什么要先区分这个:日常改 Bug、写功能,Craft 主 Agent 已经够用。多 Agent 协作解决的不是“日常效率”问题,而是“单 Agent 装不下”的问题——上下文太长、需要独立验证、需要并行推进。后面三个实验验证的,就是这些场景。

4.2 实验一:生成 + 独立验证,解决自评偏差

实验设计:为验证 AI 自主开发的质量盲区,我设计了一组严格对照实验:使用同一个会话的 CodeBuddy 承担代码生成角色,完整开发指定功能;再开启一个完全独立、无任何上下文继承的干净会话,让 AI 手持标准化 Spec 验收标准,对成品代码进行逐条校验、全维度审查。

为什么必须新开独立会话: 上下文共享是 AI 自查失效的核心根源。如果生成者与验证者在同一会话,验证 AI 会天然继承生成过程的前置认知,默认认可现有代码逻辑,产生自我正向偏差,最终变成“自圆其说式自查”,无法客观找错。全新会话无固有认知、无思维惯性,只会严格对标 Spec 标准,机械、客观、严苛地校验所有逻辑,最大化规避主观包庇问题。

实验结果: 生成会话仅完整实现了登录功能的核心主流程,顺利完成基础登录、页面跳转等显性能力,但完全遗漏了所有边界约束逻辑,包括“连续5次密码错误锁定账号15分钟”“异常提示统一化”等关键规则。而独立验证会话,精准抓取到所有遗漏边界、缺失规则与隐性漏洞,实现了质量兜底。

核心收获: 任何自评自查都存在天然偏差,双角色对抗验证是 AI 开发最低成本的质量保障方案。这也是 Subagents 最朴素、最高频的落地形态:无需一开始搭建复杂的多智能体架构,先跑通「单 Agent 生成 + 独立 Subagent 验证」的最小双角色闭环,就能解决 80% 的 AI 开发质量盲区,彻底告别“主流程能跑就是完成”的粗放开发思维。

工程化演进方向: 本实验对应手动独立验证的最小工程形态。后续可持续迭代为自动化质量门禁:将人工发起的独立校验,固化为自动化工作流程,代码迭代完成后自动触发 Spec 对标校验、边界巡检、漏洞筛查,实现无需人工介入的常态化质量兜底。

4.3 实验二:Agent Teams 做前后端并行,踩坑模糊契约

实验设计:为验证 Agent Teams 的并行协作能力,我尝试用该形态落地用户设置页全功能开发:拆分前后端双角色团队,前端 Agent 负责页面渲染、参数组装与接口请求,后端 Agent 负责接口逻辑、数据校验、数据库读写,开发前提前约定基础接口契约,开启双向并行开发。

核心踩坑:模糊契约等于无契约。本次实验仅约定了接口基础返回结构 { success, data },没有细化 data 内部的字段结构、数据类型、参数含义与边界规则。在无统一细化契约的前提下,前后端智能体自主推演逻辑、各自实现适配,最终出现致命偏差:前端默认 data.avatar 为纯字符串链接,后端实际返回 { url, thumb } 对象结构,字段层级、数据类型完全不匹配,直接导致联调彻底报错、并行开发成果无法复用。

核心教训:跨角色、跨端的并行协作,粗粒度的契约毫无价值。接口契约必须细化到字段级别、类型级别、边界级别,杜绝模糊结构。最优工程方案是直接使用 TypeScript 类型定义作为唯一统一契约,让前后端实现强对齐。

踩坑之后我重新做了一遍,这次跑通了。关键操作有三步:

  • 第一步:契约先写到字段级别。 不再只写 { success, data },而是用 TypeScript 类型定义作为唯一契约:interface UserProfileResponse { success: boolean, data: { nickname: string,avatar: { url: string} } }。前端和后端都拿这份类型定义作为实现依据,任何一方改契约,另一方必须同步
  • 第二步:文件所有权提前划分。 在创建团队之前,明确写出每个成员负责哪些文件:前端成员只改 src/views/Settings/,后端成员只改 server/routes/settings.js。两边文件不重叠,不存在互相覆盖的风险。
  • 第三步:完成后互相校验。 两个成员都完成后,各自检查对方的实现是否符合契约。前端检查后端返回的 avatar 是不是 { url, thumb } 结构,后端检查前端是否正确解析了这个结构。

这次跑通的核心不是“Agent Teams 变强了”,而是契约从模糊变精确、文件从重叠变隔离。同样的工具,同样的任务,改了两个前提条件,结果完全不同。

Agent Teams 适用边界(实验验证结论):只有同时满足以下三个条件,Agent Teams 才能发挥并行协作的效率优势,否则协调成本会完全吞噬并行收益:1. 任务可按文件、模块、职责清晰拆分,无重叠业务范围;2. 多角色可通过标准化契约实现强对齐;3. 各 Agent 负责的工作范围相互独立、无强耦合依赖。

工程化演进方向:本实验对应契约驱动协作的最小工程形态。后续可迭代为质量门禁的核心环节:实现接口契约自动化巡检,但凡接口结构、字段类型、返回规则发生变更,自动触发前后端契约一致性校验,提前拦截适配问题,避免联调报错。

4.4 实验三:并非所有任务都适合拆分

实验设计:为探明智能体拆分的反向边界,我尝试做反向实践:将「登录表单验证 Bug 修复」这一简单迭代任务,强行拆分为前端、后端两个独立子任务,交由不同智能体分别开发。

核心踩坑:原子性任务拆分即冗余。落地后发现,表单校验属于强耦合原子逻辑:前端输入校验规则、后端参数校验规则、错误提示文案、边界拦截逻辑必须完全统一、同步变更。强行拆分后,两个智能体各自独立修改,出现前后端校验规则错位、拦截逻辑冲突、提示文案不统一等一系列问题,原本几分钟能完成的修复,反而产生了大量协调、对齐、改造成本。

最终最优方案:放弃多智能体拆分,回退为单会话单 Agent 闭环开发,在统一上下文内一次性完成前后端的同步修改、规则对齐与逻辑校验,高效解决问题。

核心收获:任务拆分的依据,从来不是技术域,而是逻辑依赖关系。强耦合、原子性、需要多方同步变更的任务,强行拆分只会徒增成本、制造问题,无法提升效率。这类任务必须由单一 Agent 在统一上下文内闭环完成,保证逻辑一致性。

工程化演进方向:本实验对应任务拆分边界判断的最小工程形态。后续可迭代为自动化依赖分析能力:由工具自动识别任务耦合度、依赖关系,智能判定当前任务适合单 Agent 闭环,还是多 Agent 并行,从根源杜绝无效拆分。

4.5 落地判断框架:什么时候该拆,什么时候不该拆

基于三组对照实验的正反案例,我沉淀出一套三层可落地智能体拆分判断框架,无需主观经验,可直接对标场景落地。

第一层:不该拆(单 Agent 闭环)

核心判断标准:改动存在强绑定依赖,必须多方同步变更、同时生效。即便任务横跨前端、后端、测试等多个技术域,也不允许拆分,必须由单 Agent 在统一上下文内一次性闭环。典型场景:

  1. bug 修复需要同时调整前端调用逻辑与后端返回结构;
  2. 表单校验、参数拦截、错误提示等前后端必须统一的规则迭代;
  3. 接口参数、数据结构变更,需要全链路同步适配的改动。

如果你已经拆了,发现协调成本大于收益,果断回退。 实验三就是这种情况拆完之后发现前后端校验规则对不上,反复沟通的成本远高于一个人改。这时候不要硬撑着拆,回退到单 Agent 闭环,在统一上下文里一次性改完。拆分的目的是提高效率,如果拆了之后效率更低,拆分本身就错了。

第二层:按需拆分(精准匹配三种形态)

聚焦型独立任务 → 选用 Subagents任务目标单一、无需多方协商、只需最终结果,无复杂协作流程。适用于代码审查、代码库检索、日志分析、单模块独立生成、批量格式化等纯执行类场景。多域解耦可并行任务 → 选用 Agent Teams任务可按模块、文件、职责完全拆分,边界清晰无重叠,可通过统一契约对齐协作,需要轻度协商沟通。适用于前后端并行开发、多模块同步迭代、业务与测试并行落地等场景。大规模、可复用、需对抗验证任务 → 选用 Workflows任务体量庞大、流程固定可复用、需要多角色交叉校验、多层对抗兜底。适用于全项目接口契约巡检、代码批量迁移、全量规范整改、大规模测试覆盖等工程级任务。

第三层:行业通用最优拆分原则

核心切割准则(微软官方智能体设计原则):在功能接口处切割任务边界。单个智能体的输出必须是完整、独立、可直接复用的成果物,其他智能体无需关注其内部实现,仅对接输出成果即可完成协作。边际效益最优法则:行业实测数据印证,1-3个智能体协作时,项目质量提升24%,资源消耗仅增加31%,性价比达到峰值;当智能体数量超过3个后,质量提升微乎其微,但协调成本、资源损耗会大幅飙升。因此,绝大多数业务项目的智能体数量,3-5个为最优落地上限,严禁为了堆砌工程化效果盲目扩容多智能体团队。

场景判断总表

场景特征判断标准推荐形态
逻辑强耦合、原子改动改动存在强依赖,必须同步处理、统一生效单主 Agent 闭环
聚焦型独立任务只需最终结果,无需多方协商协作单 Subagent
多域可并行任务边界无重叠,可通过契约对齐,支持并行开发Agent Teams
大规模、可复用、需对抗验证体量庞大、流程固定、需要多角色交叉兜底Workflows

4.6 工程化进阶:从最小闭环到完整体系

通过第三章、第四章的内容,你已经掌握了 AI 工程化开发的最小可用闭环:以 Spec 规范驱动单 Agent 高质量开发,基于任务依赖按需启用多智能体协作,实现可验收、可追溯、低返工的开发模式。这套体系可以直接落地所有常规业务项目。在此基础上,工程化体系还有三大进阶方向,支撑大型、复杂、长期迭代项目:

  1. 验证全自动化(质量门禁)本章的独立验证仍为人工发起模式,进阶工程化可将校验逻辑嵌入 Agent 工作循环:代码修改完成后,自动触发 Lint 校验、Spec 对标、单元测试、边界巡检,发现问题自动修复、自动重试,实现无人值守的常态化质量门禁。
  2. 对抗角色多元化基础闭环仅实现「生成者+验证者」双角色对抗,进阶可拆解为多角色专项对抗:专属 Agent 负责功能实现、专属 Agent 校验 Spec 契约一致性、专属 Agent 遍历边界异常、专属 Agent 完成测试用例覆盖。单角色单点深耕,质量兜底更彻底。
  3. 记忆体系知识库化第二章提到的 Memory 是 AI 自动积累的轻量化经验,进阶工程化可将其升级为可检索、可筛选、可精准注入的结构化知识库。解决三大核心问题:跨会话状态丢失、上下文内容膨胀、无效信息污染推理,让 AI 每次开发仅加载最相关的项目经验与规范。

以上进阶内容,我已整合为《AI 开发的工程化全景:从 Harness 到质量门禁》专项内容,可供深度研习。落地核心建议:先跑通最小闭环,再追求完整体系。不要一上来堆砌全量工程化配置,避免陷入“配置繁琐、落地为空”的误区,优先掌握基础规范与协作逻辑,再逐步迭代进阶能力。

4.7 本章核心价值总结

本章完成了 AI 多智能体开发的核心跃迁:从「认知概念」升级为「场景判断」。多智能体协作的核心价值,从来不是“架构拆分得更漂亮”,而是让每一个智能体的产出可独立验证、可结构化对齐、可纳入标准化工程链路。我们通过三组实验明确了核心落地逻辑:强耦合原子任务坚决不拆分、独立聚焦任务用 Subagent、解耦并行任务用 Agent Teams、大规模流程化任务用 Workflows。同时用行业数据印证了智能体数量的最优边界,杜绝盲目堆叠的工程化伪优化,多 Agent 不是目的,合适才是目的。 工具箱里有四种模式,不代表每个任务都要用满四种。大多数日常开发用 Craft 主 Agent 就够了,只有当任务确实超出单 Agent 的能力边界时,才考虑引入多 Agent 协作。

第五章 存量项目怎么迁移

如果你已经用指令式开发做了项目并且上线了,现在想转工程化,路径和新项目不同。新项目可以从零开始按 Spec 驱动做,存量项目需要先诊断现状、补齐基线、选一个功能试点、再逐步推广。核心路径是四步:

  1. 诊断:用五个问题判断项目处于哪个阶段——有没有 Rules、有没有 Spec、出 Bug 时第一反应是什么、需求变更时怎么做、有没有跨会话的长期约束。优先看一个前提:“验得动”吗? 如果连最基本的合并前检查都没有(CI 或手动清单都行),写再多 Spec 也没法验证。这种情况下第一步不是写 Spec,是先把合并前检查建立起来。
  2. 补齐基线:从 Rules 和核心模块的基线 Spec 开始,先把“永远怎么做”和“什么算做对了”这两层约束建立起来。Rules 先写三条:技术栈约定、目录结构约定、代码风格约定。基线 Spec 先给最核心的模块补,只需要摘要、用户故事、最关键的 5-8 条验收标准。
  3. 选一个功能试点:选中等复杂度、有前后端交互、不是项目最核心的功能,走完整的 Spec 驱动流程。改造时注意对等验证——改造前先记录当前行为,改造后用同一组输入跑一遍,对比输出是否一致。存量项目改造最大的风险不是新功能不对,是原有行为被破坏。
  4. 逐步推广:新功能必须走 Spec 驱动,存量功能在下次修改时补写 Spec,不要一次性要求全部补完。推广采用双轨并行——先选一条非核心的试点链,只在这条链上强制走 Spec 驱动,其他链路仍可走旧流程。同一条链连续两轮合并前检查全绿、签收无返工,再选下一条链加入。用试点链的成功证据推动推广,而不是用行政命令强制全员转型。

完整的方法——包括诊断清单、基线 Spec 示例、对等验证操作、双轨并行的扩链条件、度量体系、七种常见失败模式——我单独写了一篇《存量项目的 AI 工程化迁移:从诊断到推广的完整路径》,想深入了解的可以点过去看。

结语

回顾整篇文章,我们完成了一次从“指令式开发”到“规范驱动工程化”的完整跃迁。

  • 第一步,我们认清了指令式开发的三个结构性陷阱: 需求不可验收、验收靠体感、经验碎片化。问题不在 AI 能不能写代码,而在我们没有把“怎么算做对了”提前定义清楚。
  • 第二步,我们厘清了核心概念。 模型是大脑,Harness 是操作系统,智能体是能干活的完整的人。Rules、Skills、Memory 是智能体的知识体系,MCP、A2A、Hooks 是连接与强制机制,Subagents、Agent Teams、Workflows 是三种编排形态。而 Spec,是这一切的输入。
  • 第三步,我们落地了 Spec 驱动。 从计划书到 Spec,本质是把 Plan 换成“可验收的清单”。写 Spec、配 Rules、做独立验证、按问题类型处理,四步跑通最小闭环。
  • 第四步,我们学会了多 Agent 的判断力。 多 Agent 不是必须的,它只是工具箱里的一件工具。强耦合原子任务不拆,聚焦任务用 Subagent,解耦并行用 Agent Teams,大规模对抗用 Workflows。3-5 个智能体是最优上限,盲目堆叠只会让协调成本吞噬收益。
  • 第五步,我们知道了存量项目怎么迁移。 诊断 → 补齐基线 → 试点 → 双轨并行推广。先让项目“验得动”,再给核心模块补 Spec,选一个非核心功能跑通完整流程,最后用试点链的成功证据推动全员转型。

AI 开发的上限由模型决定,但项目的下限由工程思维决定。 工具解决“写得快”,规范、Spec、契约、验证体系解决“写得稳、改得动、活得久”。如果你正在用 AI 开发,不妨从下一个功能开始,坚持先写 Spec,再做开发。你会发现:AI 开发真正的省时,从来不是代码生成的速度,而是少踩坑、少返工、少堆积技术债务的长期安稳。

野生小园猿
励志做一只遨游在知识海洋里的小白鲨
查看“野生小园猿”的所有文章 →

相关推荐