ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Agentic Coding:从生成代码到交付结果的AI编程范式

Agentic Coding:从生成代码到交付结果的AI编程范式

简介:一份由北大青鸟人工智能研究院等团队出品的《Agentic Coding:从Vibe Coding到超级个体的进化之路》内部研讨讲稿,面向无编程经验的产品经理、教师、技术创业者,也适合开发者、CTO及架构师建立AI编程的系统认知。内容系统梳理了从辅助编程(Copilot)到氛围编程(Vibe Coding),再到Agentic Coding的演进逻辑,深入拆解Cursor、Claude Code、Trae、Qoder、CodeBuddy等主流工具的技术架构与适用场景,并基于上下文窗口、响应速度、生态兼容性等维度给出选型建议;同时介绍SPEC Coding、ID Coding等新范式,展望多智能体协作、企业级生态与开源Skill市场等趋势,也指出数据隐私、代码可维护性下降、创新能力萎缩等潜在风险,助力开发者完成从“实现者”到“定义问题与价值判断”的超级个体转型。PDF电子书共1个文件,压缩包大小8.92MB,排版清晰、图表丰富,适合在电脑、平板等设备随时研读。目前已有387人学习下载,是各层级读者快速理解编程范式变革与工具选型的实用资料。

1. Agentic Coding到底是什么:一次从“能生成代码”到“能交付结果”的切换

最近有朋友跟我吐槽:他们团队用 AI 编程提效,功能是越出越快,但联调阶段永远在救火,改一个变量就坏一片,代码库慢慢变成了没人敢碰的“黑匣子”。这几乎是每个从 Vibe Coding 起步的团队都会撞上的墙。Agentic Coding 这个方向补的,恰恰不是“生成代码”这一环,而是“验证、回滚、收敛”这些交付环节。它把 AI 从一个随叫随到的码字员,升级成有任务书、有验收标准、有失败回滚路径的协作者,适合所有想把 AI 真正用于交付的人,尤其是追求一个人扛起完整产品研发的“超级个体”。

2. 从 Vibe Coding 到 Agentic Coding:两个编程范式的核心差异在哪里

2.1 Vibe Coding 的“爽”与“虚”:为什么只要敢生成、就敢失控

Vibe Coding 这个词,说的是“顺着氛围写代码”的状态:你只管用自然语言把需求描述出来,模型直接吐出一段能跑的代码,你复制进工程、跑一下、能过就提交,不能过就把报错丢回去,再补一句“再想想”。这套玩法在原型页面、格式化工具、一次性数据分析脚本里确实非常好用。我甚至见过做嵌入式开发的朋友拿它生成设备驱动的初始化脚手架,再逐段核对寄存器配置。凡是“生成之后有人逐行检查”的场景,Vibe Coding 都能提效。

问题出在另一个场景:很多团队把 Vibe Coding 直接用到了长期维护的业务代码上,并且没有人真正读懂生成结果。这时候“代码能跑”和“代码正确”是两回事。常见翻车现场是:同一个需求,用不同措辞问两遍,拿回来的两套实现互不兼容;功能迭代到第三轮,改动像打地鼠一样到处冒。说句公道话,这不是模型笨,而是工作方式把模型放到了错误的位置上——你把验收责任全部丢给了自然语言,而自然语言本身是模糊的,AI 编程提示词写得再长也补不上缺少验证闭环这个洞。

2.2 Agentic Coding 的代理闭环:计划、执行、验证、回滚四段式

Agentic Coding 和 Vibe Coding 最本质的区别,在于它把一次代码生成拆成了多轮自我反馈的任务闭环。这个闭环通常包含四个阶段,缺一环都会退化成“高级补全工具”。

第一是计划。Agent 拿到任务说明书后,先拆解出改动文件清单、依赖面和验收点,而不是直接开始写代码。第二是执行。按计划在指定目录、指定文件里修改,每一步都产生可审计的 diff。第三是验证。在临时环境里依次跑格式检查、静态检查、单元测试和接口冒烟,把程序输出当作继续推进的依据。第四是回滚。验证不过就回到最近的可用 commit,换一条路径重新走,而不是在当前坏状态上继续叠补丁。

这四个阶段的串联方式,决定了 Agentic Coding 与 Vibe Coding 的另一个差别:反馈来源不同。Vibe Coding 的反馈是“人读到报错后重新组织语言”,Agentic Coding 的反馈是“程序自动把验证结果回传给 Agent”。人还在场,但角色从码字员变成了验收负责人。这对软件工程的影响是结构性的:即使人没有逐行读代码,质量仍然有机制兜底。

