第 8 节 · 45 分钟
Vibe Coding · 最后一节

Benchmark Day
+ Demo Day

先用 10 分钟核对你自己跑的两张榜,再由你讲 10 分钟。
最后收尾:vibe coding 为什么翻车、怎么审 AI 写的代码。

开始 Guoliang · 共 14 页
第 8 节 · 流程

今天四段:先核对两张榜,然后你讲 10 分钟,最后收尾

1
两张榜 · 10 分钟

并排核对 6 分钟、判读 2 分钟、四件陷阱 2 分钟。名次差你在作业里已经算好,今天只核对、只判读。

2
评分、怎么讲、项目图 · 6 分钟

先讲清评分的三项,再过一遍十分钟的四段结构,最后指一遍项目全图。听完你就知道我等会儿在听什么。

3
你讲 · 15 分钟

准备 5 分钟:打开游戏和两张榜,小声走一遍。然后投屏你的 localhost,从头讲到尾,最后三分钟归我提问。

4
收尾 · 12 分钟

翻车的三种样子、审代码的四个问题、八个词过一遍,再说咒语过期之后留下什么。

第 1 到 3 分钟
游戏演示

现场猜两三个词,让我看见分数在动。不讲你怎么做的,只让它跑。

第 4 到 7 分钟
两张榜与结论

A 榜 B 榜并排,念名次差最大和最小的那两个模型,再说「雇谁」。

第 8 到 10 分钟
我提问

我会问两三个。答不上来就说「我不知道」,比现编一个强。

课堂活动6分钟
第 8 节 · 对照实验

把你的两张榜并排,
逐行核对名次差

  1. 先点数:results/promptA/ 里应有 6 个结果文件,每个模型一个、每个 3 局;results/promptB/ 也是 6 个。少了就在表上写「—」,注明缺哪个模型。
  2. 打开排行榜页,每个模型应有 A、B 两行,抄下两张榜的中位轮数。
  3. 摆出你作业里算好的名次差,逐行核对:A 榜名次、B 榜名次、名次差。
  4. 圈出名次差最大的模型和名次差为 0 的模型,等会儿讲的时候各说一句。
  5. 核对表头:两批的目标词、局数、记分口径完全一样。

同一个人、同一套目标词、同样 18 局、同一把尺子 —— 唯一变的是 prompt。变量只剩一个,两张榜的差别才算得到 prompt 头上。

你应该看到什么

一张两栏对照表。有几行两边名次一模一样,名次差 0;也有一两行差出两三格。9B 对照组那一行很可能有没猜中的局:没猜中按 51 计(上限 50 + 1),3 局里有 2 局没猜中,中位轮数就是 51。

卡住了先做什么

某一栏是空的:跑 curl -s localhost:3001/api/results/raw 看文件读进去没有,缺 games 数组的文件会被后端跳过。

两栏的目标词对不上:说明 B 那批跑的时候换了词,变量不止一个。备注里写明,今天的结论只能说到「有可能」。

第 8 节 · 讨论

名次几乎不动的是模型实力,晃来晃去的是 prompt 噪音

模型A 榜名次B 榜名次名次差判读
Claude Sonnet 5110换了一套完全不同的说法它还是第一 → 实力。这句可以说硬
OpenAI 旗舰253只换 prompt 就掉 3 格 → 噪音。只看 A 榜说「它第二」不安全
Gemini 旗舰321动 1 格,在随机性范围内 → 当作稳
DeepSeek 旗舰431同上。和 Gemini 只差 1 格,这两个分不出高下
Qwen 旗舰541同上。稳定在中下
9B 小模型对照660两套 prompt 都救不了它 → 今天最硬的一条结论
示例数据(虚构,只示范算法)。两张榜各自内部按「中位轮数」从小到大排名;名次差 =|A 榜名次 − B 榜名次|
判读口径

名次差 0–1:是实力

2–3:是 prompt 噪音

4 以上:这两张榜谁也说明不了

名次差小 = 模型实力

换了个说法它还在那个位置,这个名次是它自己挣来的。前提:两批的目标词、局数、记分口径完全一样,唯一的变量是 prompt

名次差大 = prompt 噪音

名次晃 3 格,说明「你怎么跟它说话」的影响已经盖过「它是不是好模型」。这时候「它最强」只能写成「在我的 prompt A 下它最强」。

第 8 节 · 讨论

下结论之前,先承认这四件事会让数字骗你

01 · 目标词太少
中位数是在 3 个数上取的

每张榜每个模型只有 3 局。换三个目标词,那一列就可能整个翻个个儿 —— 所以名次差是 0,也可能只是这三个词碰巧不为难它。

每张榜 6 个模型 × 3 局 = 18 局

02 · 名次是相对量
名次差 1 不等于实力差 1

名次只说明「在这 6 个里排第几」,不说明差多少。第 2 名和第 3 名可能只差 1 轮,也可能差 20 轮。写结论时名次和原始轮数要一起写。

名次旁边永远带上中位轮数

03 · 随机性
同一个 prompt 重跑也会变

