READING MODE
我的 AI 怎么老给同一个答案——用测试把它修好了
前阵子做了个小东西叫 Rootwisdom · 菜根谭:你告诉它今天心情怎么样,它从 360 条菜根谭语录里挑一句最适合你的回复。
上线之后自己用了几天,发现不对劲——不管我输"工作累""和朋友吵架"还是"考砸了",它都给我同一句:
「苦难是人生之师,磨砺是品德之砥,逆境是英才之炉,失败是成功之母。」
第一次看还挺励志的,第三次就烦了。360 条语录你就会这一句?
光靠自己点几下说不清楚问题有多严重。我决定先写测试,用数据说话。
先量化,别急着改
没有数据之前,"感觉老是同一句"只是直觉。我想知道的是:到底有多集中?是偶尔重复还是系统性的?
于是写了个集成测试:准备 10 种不同的心情(疲惫、吵架、开心、迷茫、挫折、愉悦、焦虑、考砸了、孤独、释然),每种调 3 次 API,看返回了什么。
测试跑完,输出长这样:
疲惫 → #220, #220, #220
人际冲突 → #220, #220, #220
迷茫 → #220, #220, #220
焦虑担心 → #220, #220, #220
失败焦虑 → #220, #220, #220
#220 占比: 19/30 (63.3%)
30 次调用,19 次返回同一条。360 条语录约等于摆设。
好,问题量化了。63.3%——比我想的严重得多。
四轮迭代,一次只改一个东西
接下来改 prompt。我给自己定了个规矩:每次只动一个变量,跑完测试再决定下一步。不然改了三个地方效果好了,你都不知道是哪个起的作用。
第一轮:告诉 AI "别选万金油"
原来的 prompt 只说"选最合适的",但没说什么叫"合适"。加了一段选择策略,大意是:不要选那种对谁都适用的笼统语录,360 条里什么主题都有,挑具体的。
跑测试——#220 从 63% 降到了 50%。有效果,但 AI 执行力一般,嘴上说好的但手上还是偷懒。
第二轮:把 temperature 从 0.7 调到 0.9
temperature 控制 AI 回答的随机性。0.7 偏保守——AI 倾向于挑"最安全"的选项,而 #220 那句排比(苦难、逆境、失败,啥都沾一点)就是"最安全"的。
调到 0.9,#220 降到了 20%,不同语录数从 8 种涨到 11 种。进步明显。
好奇之下又试了 1.0,结果反而更差——26.7%。temperature 太高,AI 变得飘忽不定,随机出来的答案有时反而更集中。0.9 是个甜区,至少对 GPT-4o-mini 来说是。
第三轮:每次请求打乱语录顺序
之前 360 条语录按固定顺序塞给 AI。我怀疑有位置偏差——列表中间某些位置的内容可能更容易被"看到"。
改动就一行代码,每次请求前 shuffle 一下列表顺序:
const shuffled = [...quotes].sort(() => Math.random() - 0.5);
跑完测试我愣了:#220 降到 13%,不同语录数从 11 直接跳到 16,10 种心情里有 9 种出现了多样的结果。一行代码,效果比前两轮加起来都大。
第四轮:直接举反例
前三轮都在说"别选万金油",但 AI 对什么算"万金油"理解得不够精确。这次我在 prompt 里直接写了:
不要选择把"苦难""逆境""失败"等词简单排比的语录
(如"苦难是…,逆境是…,失败是…"),
这类语录对什么情绪都泛泛适用,缺乏针对性
举例:
用户说"工作累"→ 找谈忙闲、张弛的语录
用户说"吵架"→ 找谈宽容、退让的语录
告诉 AI "什么不该选"远不如同时告诉它"遇到这种情况该怎么选"。
最终结果:#220 降到 10%,30 次调用覆盖了 23 种不同语录,10 种心情全部出现了多样结果。
四轮数据一览
| 轮次 | #220 占比 | 不同语录数 | 多样性 | 改了什么 |
|---|---|---|---|---|
| 基线 | 63.3% | 7 | 5/10 | — |
| 第一轮 | 50.0% | 8 | 4/10 | prompt 加选择策略 |
| 第二轮 | 20.0% | 11 | 5/10 | temperature 0.7→0.9 |
| 第三轮 | 13.3% | 16 | 9/10 | 打乱语录顺序 |
| 第四轮 | 10.0% | 23 | 10/10 | 举反例 + 正面引导 |
踩坑之后的几点感受
LLM 天生爱偷懒
第 220 条那句话,"苦难""逆境""失败"排成一排,什么负面情绪都能沾上边。对 AI 来说选它永远不算错——就像考试不会做的时候选 C 一样。你不在 prompt 里明确告诉它"贴切比安全更重要",它就会一直选那个最稳的。
列表顺序真的有影响
这是我没想到的。就是把 360 条语录的顺序随机打乱,什么都没改,结果直接好了一大截。LLM 处理长列表的时候,注意力分配确实不均匀。以后凡是给 AI 发候选列表,我都会先 shuffle 一下。
temperature 有甜区
0.7 太保守,1.0 太飘。0.9 刚好。但这个数字跟模型有关,换一个模型可能就不一样了。怎么找?跑测试。
"不要做 X"不如"遇到 Y 请做 Z"
前三轮我一直在说"不要选万金油",效果有但到了瓶颈。第四轮加了几个正面例子("工作累→找忙闲的""吵架→找宽容的"),一下子就打通了。跟带新人一样——光说"别犯错"没用,你得告诉他"遇到这种情况该怎么做"。
最后
整个过程最大的收获不是修好了这个 bug,而是建立了一套可以反复用的流程:写测试量化问题 → 一次改一个变量 → 用数据验证效果。
LLM 的输出确实有随机性,但随机不等于不可度量。跑 30 次取个分布,问题就从"感觉不太对"变成了"63.3% 集中在同一条"——后者你能修,前者你只能干瞪眼。
菜根谭这个项目的代码和测试都开源在 GitHub 上,感兴趣可以去看。