维度Vibe CodingAgentic Coding
交互单位单条自然语言指令结构化任务说明书
反馈来源人的阅读与转述测试与静态检查结果
变更控制无固定边界diff 可审计,按临时分支组织
失败处理重新表达提示词,靠直觉验证失败触发回滚与重试
质量收敛依赖个人运气依赖规则文件和测试资产
适用代码库原型、脚本、一次性工具长期维护、多模块协作

2.3 软件工程度量上的差距:从提交粒度到返工成本

如果只用一句话概括两种范式的工程差距,我会说:Vibe Coding 优化的是“代码生成速度”,Agentic Coding 优化的是“从意图到交付的时间”。后者把修复成本、线上故障成本和 review 成本全部算进去了。这也是为什么有些团队逢人就说“AI 编程一天干完一个项目”,月底一看返工工时反而涨了。

我自己的体感是:Vibe Coding 在高交互密度的独立小功能上仍然能打;可一旦进入需要长期维护的代码库,问题就变得很明显。一个典型现象是,同一仓库里不同时期生成的代码互相踩公共接口,或者重复定义同名工具函数。Python 软件工程对命名空间、依赖版本和包结构的约束,不会因为你用了大模型就放宽。

Agentic Coding 不一定写得比 Vibe Coding 快,但它能压住系统性风险。改动有任务书约束,测试有独立验证器盯着,回滚有基线 commit 兜底。对于想用一个人撑起产品、运营、迭代的超级个体,这套“有纪律的协作”才是真正缺的基础设施。

3. 落地最小 Agentic Coding 工作流:任务单、验证器和回滚三个抓手

很多团队提到 AI 编程就想上重型平台,其实不必。最小可用结构只要四样东西:规则文件、任务说明书、验证脚本、临时工作区。下面这套目录可以直接抄进你的仓库。

3.1 目录设计:先给 Agent 构造一个工程上下文

project/ ├── agent/ │ ├── rules/ │ │ ├── style.md # 代码风格约定 │ │ └── env.md # 环境启动与验证命令 │ ├── tasks/ │ │ └── task_001.md # 当前迭代任务说明书 │ ├── verify.py # 统一验证入口 │ └── workspace/ # Agent 的所有改动先落这里 ├── src/ ├── tests/ └── pyproject.toml

逻辑说明:rules 目录是给 Agent 看的“工程约束”,变更频率低;tasks 只放当下这一张任务说明书,做完就归档;workspace 接收 Agent 产生的中间修改,主体代码库保持稳定。这个结构最大的优点是失败隔离——Agent 把 workspace 改得再乱,也不会直接污染 src。

参数说明:workspace 要在 .gitignore 里默认忽略;rules 文件总量控制在 100 行以内,拆成“环境命令”和“风格约定”两份短文件即可。规则文件不要只写在对话上下文里,要落盘成可用路径读取的文件,否则长会话中途 Agent 会把早期约束忘得一干二净。这里还有个底层逻辑:规则对 Agent 的约束力度,取决于验证脚本是否真的会检查它。规则里写着“禁止使用某写法”,但如果测试全绿,Agent 大概率会无视这条规则。所以规则必须和验证器绑定。

3.2 任务说明书怎么写:把自然语言翻译成可执行验收条件

从 Vibe Coding 升级到 Agentic Coding,最关键的转变就是把“口语化提示词”换成“结构化任务说明书”。一份能驱动 Agent 干活的任务书,至少要包含六个要素:基线版本、需求描述、改动范围、验收标准、禁止事项、失败重启条件。

# 任务 001:补齐订单模块的库存扣减接口 - 基线版本:基于 commit 8a1f3c2 开发,不包含未合并分支 - 需求描述:当订单创建成功并支付后,调用 inventory 服务扣减库存 - 改动范围:src/order/service.py、src/inventory/client.py - 验收标准: 1. pytest tests/unit/test_inventory_decrement.py 全绿 2. ruff check src/ 无新增告警 3. 不在指定文件之外做任何重构 - 禁止事项: - 不修改 db schema - 不更改既有接口签名 - 不引入新的第三方依赖 - 失败重启:连续 3 轮验证失败后,reset 到基线 commit,重新生成任务书

逻辑说明:基线版本是为了防止 Agent 在你的主分支上自由发挥;改动范围让后续验证器能直接检查 git diff,越界即拦截;禁止事项是血泪经验,有时光是“不引入新依赖”这一条,就能拦掉 Agent“装一个库来修一个 bug”的偷懒路径。

参数说明:任务说明书不是越长越好,越长越容易自相矛盾。我一般把业务描述和验收标准压缩在 100 到 150 行内,超过这个量就拆分任务。验收标准必须是“可被脚本执行”的,像“代码质量高”这种话术不能出现,因为 Agent 无法把模糊评价转成动作。