模型每次输出不完全一样,prompt 一个字不改重跑一遍,名次照样能动一格。所以名次差 1 不值得解释,差 2 以上才值得开口。

解释的门槛:名次差 ≥ 2

04 · 型号与价格会变
榜是有保质期的

preview 型号说没就没,bench 报 HTTP 404 多半就是这个,跑之前先核对一次。价格也随时改;强制开思考的那几个模型,思考 token 按输出计价,记得传 --reasoning-effort low

npm run pull-models

第 8 节 · Rubric(评分标准)

三项各占三分之一,网页好不好看不占分

评分项好的样子差的样子
意图清晰度 目标、约束、退路各写成一段。换一台电脑、拿你的 prompt 重跑一遍,得到的东西跟你的差不多。 「帮我做个猜词游戏」。剩下的全让 agent 猜,所以每跑一次都不一样。
工程规范性 CLAUDE.md,输入数据用标签隔开,对话记录和存档记录都留着;出错时让它先给命令输出。 全靠聊天框里口头指挥,一出错就开新会话重来,之前说过的约束一条都没留下,改坏了也没有存档可回。
结论的证据质量 两套 prompt 的对照跑齐了,跑了几局、上限多少轮、没猜中怎么记分、花费怎么折算都写着,并且自己说出一条局限。 Claude 最强」。只有一张榜,没说样本量,没说哪几局没猜中,也没说换个 prompt 名次会不会晃。
三项等权。评的是你怎么指挥和怎么求证,不是你的配色。
1 / 3
每项占的分

三项互相独立:游戏跑不起来,但结论写得诚实,第三项照样拿满。

为什么第三项看证据

这门课最后交的是一份 benchmark(基准测试)报告,不是一个网页,所以第三项评的是结论有没有数据撑着。

第 8 节 · 怎么讲

讲得出来才算真懂:按这四段走,别打乱顺序

1
演示 3 分钟
做了什么

开着游戏说,别念稿。先让它跑起来,我才知道后面那些数是从哪来的。

示范开头:「这是一个中文猜词游戏,我现在猜一个词给你看 —— 这个分数是两个词的余弦相似度乘 100。」

2
结论 4 分钟 · 开头
怎么验证的

先交代你怎么保证这些数是可比的,再给数。顺序反了,数就没人信。

示范开头:「同样 6 个模型、同样 3 个目标词、上限都是 50 轮,两套 prompt 各跑 18 局,唯一变的就是 prompt。」

3
结论 4 分钟 · 主体
数据说明什么

先给结论,再给撑着它的那一行数。别把整张表念一遍,只念你用到的那几个。

示范开头(N、X 换成你表上的数):「只能雇一个的话我雇它 —— 两张榜都是第一,名次差 0,中位 N 轮,每局 X 美元。」

4
结论 4 分钟 · 收尾
局限在哪

你自己说出来,别等我问。主动说局限不扣分,被问出来才扣。

示范开头:「这个结论最弱的地方是只有 3 个目标词,换一批词,第三名到第五名很可能就换位置。」

一个字都不用背。但凡有一段你只能照着念、答不了追问,
那一段你就还没真懂 —— 现在还来得及翻回你自己的记录去看。

第 8 节 · 项目全图

这张图上的每个词,你都能指出它在你电脑上的位置

你的项目文件夹 semantle/ 存档 · 整个文件夹的每一张照片
浏览器

前端

localhost:5173 client/
输入框
分数
历史列表
排行榜页
后端
服务器 = 角色

同时跑着的另一个程序

localhost:3001 server/
API
/api/game/…/guess
算余弦、给名次

两个程序会互相说话

HTTP

请求:我猜「苹果」

响应:{ score: 分数, rank: 名次 }

node_modules/ · 零件(npm install 拿回来的)
词向量文件
data/vectors.f32
results/
每批一个 JSON
OpenRouter

别人电脑上的模型

openrouter.ai
API
读历史,写下一个词
HTTP

请求:历史 + 你的 prompt

响应:下一个词

.env 里的 key · 门票不进存档
门口的回话 200 成功 401 门票不对 402 余额不足 404 找错门 429 敲得太频繁
图上的词 前端 后端 端口 依赖 HTTP API 服务器 状态码 key 存档

开讲时先指着这张图说清三个框,家里人也能跟上你后面讲的两张榜。

你讲10分钟
第 8 节 · 讲解

轮到你了

  1. 先准备 5 分钟:提纲和 hire.md 作业里已经写好,你只要打开游戏和两张榜,小声走一遍。
  2. 前 3 分钟只演示游戏:投屏你的 localhost,现场猜两三个词,让分数动起来。
  3. 中间 4 分钟讲两张榜:名次差最大的模型和名次差为 0 的模型各解释一句,再念「雇谁」那一页。
  4. 最后 3 分钟我提问。答不上来就说「我不知道,我回去查」—— 比现编一个答案得分高。
听众是谁 · 计时器摆在桌上

听众是我。你愿意的话,把家里人也叫上 —— 对着不懂技术的人讲明白,更能说明你真懂了。三段各自计时:343 分钟,超了我提醒你,但不打断。

