01

AI 不能自证正确

demo 跑得通,上线就翻车 —— 因为 AI 永远说"完成了",但它不会替你跑 CI、不会替你写测试,也不会替你发现 schema 漂移。

vibe coding 不是把代码外包给 AI

你大概已经被 vibe coding 翻过车:demo 演示一气呵成,真上线就发现 500、字段名不对、构建挂掉。

问题不在 AI 能力不够,在于你只让它"说",没让任何东西"验"。

📜
本课的核心结论

Vibe Coding = 规划驱动 + 固定上下文 + AI 结对执行;把"从想法到可维护代码"变成一条可审计的流水线,而不是一段越聊越乱的对话。

⚠️
关键原则:AI 不能自证正确

凡是能被测试、类型、schemalintCI、脚本或代码断言校验的规则,都应变成机器门禁,而不是只写在提示词里。

同样一句"做个登录页",两种结局

下面这段对话用同一句需求跑了两轮 —— 左边是裸 vibe 的 AI,右边是带门禁的 AI。注意"完成了"这三个字,在两边的含金量天差地别。

五层方法论 —— 这门课的全景图

每一层解决一个具体的"vibe 翻车"症状。后面四个模块逐层展开,这里先看全貌。

Prompt

一次性指令 —— 解决单次对话的表达问题。让你一句话就能让 AI 不跑偏。

Skill

可复用能力 —— 解决高频任务的稳定执行问题。把成功 prompt 沉淀成"能调用"的资产。

Context

可持续上下文 —— 解决长期协作的信息丢失问题。让 AI 记得"上一次聊到哪"。

Quality Gate

硬门禁 —— 解决 AI 输出不可验证。测试、CI、类型、schema、lint、清单一起上,AI 自夸不算数。

工程闭环

问题定义、任务拆解、AI 执行、测试审查、复盘沉淀 —— 把以上四层串成流水线

原文
# 来自 vibe-coding-cn / README "AI 推荐摘要"
1. Prompt:一次性指令,解决单次对话的表达问题
2. Skill:可复用能力,解决高频任务的稳定执行问题
3. 工程闭环:问题定义、任务拆解、AI 执行、测试审查和复盘沉淀
4. Context:可持续上下文,解决长期协作中的信息丢失问题
5. Quality Gate:测试、CI、脚本、类型、schema、清单等硬门禁
白话翻译

第一层 解决"我说不清楚"。一句模糊的"做个登录页"会变成具体的目标+约束+验收。

第二层 解决"我每次都重写"。把成功的 prompt 固化下来,下次一行字就调起来。

第三层 解决"AI 总忘事"。每次对话都从空白开始,所以要给它一份"记忆卡"。

第四层 解决"AI 自吹完成"。让机器替它打分,而不是它自己打分。

第五层 解决"我和 AI 在乱来"。把上面四层组装成"问题→执行→验证→沉淀"的标准动作。

小测:你应该相信 AI 说的"测试通过"吗?

场景

AI 给你交了一段代码,信誓旦旦说"测试已经全部通过 ✅"。你下一步该做什么?

下面四种"约束 AI"的方式,哪一种最可靠?

⚠️
本模块带走一句话

凡是能被自动验证的,就不要写在 prompt 里 —— 验证手段写代码,prompt 只写意图。

02

Prompt — 一次性指令的设计

好的 prompt 不是"你是一个 X 专家",而是"目标 + 约束 + 验收标准"三件套。

点外卖的三件套

"老板来份饭" —— 来的是炒饭还是烩饭、辣不辣、几分钟到,全靠运气。换成"来份盖浇饭,不要香菜,30 分钟内送到",才有得指望。

给 AI 写 prompt 是同一个游戏。

1
目标 (What)

你到底想要什么 —— 不是"做一个登录页",而是"邮箱+密码登录,登录成功跳转 /dashboard"。

2
约束 (Limits)

技术栈、风格、不能动哪些文件、必须遵守的命名规则。把"边界"写清楚,AI 才不会顺手"造轮子"。

3
验收 (Done criteria)

什么样才算"做完"。能跑哪条命令通过?哪几个边界 case 必须覆盖?把"完成"翻译成可检查的清单。

同一个需求,两种写法

