Benchmark Day
+ Demo Day
先用 10 分钟核对你自己跑的两张榜,再由你讲 10 分钟。
最后收尾:vibe coding 为什么翻车、怎么审 AI 写的代码。
今天四段:先核对两张榜,然后你讲 10 分钟,最后收尾
并排核对 6 分钟、判读 2 分钟、四件陷阱 2 分钟。名次差你在作业里已经算好,今天只核对、只判读。
先讲清评分的三项,再过一遍十分钟的四段结构,最后指一遍项目全图。听完你就知道我等会儿在听什么。
准备 5 分钟:打开游戏和两张榜,小声走一遍。然后投屏你的 localhost,从头讲到尾,最后三分钟归我提问。
翻车的三种样子、审代码的四个问题、八个词过一遍,再说咒语过期之后留下什么。
现场猜两三个词,让我看见分数在动。不讲你怎么做的,只让它跑。
A 榜 B 榜并排,念名次差最大和最小的那两个模型,再说「雇谁」。
我会问两三个。答不上来就说「我不知道」,比现编一个强。
把你的两张榜并排,
逐行核对名次差
- 先点数:results/promptA/ 里应有 6 个结果文件,每个模型一个、每个 3 局;results/promptB/ 也是 6 个。少了就在表上写「—」,注明缺哪个模型。
- 打开排行榜页,每个模型应有 A、B 两行,抄下两张榜的中位轮数。
- 摆出你作业里算好的名次差,逐行核对:A 榜名次、B 榜名次、名次差。
- 圈出名次差最大的模型和名次差为 0 的模型,等会儿讲的时候各说一句。
- 核对表头:两批的目标词、局数、记分口径完全一样。
同一个人、同一套目标词、同样 18 局、同一把尺子 —— 唯一变的是 prompt。变量只剩一个,两张榜的差别才算得到 prompt 头上。
一张两栏对照表。有几行两边名次一模一样,名次差 0;也有一两行差出两三格。9B 对照组那一行很可能有没猜中的局:没猜中按 51 计(上限 50 + 1),3 局里有 2 局没猜中,中位轮数就是 51。
某一栏是空的:跑 curl -s localhost:3001/api/results/raw 看文件读进去没有,缺 games 数组的文件会被后端跳过。
两栏的目标词对不上:说明 B 那批跑的时候换了词,变量不止一个。备注里写明,今天的结论只能说到「有可能」。
名次几乎不动的是模型实力,晃来晃去的是 prompt 噪音
| 模型 | A 榜名次 | B 榜名次 | 名次差 | 判读 |
|---|---|---|---|---|
| Claude Sonnet 5 | 1 | 1 | 0 | 换了一套完全不同的说法它还是第一 → 实力。这句可以说硬 |
| OpenAI 旗舰 | 2 | 5 | 3 | 只换 prompt 就掉 3 格 → 噪音。只看 A 榜说「它第二」不安全 |
| Gemini 旗舰 | 3 | 2 | 1 | 动 1 格,在随机性范围内 → 当作稳 |
| DeepSeek 旗舰 | 4 | 3 | 1 | 同上。和 Gemini 只差 1 格,这两个分不出高下 |
| Qwen 旗舰 | 5 | 4 | 1 | 同上。稳定在中下 |
| 9B 小模型对照 | 6 | 6 | 0 | 两套 prompt 都救不了它 → 今天最硬的一条结论 |
名次差 0–1:是实力
2–3:是 prompt 噪音
4 以上:这两张榜谁也说明不了
换了个说法它还在那个位置,这个名次是它自己挣来的。前提:两批的目标词、局数、记分口径完全一样,唯一的变量是 prompt。
名次晃 3 格,说明「你怎么跟它说话」的影响已经盖过「它是不是好模型」。这时候「它最强」只能写成「在我的 prompt A 下它最强」。
下结论之前,先承认这四件事会让数字骗你
每张榜每个模型只有 3 局。换三个目标词,那一列就可能整个翻个个儿 —— 所以名次差是 0,也可能只是这三个词碰巧不为难它。
每张榜 6 个模型 × 3 局 = 18 局
名次只说明「在这 6 个里排第几」,不说明差多少。第 2 名和第 3 名可能只差 1 轮,也可能差 20 轮。写结论时名次和原始轮数要一起写。
名次旁边永远带上中位轮数
模型每次输出不完全一样,prompt 一个字不改重跑一遍,名次照样能动一格。所以名次差 1 不值得解释,差 2 以上才值得开口。
解释的门槛:名次差 ≥ 2
preview 型号说没就没,bench 报 HTTP 404 多半就是这个,跑之前先核对一次。价格也随时改;强制开思考的那几个模型,思考 token 按输出计价,记得传 --reasoning-effort low。
npm run pull-models
三项各占三分之一,网页好不好看不占分
| 评分项 | 好的样子 | 差的样子 |
|---|---|---|
| 意图清晰度 | 目标、约束、退路各写成一段。换一台电脑、拿你的 prompt 重跑一遍,得到的东西跟你的差不多。 | 「帮我做个猜词游戏」。剩下的全让 agent 猜,所以每跑一次都不一样。 |
| 工程规范性 | 有 CLAUDE.md,输入数据用标签隔开,对话记录和存档记录都留着;出错时让它先给命令输出。 | 全靠聊天框里口头指挥,一出错就开新会话重来,之前说过的约束一条都没留下,改坏了也没有存档可回。 |
| 结论的证据质量 | 两套 prompt 的对照跑齐了,跑了几局、上限多少轮、没猜中怎么记分、花费怎么折算都写着,并且自己说出一条局限。 | 「Claude 最强」。只有一张榜,没说样本量,没说哪几局没猜中,也没说换个 prompt 名次会不会晃。 |
三项互相独立:游戏跑不起来,但结论写得诚实,第三项照样拿满。
这门课最后交的是一份 benchmark(基准测试)报告,不是一个网页,所以第三项评的是结论有没有数据撑着。
讲得出来才算真懂:按这四段走,别打乱顺序
开着游戏说,别念稿。先让它跑起来,我才知道后面那些数是从哪来的。
示范开头:「这是一个中文猜词游戏,我现在猜一个词给你看 —— 这个分数是两个词的余弦相似度乘 100。」
先交代你怎么保证这些数是可比的,再给数。顺序反了,数就没人信。
示范开头:「同样 6 个模型、同样 3 个目标词、上限都是 50 轮,两套 prompt 各跑 18 局,唯一变的就是 prompt。」
先给结论,再给撑着它的那一行数。别把整张表念一遍,只念你用到的那几个。
示范开头(N、X 换成你表上的数):「只能雇一个的话我雇它 —— 两张榜都是第一,名次差 0,中位 N 轮,每局 X 美元。」
你自己说出来,别等我问。主动说局限不扣分,被问出来才扣。
示范开头:「这个结论最弱的地方是只有 3 个目标词,换一批词,第三名到第五名很可能就换位置。」
一个字都不用背。但凡有一段你只能照着念、答不了追问,
那一段你就还没真懂 —— 现在还来得及翻回你自己的记录去看。
这张图上的每个词,你都能指出它在你电脑上的位置
前端
localhost:5173 client/同时跑着的另一个程序
localhost:3001 server/两个程序会互相说话
请求:我猜「苹果」
响应:{ score: 分数, rank: 名次 }
node_modules/ · 零件(npm install 拿回来的)别人电脑上的模型
openrouter.ai请求:历史 + 你的 prompt
响应:下一个词
开讲时先指着这张图说清三个框,家里人也能跟上你后面讲的两张榜。
轮到你了
- 先准备 5 分钟:提纲和 hire.md 作业里已经写好,你只要打开游戏和两张榜,小声走一遍。
- 前 3 分钟只演示游戏:投屏你的 localhost,现场猜两三个词,让分数动起来。
- 中间 4 分钟讲两张榜:名次差最大的模型和名次差为 0 的模型各解释一句,再念「雇谁」那一页。
- 最后 3 分钟我提问。答不上来就说「我不知道,我回去查」—— 比现编一个答案得分高。
听众是我。你愿意的话,把家里人也叫上 —— 对着不懂技术的人讲明白,更能说明你真懂了。三段各自计时:3、4、3 分钟,超了我提醒你,但不打断。
演示那 3 分钟会最顺,讲两张榜的 4 分钟开始磕巴,最后 3 分钟里大概会有一两个问题把你问住。这很正常 —— 被问住的那两处,就是你自己还没想透的地方。
游戏起不来:先 npm run dev,把终端报错原样贴给 agent 要原因。讲到一半忘词:回到提纲的四段,说出你正在第几段,接着往下讲。前 7 分钟我一句话都不插,问题全攒到最后 3 分钟,一次问一个。
翻车几乎都是这三件事之一
「能跑」不等于「对」。你没看过的那一段,等它出问题的时候,你连从哪里开始找都不知道。
让测试变绿有两条路:把代码改对,或者把测试改松。第二条更快,你不盯着,它就会走第二条。
前二十次对话很爽;到第五十次,它开始重复造轮子、改坏已经好了的地方 —— context window(上下文窗口,它一次能看见的全部文字)装不下整个项目。
三条翻车,它一次占了两条
SaaStr 创始人 Jason Lemkin 在 Replit 上做 vibe coding 实验。
他明确要求代码冻结期间,agent 删掉了生产数据库(存用户数据的地方)。
事后它说不能回滚(就是你第 2 节学的「回到上一个存档」),实际上可以。
Replit 的 CEO 公开道歉,并宣布加护栏。
来源:Jason Lemkin 本人的公开帖文与 Replit 官方回应。课上只讲双方都确认过的部分。
你不用读懂每一行,你要分得清证据和说法
别看它说「已完成」,看终端里那条命令的输出。让它把命令和输出原样贴出来。
让它给改前改后的对照(就是存档三句话里的第二句,命令叫 git diff)。测试文件被动过,就追问改了哪一行、为什么这样改就绿了。
你只让它改算分那一段,它顺手动了另外三个文件 —— 那三个就是下一次的 bug。
「可能是缓存问题」是解释;「我跑了这条命令,输出是这一段」是证据。只接受后者。
让 AI 审 AI 有用:格式、明显的错、漏掉的边界,它比你快。
但「这个改动该不该进」永远是人来判断 —— 只有你知道你要什么。
八个词,每个都能在你的项目里指出位置
这八节课你做的每件事都在 Software 3.0 那一列:程序是说出来的。
词元:模型读写文字的最小单位。
在你项目里:账单按它算,每猜一轮花掉一批。
词向量:一个词对应的 200 个数字。
在你项目里:vectors.f32 里的一行。
向量空间:所有词住在同一个 200 维空间里,位置就是意思。
在你项目里:意思近的词离得近,分数从这来。
余弦相似度:两个向量方向有多接近。
在你项目里:后端每次算的那一下,乘 100 就是分数。
上下文窗口:模型一次能看见的全部文字。
在你项目里:装历史猜测的那个盒子,会满。
智能体循环:喂历史 → 出词 → 算分 → 再喂,直到猜中或到上限。
在你项目里:让 AI 自己跑完一局的那段代码。
工具调用:模型不自己算,调用你给它的函数。
在你项目里:它只给词,算分的是你的代码。
评测:用固定题目和固定指标去量模型。
在你项目里:两套 prompt × 6 个模型 × 3 个词。
咒语会过期,这三样不会
「在末尾加一句就变聪明」这种技巧,很快就会变成模型的默认行为。结构化地把要什么说出来,练到八十岁都还在用。
写进文件,不是留在脑子里:目标写进 prompt,规矩写进 CLAUDE.md。它越聪明,你越要把「我到底要什么」写下来。
要命令输出、要 diff、要样本量。执行的成本降到零之后,剩下的成本全在「怎么知道它做对了」。
想接着走,有这三个去处;另外作业单里留了一个可选任务。
斯坦福 CS146S《The Modern Software Developer》
themodernsoftware.dev
Karpathy 在 YC 的演讲《Software Is Changing (Again)》
Anthropic 讲提示词的圆桌:临时工比喻和「给模型一条退路」都出自那里
把项目的 README(门口的说明书)写成家长能照着跑起来的样子,约 30–45 分钟
不看你解决问题多强,
看你选择解决什么问题。
「解决」这一半正在被机器接管,剩给人的是「选择」那一半。
课到这里结束,你的项目不用。