← 返回文章列表

READING MODE

我的 AI 怎么老给同一个答案——用测试把它修好了

·10 分钟
prompt-engineeringtestingllmrootwisdom

前阵子做了个小东西叫 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%75/10
第一轮50.0%84/10prompt 加选择策略
第二轮20.0%115/10temperature 0.7→0.9
第三轮13.3%169/10打乱语录顺序
第四轮10.0%2310/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 上,感兴趣可以去看。