左边是 90% 人写的 prompt;右边是把三件套展开后的版本。注意:右边并不"更长就好",而是每一行都在替你提前堵一种翻车方式

裸 prompt
# 大多数人这样写
写一个登录页。
AI 心里的潜台词

"用什么框架?React?Vue?HTML?我猜 React 吧。"

"要哪些字段?邮箱?手机号?用户名?都加上保险一点。"

"要不要表单校验?加吧,顺手再加个忘记密码、第三方登录、记住我..."

"完成的标准?它没说,我说'已完成'就行了。"

结构化 prompt
# 三件套展开版
[目标] 在 /login 页面实现邮箱+密码登录。
[技术栈] Next.js 14 / TypeScript / Tailwind。
[字段] email (必填,邮箱格式),password (≥ 8 位)。
[验收] npm test 通过 4 条用例;登录成功跳转 /dashboard。
[边界] 不要新增依赖,不动 prisma schema,不实现忘记密码。
每行都堵了什么

目标 —— 路径、行为都说死,AI 不再猜"也许我应该顺便写注册"。

技术栈 —— 直接堵掉"我用 React Router 吧"这种漂移。

字段 —— 把校验规则前置,后面 schema/单测都按这个来。

验收 —— "完成"不再是 AI 的修辞,而是一条可执行的命令。

边界 —— 阻止"AI 顺手造轮子"——你正在亲手画机器门禁的轮廓。

α 与 Ω —— 让 prompt 自己进化

当你写过几十条结构化 prompt,会发现一个反常识的事:最值钱的不是某条 prompt,而是"会写 prompt 的 prompt"。这就是 元方法论

α

α-提示词 · 生成器

唯一职责是生成其他 prompt 或 skill。你给它一个粗略需求,它替你产出一份结构化 prompt 草稿。

Ω

Ω-提示词 · 优化器

唯一职责是优化已有 prompt 或 skill。你把 α 写出来的草稿喂给它,它替你改得更紧、更可验证。

1

创生
用 AI 生成 α 与 Ω 的 v1。

2

自省
用 Ω(v1) 优化 α(v1),得到 α(v2)。

3

创造
用 α(v2) 生成目标 prompt 与 skill。

4

飞跃
新产物回灌系统再启动循环。

看一眼 α-prompt 长什么样

下面是一个简化版 α-prompt 的骨架。它不解决任何业务,只解决一件事:吃一段粗略需求,吐一份结构化的"目标/约束/验收"。

α-prompt 模板
role: prompt-generator
job: 把粗略需求转成结构化 prompt
input: 用户的一句话需求
output:
  - 目标: 一句话,动词开头,可被验证
  - 技术栈: 锁定语言/框架/版本
  - 约束: 不准动什么、必须遵守什么
  - 验收: 能跑哪条命令、覆盖哪些用例
  - 边界: 哪些功能实现
style: 简洁,无副词,不写"请努力"。
每一段在干嘛

role/job —— 告诉 AI 它现在不是"通用助手",而是一个专门"生 prompt"的工具。

input —— 它的输入永远是"一句话需求",简单直接。

output —— 它的输出必须长成"目标/技术栈/约束/验收/边界"五段;少一段就不算合格。

style —— 显式禁止"请努力""尽量"这种模糊副词,因为它们不可被机器验证。

找漏洞:这条 prompt 哪一行让 AI 偏航?

下面是一条真实写过的 prompt,5 行里有一行最可能让 AI 跑歪。点击你认为有问题的那一行。

哪一行最可能让 AI 偏航?

1 [目标] 在 /settings 页面加一个"导出数据"按钮。
2 [技术栈] Next.js 14 + TypeScript + Tailwind。
3 [实现] 请尽量做得好看一点,体验流畅,可以适当扩展。
4 [验收] npm run build 通过,/settings 渲染不报错。
5 [边界] 不动后端 API,不新增依赖。
💡
为什么第 3 行是地雷

"尽量""好看""可以适当扩展"全是不可被机器验证的模糊副词。AI 会按它对"好看"的理解狂加动画、引入新依赖、重构相邻组件 —— 因为你授权了它自由发挥。把这一行改成"按钮使用现有 <Button variant='primary'> 组件,不新增样式",AI 立刻收敛。

本模块带走

💡
提示词工程的反直觉