你应该看到什么

演示那 3 分钟会最顺,讲两张榜的 4 分钟开始磕巴,最后 3 分钟里大概会有一两个问题把你问住。这很正常 —— 被问住的那两处,就是你自己还没想透的地方。

卡住了先做什么

游戏起不来:先 npm run dev,把终端报错原样贴给 agent 要原因。讲到一半忘词:回到提纲的四段,说出你正在第几段,接着往下讲。前 7 分钟我一句话都不插,问题全攒到最后 3 分钟,一次问一个。

第 8 节 · 收尾

翻车几乎都是这三件事之一

翻车 1
不看代码就接受

「能跑」不等于「对」。你没看过的那一段,等它出问题的时候,你连从哪里开始找都不知道。

翻车 2
让它改测试凑绿灯

让测试变绿有两条路:把代码改对,或者把测试改松。第二条更快,你不盯着,它就会走第二条。

翻车 3
项目一大就腐烂

前二十次对话很爽;到第五十次,它开始重复造轮子、改坏已经好了的地方 —— context window(上下文窗口,它一次能看见的全部文字)装不下整个项目。

真实事件

三条翻车,它一次占了两条

SaaStr 创始人 Jason LemkinReplit 上做 vibe coding 实验。

他明确要求代码冻结期间,agent 删掉了生产数据库(存用户数据的地方)。

事后它说不能回滚(就是你第 2 节学的「回到上一个存档」),实际上可以。

Replit 的 CEO 公开道歉,并宣布加护栏。

来源:Jason Lemkin 本人的公开帖文与 Replit 官方回应。课上只讲双方都确认过的部分。

第 8 节 · 收尾

你不用读懂每一行,你要分得清证据和说法

1
它跑了没有?

别看它说「已完成」,看终端里那条命令的输出。让它把命令和输出原样贴出来。

2
测试是它写的,还是它改的?

让它给改前改后的对照(就是存档三句话里的第二句,命令叫 git diff)。测试文件被动过,就追问改了哪一行、为什么这样改就绿了。

3
diff 里有没有你没要的改动?

你只让它改算分那一段,它顺手动了另外三个文件 —— 那三个就是下一次的 bug。

4
报错时它给证据还是给解释?

「可能是缓存问题」是解释;「我跑了这条命令,输出是这一段」是证据。只接受后者。

基于证据的审计

让 AI 审 AI 有用:格式、明显的错、漏掉的边界,它比你快。
但「这个改动该不该进」永远是人来判断 —— 只有你知道你要什么。

第 8 节 · 回顾

八个词,每个都能在你的项目里指出位置

3.0

这八节课你做的每件事都在 Software 3.0 那一列:程序是说出来的。

token

词元:模型读写文字的最小单位。

在你项目里:账单按它算,每猜一轮花掉一批。

embedding

词向量:一个词对应的 200 个数字。

在你项目里:vectors.f32 里的一行。

vector space

向量空间:所有词住在同一个 200 维空间里,位置就是意思。

在你项目里:意思近的词离得近,分数从这来。

cosine

余弦相似度:两个向量方向有多接近。

在你项目里:后端每次算的那一下,乘 100 就是分数。

context window

上下文窗口:模型一次能看见的全部文字。

在你项目里:装历史猜测的那个盒子,会满。

agent loop

智能体循环:喂历史 → 出词 → 算分 → 再喂,直到猜中或到上限。

在你项目里:让 AI 自己跑完一局的那段代码。

tool use

工具调用:模型不自己算,调用你给它的函数。

在你项目里:它只给词,算分的是你的代码。

eval

评测:用固定题目和固定指标去量模型。

在你项目里:两套 prompt × 6 个模型 × 3 个词。

第 8 节 · 态度

咒语会过期,这三样不会

1
把话说清楚

「在末尾加一句就变聪明」这种技巧,很快就会变成模型的默认行为。结构化地把要什么说出来,练到八十岁都还在用。

2
外部化意图

写进文件,不是留在脑子里:目标写进 prompt,规矩写进 CLAUDE.md。它越聪明,你越要把「我到底要什么」写下来。

3
审证据

要命令输出、要 diff、要样本量。执行的成本降到零之后,剩下的成本全在「怎么知道它做对了」。

下一步

想接着走,有这三个去处;另外作业单里留了一个可选任务。

公开课件

斯坦福 CS146S《The Modern Software Developer》

themodernsoftware.dev

演讲

Karpathy 在 YC 的演讲《Software Is Changing (Again)》

圆桌

Anthropic 讲提示词的圆桌:临时工比喻和「给模型一条退路」都出自那里

可选作业 · 不用交

把项目的 README(门口的说明书)写成家长能照着跑起来的样子,约 30–45 分钟

第 8 节 · 完

不看你解决问题多强,
看你选择解决什么问题。

「解决」这一半正在被机器接管,剩给人的是「选择」那一半。
课到这里结束,你的项目不用。

回到封面 Vibe Coding · 八节课 · 完
01 / 14