Prompt 不灵了,接下来怎么办?
四种不同的失败穿着同一件外衣。诊断清楚是哪一种,能省下那些用来反复改写一个根本不是问题所在的 prompt 的时间。
输出不对时,人的本能是改写 prompt。但很多时候这一步是错的,因为问题根本不在 prompt。
四种失败从外面看一模一样。每一种的解法都不同,而改写只对其中一种有用。
四种类型
类型 1 · 任务没描述清楚
最常见的一种。模型做了一件合理的事;你想要的是另一件,但从没说过。
诊断: 一个靠谱的外包人员,只拿到这个 prompt,能做出你想要的东西吗?如果他也得靠猜,那模型也是靠猜。
解法: 把缺的那个维度说清楚——长度、格式、读者、重点、不要什么。或者给个例子,例子能解决你列举不完的歧义。
类型 2 · 信息根本不在里面
模型不可能知道你的代码库、你的定价,或上周的决定。你还是问了,它就给出一个像模像样但错误的东西。
诊断: 要答对,是否需要 prompt 里没有、也不属于公共常识的信息?另外:答案有没有对模型根本无从知晓的事给出斩钉截铁的具体说法?
解法: 把信息给进去,或者把它检索出来。再怎么写 prompt,也变不出模型没有的事实。
类型 3 · 推理没有落脚的地方
多步的问题,一个 token 的答案。五步的活,只给了一次前向传播。
诊断: 你会需要草稿纸吗?需要的话,模型也需要。
解法: 在要答案之前先要步骤。
类型 4 · 能力就是不够
有些任务超出了某个模型的能力,再怎么写 prompt 也没用。
诊断: 拿完全一样的 prompt 换一个更强的模型试。如果它成了,那就是类型 4。这一个测试是手边最快的诊断手段,却被用得很少。
解法: 换更强的模型,拆成更简单的子任务,或者给它一个工具——算术和查资料上的失败,用计算器或一次搜索调用通常比改措辞更好解决。
诊断顺序
按顺序来,因为每一步都很便宜,而且能排除掉一类:
1 · 把输出当成正确来读。 什么问题会让它成为正确答案?那个问题和你原本的问题之间的差距,就是你描述上的缺口。
2 · 看有没有编出来的细节。 对模型无从知晓的事情给出自信的具体说法,就是类型 2。
3 · 让它先推理。 准确率变好,就是类型 3。
4 · 同一个 prompt 换更强的模型。 好了就是类型 4——别再改措辞了。
5 · 跑五遍。 方差大说明 prompt 约束不足;五遍错得一模一样说明存在系统性的误解。这两种要的解法不同:一种是收紧约束,一种是重新描述。
6 · 把 prompt 砍掉一半。 长 prompt 里藏着自相矛盾,中间位置的指令被遵守得更不可靠。删掉一些内容有时就把问题解决了,这本身就是一条诊断线索。
由机制直接导致的症状
有些症状直接对应到机制,而不属于上面四种类型中的任何一种。
它无视了埋在 prompt 中间的一条指令。 位于上下文中部的指令被遵守得更不可靠。把它挪到开头或结尾。见长上下文为什么这么贵。
它忘了对话前面说过的内容。 多半是上下文截断,不是模型故障。查一下你的框架是不是在悄悄丢掉历史。
输出在半句话上断了。 是 token 上限,不是 prompt 问题。调高上限,或者少要一点。
同一个 prompt,每次答案都不一样。 是温度。做抽取和分类时设成 0。
它学到了例子的内容,而不是例子的模式。 你的例子和真实输入太像了。让它们明显区分开。
它听命于输入数据里的文本。 含指令式文字的内容被当成了指令。把输入清楚分隔开,并声明分隔符里的内容是数据。
两个值得养成的习惯
一次只改一处。 整个重写一遍,你无法知道是哪一处改动起了作用。
把失败的例子留下来。 存下三四个失败案例,就是一个回归集——这也是评测的起点,而只有评测才能告诉你一次 prompt 改动是真的变好了,还是只是把失败挪到了别处。
要点回顾
- 四种类型:描述不清、信息缺失、没有推理空间、能力不足。改措辞只能解决第一种。
- 把输出当成正确的来读——那个隐含的问题就暴露了你的描述缺口。
- 用完全相同的 prompt 换更强的模型,是排除能力因素最快的方法。
- 方差大说明约束不足;一直错说明理解错了。
- 截断、token 上限、温度、指令位置,都会造成看起来像 prompt 问题的症状。
下一篇: 为什么需要 RAG