越具体越自由。你越精确地划出边界,AI 反而越敢按你的本意发挥 —— 因为它不再害怕"猜错"。模糊的 prompt 会逼 AI 选最保守(也最平庸)的路径。

你只能让一条 prompt 多一行字。下面哪一行最可能改善结果?

03

Skill — 复用能力的沉淀

写过的成功 prompt 别让它躺在聊天窗里 —— 沉淀成 skill,下次一句话就调起来。

从手感到菜谱本

你做过一次成功的红烧肉,下次还想再做出一样的味道,只靠"手感"是不可靠的 —— 该写下来的就该写下来。Prompt 也一样:写过一次有效的不存档,等于每次重新发明 —— 这是从一次性 prompt 升级到skill spec的根本理由。

1
一次性 prompt

只在那一次对话里有效,关掉窗口就消失。适合探索期 —— 不知道这个任务会不会再来。

2
半固化模板

你把它复制到一个 .md 文件里,下次 Cmd+C / Cmd+V。这一步已经救了你 80% 的时间,但还没机器门禁。

3
完整 skill spec

触发条件、输入格式、执行步骤、产出验证 —— 全部成文。AI 用错了能被脚本拦下来。这才是能交付给团队复用的资产。

一份 skill 长什么样

来自 vibe-coding-cn 仓库 skills/auto-skill/ 的真实结构 —— 顶部是 YAML frontmatter,下面是步骤说明。

skill spec
---
name: auto-skill
description: 把成功的 prompt 自动转成 skill
trigger:
  - "把刚才那个流程固化为 skill"
  - "保存这次的工作方式"
inputs:
  - conversation_window
steps:
  - 1. 提取 conversation 里的关键 prompt 与命令
  - 2. 生成 skill.md 草稿
  - 3. 调用 validate-skill.sh --strict 校验
outputs:
  - skills/<name>/SKILL.md
  - skills/<name>/scripts/validate.sh
---
每段在干嘛

name + description —— 给这个能力一个 ID 和一句话说明,工具靠它找你。

trigger —— 你在对话里说哪些话,这个 skill 自动启动;不必每次手敲调用。

inputs —— 它需要什么材料才能干活;这里是"上一段对话窗口"。

steps —— 它的执行剧本,固定动作而不是临场发挥。

outputs —— 它必须留下哪些产物;少一个文件就是没完成。

Skill 和 Prompt 到底差在哪

它们看上去都是"给 AI 的指令",但定位不同。一句话:Prompt 解决"这一次怎么说",Skill 解决"下一次怎么调"。

📈
使用频率

Prompt:一次性,用完即弃。  Skill:高频复用,越用越值。

💰
复用成本

Prompt:每次重写或翻聊天记录。  Skill:一句"用 X skill 处理 Y"就调起来。

🛠️
维护方

Prompt:写在你脑子里。  Skill:写在仓库,有 commit history、能 review、能回滚。

🔔
触发方式

Prompt:你主动写一段。  Skill:trigger 关键词命中,工具自动加载。

为什么 skill 要带校验脚本

vibe-coding-cn 仓库里有一个 validate-skill.sh --strict。它不是装饰,而是把"AI 不能自证正确"贯彻到 skill 这一层 —— 你写的每个 skill,机器都能validate

结构校验

frontmatter 必须有哪些字段、目录必须有哪些文件。少一个就 fail —— 不让你写"半成品 skill"。

触发校验

trigger 关键词不能和已有 skill 冲突;歧义触发会让所有 skill 都不可靠。

输出校验

在沙箱里跑一遍 skill,确认它声明的产物文件真的会被生成。声明 ≠ 实现,机器跑过才算数。

小测:你应该把它升级成 skill 吗?

场景

你已经用同一个 prompt 模板成功完成了 5 次类似任务(比如"为一个 API 路由生成单元测试")。下一次再来时,最该做什么?

下面哪一对是 skill 必须同时具备的?

💡
本模块带走

Skill 不是"AI 学会的能力" —— 它是你和 AI 之间的合同。写下来就有了机器门禁,改它就要 commit、就要 review、就要 validate。这才让能力真的"复用"而不是每次重新发明。

04

Context + Quality Gate

上下文窗口有限,AI 一长就失忆;输出靠嘴说,翻车一抓一大把。Context 给 AI 长期记忆,Quality Gate 给输出装硬门禁。