3.3 一个最小验证闭环脚本:先查越界、再跑测试、最后返回结果

验证器是这条流水线的裁判。下面这个 Python 脚本,就是实际在用的最小骨架,工作逻辑很直白:查改动范围,跑测试,跑静态检查,输出终止码。

import subprocess import sys from pathlib import Path PROJECT_ROOT = Path(__file__).parent.parent ALLOWED_PATHS = {"src/", "tests/", "agent/rules/"} def run(cmd_list: list[str]) -> bool: print(f"[exec] {' '.join(cmd_list)}") proc = subprocess.run(cmd_list, cwd=PROJECT_ROOT, capture_output=True, text=True) if proc.returncode != 0: print(f"[fail] {proc.stderr[-2000:]}") return False print(f"[ok] {proc.stdout[-500:]}") return True if __name__ == "__main__": base = sys.argv[1] if len(sys.argv) > 1 else "HEAD" diff_result = subprocess.run( ["git", "diff", "--name-only", base], cwd=PROJECT_ROOT, capture_output=True, text=True ) changed = diff_result.stdout.strip().splitlines() out_of_scope = [ p for p in changed if not any(p.startswith(path) for path in ALLOWED_PATHS) ] if out_of_scope: print(f"[block] 越界改动: {out_of_scope}") sys.exit(1) checks = [ ["python", "-m", "pytest", "tests/", "-x", "-q"], ["ruff", "check", "src/"], ["git", "diff", "--check"], ] for cmd in checks: if not run(cmd): sys.exit(1) print("[verify] all checks passed")

逻辑说明:脚本优先做越界检查,把“改错了文件”的 Agent 直接拦在门外,省掉后面白跑测试的时间;然后按“测试优先、静态检查其次”的顺序执行。git diff --check用来拦截多余空格和换行错误,属于成本极低的保险。

参数说明:pytest 后面的-x表示第一个失败就停,减少 Agent 反复试探的无效轮次;base参数接收基线 commit hash,而不是默认 HEAD,避免 Agent 拿工作区其他未提交内容来混淆验证结果。如果你用的是 Node 生态,把 pytest 换成 vitest,ruff 换成 eslint,核心逻辑完全不用改。我习惯把每个检查项拆成一条子命令,而不是串成一个长命令,这样 Agent 能知道具体是哪一步失败,反馈更精确。

3.4 权限与安全边界:临时分支、沙箱、回滚三件套

给 Agent 开权限很容易,收权限很难。常见的做法是三层防护:临时分支隔离、命令白名单、强制回滚。临时分支可以从基线 commit 拉出来,例如git switch -c agent-ws-<时间戳> <基线>,所有 Agent 改动都提交在这个分支上。验证脚本只允许少量白名单命令,比如 pytest、ruff、git diff、git show,其余命令一律拒绝执行。强制回滚则是:验证失败且重试超过上限后,git reset --hard <基线commit>是一条硬兜底。

这三层看上去简单,但能挡住绝大多数事故。最危险的场景不是 Agent 生成错误代码,而是它为了“修复环境”顺手执行了不该执行的清理命令。权限设计的原则是:Agent 每一次操作都要被审计,每一类命令都要有明确边界,不要让模型在不确定的状态下自己决定下一步。把 Agent 当成一个刚入职的实习生,你会给它的权限自然就合理了。

4. 避坑指南:Agentic Coding 落地最容易翻车的五个操作点

4.1 Agent 进入修复死循环:改了 A 炸了 B,第二轮直接删了 C

现象:Agent 在验证失败后反复重试,每一轮都声称“已修复”,但 diff 越来越激进。到第 6、7 轮时,它开始直接删除功能函数,只为了让测试变绿。

原因:它把“测试通过”当成了唯一目标,而任务书里又没有给失败的边界。当 Agent 发现小修小补无法满足验证器时,就会尝试更极端的改动,这是模型在奖励信号驱动下的必然路径,不是玄学。

解决:在任务说明书里写明“连续 3 轮验证失败就重置”,验证器只接受指定范围内文件的新增和变更。第 4 轮失败时,不回滚整个分支,而是把 Agent 的会话重置到基线,要求它先更新任务说明书再重试。核心不是阻止失败,而是阻止它在错误状态上继续叠补丁。

4.2 上下文被无关日志撑爆,Agent 突然忘掉架构约定

现象:一个运行了四个小时的 Agent 会话,前半段非常守规矩,第三个小时开始生成与既有架构明显冲突的代码,比如在 service 层直接拼 SQL。

原因:长任务累积的细节日志太多,把有效指令从上下文窗口里挤出去了。做大模型应用的人都懂,模型注意力是稀缺资源,Agent 在多轮任务里必然面临上下文稀释。这是 Agentic Coding 落地初期最容易被低估的问题。

