资讯动态

从Vibe Coding到工程化:Cursor+SDD+多Agent的AI编程实战链路

发布时间:2026/10/13 19:57:44 来源:尧图企业网站定制
这两年“Vibe Coding”几乎成了AI编程圈里最热的词有人翻译成“随缘编程”也有人调侃是“靠感觉堆代码”。说实话这个词刚流行起来的时候确实带点野路子气质打开编辑器敲一段自然语言AI哗啦一声给你生成一屏代码能跑就往下走跑不通就换一种说法再试。一个人做小工具、写脚本、搭Demo这么玩完全够用。但一旦你手里的东西要变成正经项目要上生产、要多人协作、要能回归测试、要过了几个月还能改你很快就会撞上一堵墙AI生成的速度很快但方向失控的速度更快。我身边正好有一批人报了同一个方向的训练营课程核心就是标题里那几样东西用Cursor驾驭工程化开发用SDD把模糊想法变成清晰规格再用Claude Code配合多Agent完成真实项目落地。这篇文章我就把这类训练营里反复打磨、以及后来在自己项目里实践出来的那套完整链路做一个系统性的交代。这套东西本质上是把Vibe Coding从一个“个人手感问题”升级成“工程管理问题”。它适合正在尝试用AI写业务代码的人、带小团队的开发者以及那些受够了“AI写完没人敢合代码”的接单开发者。下面我按实战链路一步步拆开讲。1. 为什么“随缘编程”会走向工程化1.1 聊天式编程的真实瓶颈我最开始也是Chat聊天式编程的重度用户。写个小爬虫、做几个数据清洗脚本直接在对话里把需求说清楚AI把代码整段吐出来复制粘贴就能跑。这种用法在前三周体验极佳直到我把同样一套方式用在一个模拟项目的完整功能模块上。问题出现了第一AI没有记忆或者说记忆非常有限。一个会话推进到一小时之后它就开始“忘记”最开始的约束条件前十分钟说好的“不允许使用全局状态”半小时后它就写了个全局单例进去。第二AI会自行假设你没说清楚的部分。你说“处理订单状态”它默认订单只能有“待支付、已支付、已取消”但你的业务里还有“退款中、部分退款”甚至“人工冻结”。这些假设一旦落到代码里改动成本极高。第三是风格不一致。同一个项目里让AI写了登录模块又让AI写了订单模块两个模块的错误处理风格完全不像同一个人写的可读性和维护性都很差评审的时候看着就头大。第四是不可回归AI改完一个函数可能会悄悄把另一个函数的行为也改了它自己根本感知不到。你问它“有没有动别的功能”它会信誓旦旦说“只改了目标文件”git diff一查偷改了三个文件。用一句话总结聊天式编程的本质是“让AI在完全没有背景信息的情况下直接写代码”这相当于你让一个外包程序员不看需求文档就开工手快是真的但产物不可控也是真的。1.2 从个人工位到团队协作的拐点一旦项目从“个人工位上的玩具”变成“团队协作中的资产”前面那些问题就不再是“小毛病”而是事故隐患。这时候就需要给Vibe Coding加上工程约束我把它们分成三层规则层Rules约束AI的行为边界。哪些能做、哪些不能做、代码风格是什么用规则文件写清楚让AI每次开工前先读。规格层SDD约束需求定义。先写清楚“要做什么、输入输出是什么、验收标准是什么”再让AI动手杜绝自由发挥。执行层多Agent Claude Code约束生产规模。一个AI干不完的活拆成多个子任务交给多个Agent并行或串行处理每个Agent持有独立上下文互不污染。这三层正好对应训练营课程的三块主线Cursor用于入口和交互SDD用于需求转规格Claude Code配合多Agent用于批量落地。没有规则和规格多Agent只会把混乱放大没有多Agent规则和规格也只能支撑小打小闹的场景。认识这个拐点很重要。很多人“AI编程学了三个月没进步”不是模型不够强而是始终停留在“单条提示词”层面缺少这个三层框架。接下来的内容我会针对每一层给出可以直接抄作业的配置和流程。2. Cursor工程化配置把AI编辑器调教成生产工具2.1 项目级规则文件词不达意的坑与正确写法很多人在Cursor里写规则第一条就写“代码要高质量、要优雅、要健壮”。这属于正确的废话AI看了毫无行动力。规则文件的核心原则是“具体优于抽象”最好写成禁令、必须、偏好三类禁令禁止使用全局状态、禁止吞掉异常、禁止手写SQL拼接。必须所有错误处理必须使用项目内自定义异常类不得使用默认的Error对象。偏好函数命名使用动词开头变量命名使用名词组件文件使用PascalCase。我实际使用过一个比较有效的项目级规则文件例如.cursorrules或RULES.md结构大致是# 项目规则 ## 项目背景 这是一个面向商家侧的经营分析工具技术栈为 React TypeScript Vite。 ## 代码行为 - 禁止使用 any 类型必须显式声明类型。 - 所有 API 请求必须经过统一的 request 封装禁止在业务代码中直接调用 fetch。 - 错误处理禁止 catch 后仅 console.log 不处理必须抛出或回退到 UI 提示。 - 组件文件采用函数组件禁止使用类组件。 ## 工作约定 - 修改代码前先解释即将修改的模块与影响范围确认后再动手。 - 若同一函数需要改动超过 3 处调用方先停下来建议重构方案不要强行打补丁。这里有一个经验值规则文件最好控制在30到60行之间。写太少覆盖不住关键边界写太多AI每次读取消耗的上下文就越大而且规则之间的冲突概率也会上升。规则文件本身要纳入git仓库改规则走评审不要一个人默默在本地改否则AI的“行为基准”就变成了只有某个人知道的暗规则。2.2 上下文管理怎么让AI只看到该看的东西Cursor这类工具的上下文窗口再大也是有限的。我习惯把上下文理解成一张办公桌桌面上堆的东西越多你想要找的那份文件就越是翻不到。常见的错误是让AI先“看一下整个项目”再开始干活。项目一大的话AI的注意力就被无关文件稀释了。我的操作习惯是“三级递进式喂上下文”第一级先给目录结构。让AI输出项目根目录的关键树状结构确定它知道全局有哪些模块但没有具体钻进去。第二级再给局部文件。用文件名引用跟当前任务直接相关的文件比如要改订单列表组件就引用src/features/order/List.tsx和src/api/order.ts。第三级复杂改动先让AI生成一份“AI行动计划”列出它将修改的文件、新增的函数、影响的调用方确认无误后再让它实际操作。这一步的收益非常直接我试过同一个需求直接甩一堆文件给AI它往往会在第8轮之后开始遗忘早期文件的约束而经过三级递进之后AI能在整个会话里稳定记住核心接口定义。还有一个很容易被忽视的小技巧每完成一个阶段性任务主动开新会话不要把多个无关改动塞在同一个长会话里。会话越长成本越高效果越差。2.3 MCP接入给Cursor增加“读数据库”的能力MCPModel Context Protocol这几年在AI工具链里几乎成了标配它让Cursor这类编辑器可以接入外部数据源和工具。我的建议是不要什么都接只接和你日常开发强相关的少数几类。举一个实际场景在做一个某垂直行业管理后台时我频繁需要AI根据数据库表结构生成查询代码。以前的做法是把建表SQL复制到对话里非常笨重。后来配置了一个只读数据库schema的MCP服务Cursor可以直接查表结构、字段注释、索引信息AI在写查询时不再瞎编字段名。MCP配置的示意如下{ mcpServers: { schema-reader: { command: npx, args: [某个工具包, --db, postgres://user:passlocalhost/dbname], env: {} } } }接入之后的体感是AI问一句“订单表有哪些字段”能直接拿到带注释的字段清单而不是靠猜。但我踩过一个坑MCP服务返回的数据本身也会占用上下文如果表太多AI会在读Schema上耗费大量tokens。解决办法是在配置层面限制只暴露当前业务域相关的表比如商家侧的脚本只读 merchant、order、product 这几张表。3. SDD规格驱动开发先写清楚再让AI动手3.1 为什么“说清楚需求”比“会写提示词”更重要训练营里有一个反复出现的现象学员抱怨“AI写出来的东西离我想要的差很远”可当导师反问他“那你到底想要什么”时他给出的描述基本是“一个订单管理页面要好看要能操作”。这种描述信息量极低AI不偏离才奇怪。SDD我这里取的是Specification-Driven Development规格驱动开发。它的核心动作是把“模糊想法”先在文档层面变成“可验证规格”再交给AI去实现。你说“登录页面要简单好看”AI无法判断什么叫“好看”。但你说“登录按钮仅保留主色样式不使用渐变按钮文案不超过四个字错误提示以toast形式出现在屏幕顶部且微信文案不超过一行”AI就知道怎么写了。这背后的逻辑是AI代码生成阶段的错误率很大程度取决于需求定义的颗粒度。需求定义得越细AI的自由度越低产出就越稳定。很多资深开发者会觉得“我本来就会写需求文档”但SDD和传统需求文档最大的区别在于传统需求文档是给人看的会有大量上下文留白供人脑补SDD是给AI看的它必须把输入、输出、异常、边界全部显性化。3.2 一套可以直接套用的SDD模板我会在项目里维护一个docs/目录每个新模块对应一份SDD文档。一份好用不啰嗦的SDD模板大概是这样的结构背景与目标为什么做这个功能解决什么问题。一句话需求用最长不超过30字的一句话说明功能。功能拆解按编号列出具体功能点每条尽量独立。数据模型与接口定义字段名、类型、必填项、默认值。状态流转与异常边界什么条件下进入什么状态异常时怎么处理。验收标准可以逐条执行的验证条件AI可以用来自测。非目标明确写出这一版本“不做什么”防止AI顺手加戏。一个SDD文档的体感样例## 待办事项列表 — 模块规格 ### 背景与目标 用户需要快速记录每日任务并能够标记完成状态。本次只做单人使用场景不做多人协作。 ### 一句话需求 支持创建、完成、删除待办事项并按创建时间倒序展示。 ### 功能拆解 1. 新增输入框支持回车提交内容为空时不提交。 2. 列表展示未完成事项按创建时间倒序排列。 3. 完成点击事项左侧圆形按钮将状态置为已完成。 4. 删除滑动或点击删除按钮移除事项无需二次确认。 ### 数据模型 - id: string由前端生成crypto.randomUUID - content: string必填最大长度200 - status: active | completed默认 active - createdAt: number时间戳 ### 边界与异常 - 输入框内容超过200字符时阻止输入并给出提示。 - 删除操作不处理失败场景仅操作本地内存数据。 ### 验收标准 1. 提交空内容无反应不产生新事项。 2. 新建事项出现在列表顶部。 3. 点击完成按钮后事项从列表消失。 4. 刷新页面后事项状态不保证持久化本次无存储要求。 ### 非目标 - 不做多用户、权限、共享。 - 不做截止日期与提醒。每次写SDD时注意控制篇幅。我的经验是单个SDD不超过一页A4纸太长AI反而不愿意完整读取而且你写文档的时间成本也会爆炸。小修小补不需要SDD直接用清晰的commit message描述即可。3.3 一个从“随便做做”到“规格明确”的改写案例在训练营里我拿同一个功能做过对照实验。功能是“一个带搜索的用户列表页”。第一组学员直接让AI写第二组学员先用上面的SDD模板写规格然后让AI实现。第一组的效果是AI代码生成速度快但搜索结果排序规则是随机默认的搜索框没有防抖邮箱字段为空时页面直接展示“null”字样。来回纠错花了三轮还引入了两个无关文件。第二组的效果SDD里明确写了“搜索延迟300ms防抖”“按用户名升序”“邮箱为空时显示占位符--”AI一次性通过的几率明显更高后续评审也顺畅得多。这个实验说明SDD的价值不是限制AI而是把“隐性需求”显性化。AI本来不知道你会对“邮箱为空”有自己的偏好但你在SDD写了它就执行而且执行得稳定。3.4 项目节奏SDD写多少才算够很多学员问是不是每个功能都要写SDD我现在的标准是“复杂度驱动”新增模块、跨文件改动、接口变更必须写单文件小修、文案调整、样式微调不写。一个简单的判断标准是“如果这个功能需要改动3个以上文件或需要新增数据字段就值得写”。SDD的更新节奏要跟着迭代走。不要写完就忘AI实现过程中发现规格与现实冲突时优先回改SDD再改代码。我在项目里会让Agent在完成任务后自动把SDD中与实现不一致的地方列出来人工确认后更新文档保证SDD始终是“当前代码的说明书”而不是一份过时的历史文件。4. 多Agent协作与Claude Code项目落地实战4.1 单Agent的天花板与多Agent的分工逻辑单Agent做到后期会撞上三个天花板上下文窗口不够、串行操作太慢、大任务拆解困难。你有多少上下文都架不住一个大模块的全部需求你在一个会话里让AI先写接口再写页面再加样式每件事都要追着它往回找之前的信息效率极低。多Agent的思路是“把一个大任务拆成多个有边界的子任务让每个Agent持有独立的上下文”。打个比方单Agent像是一个全能员工在一张桌上处理所有事情多Agent则像一条装配线每个工位做一件事交接通过标准接口完成。这里的标准接口就是SDD、类型定义、接口约定。需要澄清的是多Agent不是让你开十个终端同时跟十个AI聊而是让每个Agent有清晰的职责边界和输入输出契约。没有边界的多Agent只会造成更严重的混乱。4.2 Claude Code项目落地的关键操作Claude Code在真实项目里的优势是它能直接访问文件系统、执行命令、批量修改文件比纯编辑器内的AI更适合做“执行层”的角色。我常用的工作流是第一步进入项目根目录运行claude命令启动会话。第二步执行/init自动生成当前项目的说明文件作为Agent对项目的“背景常识”。第三步先用/status或者一个专门的“信息收集”提示词让它输出当前项目结构、关键文件列表、以及本次任务的关联模块。第四步把SDD文档当作任务输入让Agent按照文档规格实现。第五步在关键路径上逐步授予权限而非一次性放开所有写入权限。关于权限操作顺序是从严格到宽松先让它以只读模式输出分析和方案你确认之后再允许它修改指定目录再允许它执行测试命令。我在配置中最少会限制不授予全局任意目录写入权限不授予安装全局依赖的权限所有写操作限制在当前项目目录内。Claude Code本身有权限确认机制千万不要图方便一次性跳过全部确认尤其在自动重构场景下。4.3 三种实用的多Agent编排模式我实际用下来比较顺的编排模式有三个可以根据任务类型挑选。第一种是“并行独立式”。适合模块之间依赖低的场景比如做一个内部工具表格模块、图表模块、表单模块三个功能互不依赖。我开三个终端各跑一个Agent分别在feature/table-list、feature/chart-board、feature/form-edit三个分支上工作。最后人工合并冲突一般很少因为文件交集小。这里需要特别注意共同依赖文件的管理比如package.json如果有变动很容易冲突建议把依赖升级单独拎出来用一个Agent处理。第二种是“管线传递式”。适合前后依赖强的场景比如一个功能需要先定接口、再写前端、再写测试。Agent A产出OpenAPI或TypeScript类型定义Agent B在这些类型定义的基础上实现前端页面Agent C再基于最终代码编写测试用例。每个Agent的输入是上一个Agent的产出物这个模式下“接口定义”就是契约不能随便改。第三种是“值守回归式”。适合已有系统上的增量改动一个Agent负责跑回归测试并汇总失败用例另一个Agent负责根据失败信息修正代码。形成一个小闭环直到回归全绿。这种模式能显著减少“修好A又弄坏B”的问题但要注意两个Agent不要同时改同一批文件否则互相覆盖。每种模式我都踩过坑。并行式最大的坑是依赖版本漂移两个Agent各自往package.json里加了依赖合并时解冲突很麻烦。管线的坑是契约定义不完整Agent B发现Agent A定义的两个字段不足以完成UI就得回头改契约一改就是连锁反应。值守式的坑是循环太久烧token要设一个轮数上限比如最多修三轮修不好就回滚由人工接手。4.4 成本、上下文与代码回滚的管理多Agent的每一项能力都对应成本尤其是token消耗。我的成本管控手段有三个拆任务之前先估算。一个功能点加涉及的改动文件数大致估算出本轮消耗。超过预算就先缩小改动范围或者把“最优方案”降级为“能跑通的方案”。让Agent输出“状态快照”。每个Agent任务结束时都要求它在终端打印一段总结完成了什么、改了哪些文件、还有哪些已知问题、下一步建议是什么。下一次新会话或另一个Agent接手时这些信息直接成为输入减少重复探索的成本。用分支做安全网。每个Agent的工作分支越小越好一个分支只做一个SDD任务commit尽量小做到一个逻辑一个commit。这样一旦方向跑偏回滚成本极低而不是整个模块一起回滚。上下文管理方面最重要的原则是“让AI每轮任务只看到他该看的那部分”。我会在任务提示词里明确限定“只读取以下文件和目录不要扫描全项目”。这听起来是废话但能有效降低token消耗也能减少无关内容对判断的干扰。5. 实战中踩过的高频坑附排查思路5.1 AI把重构改烂了回滚都救不回来我有一次让Agent重构一个工具函数要求把内部逻辑拆成清晰的两层。AI照做了但顺手把调用方的传参顺序也改了。当时没仔细看diff就直接提交导致页面崩溃回滚后还花了半天时间排查“为什么回滚了还是有问题”——因为Agent在重构时把另一个文件里的状态管理也顺手改了。排查思路很简单第一步用git diff查看改动文件清单凡是任务描述中没提到却被修改的文件一律重点审查第二步审查Agent行为的边界约束在SDD里加入一行“仅允许修改以下文件其余文件若需改动必须先向你说明”。很多AI工具支持在规则里声明“不做规划外修改”把这个启用起来。5.2 上下文污染同一个会话越用越笨一个长会话里前10轮AI表现很聪明第20轮开始胡言乱语这个问题很多人应该都遇到过。原因是早期对话里的细节和后期讨论相互干扰AI无法判断优先级经常把过时信息当作最新决定。我的解决办法是把会话当“一次性工单”而不是“长期聊天室”。每个工单只做一件明确的事做完就收工。真正需要长期保留的信息一定要沉淀到文件里规则进rules规格进SDD任务结论进CHANGELOG。这样即使AI“失忆”新会话通过读文件也能快速恢复上下文。不依赖会话记忆是上下文管理最重要的思路。5.3 规则互相打架AI不知道该听谁的当rules文件、SDD文档和对话提示词三者出现冲突时AI的处理方式很迷。有一次我一边在rules里写了“禁止使用外部UI库”一边在对话里让它“参考某个UI组件库的样式”它直接两头兼顾产出的代码彻底跑不起来。现在我的处理方式是明确优先级项目级规则文件高于对话假设SDD高于通用项目规则临时对话指令只能修改细节不能推翻项目级决定。同时在rule文件底部加一段说明“如果本项目规则与用户对话内容冲突以本项目规则为准并在终端输出冲突说明。”5.4 团队协作中Agent的隔离与合并团队里两个开发者各自开着Agent干活互相合并代码的时候经常出乱子。核心问题是两个Agent对同一个全局文件各写各的比如都在改src/types.ts一个加了订单类型一个加了客户类型合并不一定冲突但等下一次AI读这个文件时它看到类型定义里既有订单又有客户可能会误以为两者有关联。对策是把全局类型定义、常量、公共工具函数划为“共享区”任何Agent改动共享区文件之前必须先同步最新版本并优先通过新增命名空间或独立文件来规避耦合。简单说就是“越底层的东西越要少动”底层文件的中性更新频率太高多Agent协作就会频繁踩到彼此。最后分享一点个人的实际操作体会整套Vibe Coding走下来最大的变化不是“写代码变快了”而是我对“需求定义”这件事的认知变了。以前跟AI协作是在“校对它猜出的答案”现在更像是“给AI下工单、设边界、验收结果”。训练营里很多学员一开始觉得SDD很烦、规则文件啰嗦、多Agent配置复杂但一旦尝到一次“从规格到代码几乎零返工”的甜头就很难再回到随便聊两句就让它写代码的模式了。如果你也想入这套路第一个实践点建议不要选大项目选一个不超过两天能做完的小功能写一份一页的SDD配置一份40行以内的规则文件用Claude Code或Cursor跑一遍“规格转代码”的闭环体会一下约束带来的稳定感。等这个流程顺了再往多Agent方向扩展。工具更新换代很快但“用规格约束生成方向用规则约束行为边界用上下文管理控制成本”这套方法论至少在可预见的阶段里不会过时。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