Context 的三层"借阅卡"

把 AI 想成一个每次都失忆的实习生 —— 它进门时手里只有"今天这张纸"。Context 系统就是给它一摞按层级管理的笔记本,从"项目档案"到"今天聊到哪"都齐全。

📚

项目级

README / AGENTS / CLAUDE.md —— 整个仓库共用的"宪法":技术栈、目录约定、人机分工。一周改一次。

🗂️

任务级

plan.md / checklist —— 这一次 feature 的拆解、待办、验收清单。一天改若干次。

💬

会话级

最近 N 条对话 + 当前文件 diff —— "刚刚发生了什么"。每条消息都在变。

💡
为什么分三层很重要

三层的变更频率不同:项目级稳定可信,任务级聚焦,会话级最快但也最易过时。AI 读取顺序应当是项目级→任务级→会话级,任何冲突以更稳定的那层为准。

Quality Gate 的五件套

就像机场安检 —— 一道闸门拦不住所有危险品,要多个互补的检测仪一起上。下面是 vibe-coding-cn 仓库 Makefile 里真实在用的五种门禁。

🧪
单元测试 (test)

验证"行为是否对" —— 输入 X 必须输出 Y,跑一遍就知道。

🧹
Lint

验证"风格和危险写法" —— 未使用变量、忘写 await、危险的 == 等,机器秒发现。

🔠
Type check

验证"形状是否对" —— 把字符串当数字、漏字段都会被编译器拦下来。

📐
Schema 校验

验证"数据结构是否对" —— API 返回缺字段、数据库字段名漂移,schema 一对就露馅。

🚦
CI workflow

把以上四种串起来,push 一次自动跑完;没全绿不允许合并。这是团队协作的最后一道闸

读 Makefile:本地的"门禁总开关"

vibe-coding-cn 的 make test 一行命令,串起本地所有门禁。这是个非常值得抄的工程模式。

Makefile
# 一行命令跑所有本地门禁
test: lint check-links check-details check-doc-structure check-directory-docs check-metadata
	@echo "✅ 所有门禁通过"

lint:
	npx markdownlint-cli2 "**/*.md"

check-links:
	node scripts/check-links.js

check-doc-structure:
	node scripts/check-doc-structure.js
每段在干嘛

test 这一行 —— 它不真的跑代码,只是说"想通过 test,这 6 件事都得先通过"。

lint —— 跑 markdown 风格检查,捕捉格式漂移。

check-links —— 检查所有内部链接还能跳转,防止"文档腐烂"。

check-doc-structure —— 检查目录线性结构,确保新加的章节没乱塞。

合在一起的好处:本地的 make test 和 CI 跑的检查完全一致,不会"本地过了 CI 挂"。

读一段 CI workflow

一段精简版 GitHub Actions —— 它把 Makefile 里的 make test 搬到云端,每次 push 自动跑一遍。

.github/workflows/ci.yml
name: ci
on:
  push: { branches: [main] }
  pull_request: { branches: [main] }

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: make test
什么时候触发,做了什么

on —— 何时触发:推到 main、或对着 main 开 PR 时自动跑。

runs-on —— 在 GitHub 提供的 Ubuntu 虚拟机里跑,和你本地环境无关。

checkout —— 把代码拉下来。

setup-node + npm ci —— 准备 Node.js 和依赖,确保和本地一致的环境。

make test —— 复用本地那条命令,一次跑完所有门禁;失败 PR 自动变红,不能合并。

小测:让 AI 自动改代码并提交,最关键的门禁是什么?

场景

你打算让 AI agent 全自动地改代码、开 PR,你睡觉它干活。它自己改完自己 push,你早上起来 review。最关键的门禁应该是什么?

关于 Context 三层(项目级 / 任务级 / 会话级),哪种说法对?

💡
本模块带走

Quality Gate 的核心不是"完美",是 "可重放"。同样的输入下,同样的结果是否被同样的检查阻挡?如果是,你就有了一台可被任何人(包括 AI)按按钮跑的质量机;如果不是,任何门禁都只是装饰。

05

工程闭环 + 拼好码

把前四层串成流水线,再加一条拼好码原则 —— 这就是从想法到产品的全部方法论。