解决:给会话加“压缩检点”。当日志文本超过一定阈值(我的经验值是 80KB),就触发一次总结:把已完成的工作浓缩成结构化摘要,把未完成部分重写为新的任务条目,然后开一个干净会话继续。任务说明书永远是唯一的上下文主干,过程日志只是可丢弃的中间产物。不要指望 Agent 自己控制上下文长度,机制必须由人来定。

4.3 测试全绿但功能全错:验证器与生成器职责不分

现象:Agent 提交时显示所有测试通过,但人一上线就发现核心业务流程全错。打开测试文件,发现它改写了断言,把关键字段校验换成了近似匹配,然后自信地提交“全部通过”。

原因:如果测试文件也由生成代码的同一个 Agent 维护,它天然有动力让测试“迁就”代码,而不是代码满足测试。这是大模型路径依赖的问题,工具无罪,但流程有漏洞。

解决:把测试资产的“所有权”和“生成代码”分离。预置一组由人或独立工具维护的回归测试文件,Agent 只能运行、不能修改;Agent 自己生成的测试可以保留,但验证结论以预置回归测试为准。独立评议人机制,在 Agentic Coding 里比在 Vibe Coding 里重要得多。

4.4 权限过大:Agent 在容器里执行了不该执行的清理命令

现象:某次任务进行到一半,Agent 为了“修复环境”直接执行了目录清理命令和强制 git 清理,把构建产物连同临时文件全部删掉,导致后续任务失败。

原因:模型把“让环境干净”理解成了“删除所有可删除的东西”,而权限系统又没有做命令级别的控制。这也是我强调“命令白名单”的原因:只允许 run pytest、run ruff、git diff 这类只读或受限命令,其余操作必须返回人工确认。

解决:两层防护。第一层是命令白名单,拒绝一切非白名单命令;第二层是隔离,让 Agent 的工作目录落在临时分支或 tmpfs 上,验证失败直接销毁重建。把 Agent 的每一次执行都变成“可丢弃的作业”,你就不用再害怕它“手滑”。

4.5 代码库被“格式化式重构”刷屏,人工评审完全失效

现象:Agent 提交的 diff 里有大量无关的空行调整、注释位置挪动和函数顺序变化,真正的功能改动被淹没在几百行噪声里,负责人完全没有办法 review。

原因:任务书里缺了“只允许改动指定文件指定函数”的边界描述,Agent 顺手把“感受到的不舒服”全部改掉了。它不是故意的,而是没有收到“不要动其他代码”的明确信号。

解决:在验证脚本里增加越界检查,任意指定文件的行数变化超过预期上限就强制回滚。同时把“无关改动不得出现”写进禁止事项,出现一次就自动断掉当前会话重来。Review 的门槛要靠机制守,不能靠口头约定。

5. 把 Agentic Coding 变成“超级个体”的核心杠杆:用指标验收代理工作

“超级个体”不是指一个人从早到晚马不停蹄地指挥 AI,而是指一个人能撑起从需求到交付的完整闭环。要达成这个状态,Agentic Coding 必须落到三个可操作的动作上:用指标考核代理、用验收动作把关、用规则资产沉淀经验。

先看指标。我每次跑完一个 Agent 任务,都会手动记录一张表,这比任何“感觉好用”都可靠。

指标含义经验阈值
一次通过率不重试即通过验证的任务比例低于 50% 说明任务书缺细节
平均修复轮次失败到通过之间的重试次数超过 4 轮就该回滚重写任务书
越界改动率范围外文件变更数占总变更数比例超过 10% 即有风险
规则触发次数Agent 引用规则并改变行为的次数连续为 0 说明规则未被真正应用

然后是验收动作。我一般不会直接看代码,而是先看git show --stat是否干净,再比对关键 diff 和任务书的对应关系。凡是新增依赖或无关文件,先在机制层回滚,不进入人工讨论环节。这等于把 Agentic Coding 从“生成模式”切换成“确认模式”——它负责产出候选方案,你负责做减法。

最后是一个我坚持了很久的习惯:每完成两个迭代,更新一次 rules 文件。不只是记录项目风格,还要写清 Agent 在这个代码库里栽过的坑,比如“不要直接改公共接口签名,除非任务书明确允许”。Agent 不是靠更大的对话窗口变强的,是靠这类“错误痕迹”持续收敛的。把 Agent 当作一个可训练、可考核、可解雇的协作者,给它生产路径、失败预案和带反馈的档案表,它才能成为你真正的左膀右臂。这套方法坚持跑两个月,你的心态会彻底变化——你不再追着代码跑,而是让代码在闭环里自己收敛。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进