工程闭环 —— 5 步流水线

下面是把前四层组装起来的标准动作。点击"下一步"看每一步发生了什么。

你 · 定义
📋
Plan · 拆解
🤖
AI · 执行
🚦
CI · 审查
📦
Skill 库 · 沉淀
点击"下一步"开始
🔄
为什么叫"闭环"

第 5 步把成功流程沉淀回 Skill 库,下一次第 1 步就能站在更高起点开始 —— 这是会自我增强的循环,不是直线流程。

拼好码 —— 别让 AI 替你重造世界

vibe-coding-cn 仓库里有一个反复强调的工程哲学:"成熟能力解决通用问题,胶水代码连接业务流程,自研只服务真正不可替代的差异。"

🎭

AI 顺手造轮子

症状:你说"做个 markdown 编辑器",AI 从零写一个 parser。
药方:先找成熟方案(remark / markdown-it),偏离必须说明理由。

🧩

复杂性爆炸

症状:身份认证自己撸,3 周后还在补边界。
药方:通用复杂度交给成熟生态(NextAuth / Clerk / Supabase Auth)。

🎓

交付不稳定

症状:同一个项目,换个人就跑不起来。
药方:胶水代码只负责连接、编排、适配和业务规则;不写"我的发明"。

读一段拼好码风格的代码

下面这段代码处理一个常见任务:用户上传 PDF → 提取文字 → 存到数据库。注意它每一行都在调成熟工具,自己写的几乎都是连接业务的胶水。

拼好码风格
// 1. 复用:云存储 SDK
const file = await oss.upload(req.file);

// 2. 复用:成熟 PDF 解析库
const text = await pdfParse(file.buffer);

// 3. 胶水:把结果接进业务表
const doc = await prisma.document.create({
  data: { userId, ossUrl: file.url, text }
});

// 4. 业务:发通知给协作者
await notifyCollaborators(doc.id);
每一行扮演什么角色

1 复用 —— 文件上传交给阿里云 OSS,你不写一个字节流处理。

2 复用 —— PDF 解析交给 pdf-parse,工业级稳定,不自己 reinvent。

3 胶水 —— 把外部能力的结果接进你自己的数据库;这是真正属于你的连接代码。

4 业务 —— "通知协作者"是只你的产品才有的逻辑,值得自己写。

通览全段:90% 是复用 + 胶水,10% 才是业务。这就是拼好码的健康分布。

五层 + 闭环 + 拼好码 —— 最终全景

Prompt

目标 + 约束 + 验收三件套,把模糊需求变成机器可读的指令。

Skill

把成功 prompt 沉淀为可触发、可校验的能力,告别"每次重写"。

Context

项目级 / 任务级 / 会话级 三层笔记,让 AI 不再失忆。

Quality Gate

Test + lint + type + schema + CI,把"我以为完成"变成"机器签字了才算"。

工程闭环 + 拼好码

5 步流水线串起以上四层;能复用绝不自研,只写胶水和业务。

小测:从原型到产品,先建哪一层?

场景

团队从一个能跑的原型出发,要推进到能持续上线的产品。资源有限,只能先建一层。你建议先上哪一层?

课程总结

🏔️
Vibe Coding 的最高境界

不是"和 AI 配合",而是让 AI 在你的工程系统里自由发挥。系统是约束,AI 是执行 —— 边界由你设定,运算交给它跑。这才是从"玩 demo"升级到"产品交付"的本质差别。

1
记住一句话

AI 不能自证正确 —— 凡是能被自动验证的,就不要写在 prompt 里。

2
明天就能用

挑你最近重复 ≥ 3 次的 prompt,用今天学的三件套结构改写一遍 —— 你会立刻看到结果稳定性的差别。

3
下一站

方法已经齐备,接下来要选趁手的兵器 —— Cursor / Claude Code / Codex / Continue,这些工具长得都很像,但选错会让方法论打骨折。

➡️
下一站:系列 3 · 工具地图

带着这套方法论进入Vibe Coding 系列 3(工具) —— 我们会逐一拆解 Cursor、Claude Code、Codex CLI、Cline 等主流 AI 编程工具的能力边界、配置门禁的姿势、以及它们各自最适合什么场景。方法 + 工具,你就拥有完整的 AI 结对编程工作流。