🐦 第6章 提示词编写和优化
📄 一句话概括

三个技巧:给例子、给边界、给输出格式。 三个都是「把话说死」的不同方式。 例子那一条本课量出了曲线:零个例子 3 / 6,每类三个例子 6 / 6。中间那段是平的。 平的那一段最值得看——例子的价值在覆盖几种说法,不在数量。

📝 本章和前面几章的关系

上一节给四段骨架,这一节给四段里的血肉。 三个技巧对应四段里的后两段:约束(边界)和格式(输出格式)。例子那一样是额外的,加在四段之外。 这一节是本章难度最高的一篇,因为它讲的是「怎么把模糊的要求变成模型执行得了的指令」。

一、技巧一:给例子

要它做分类、做改写、做固定格式的输出,光说规则不够——给两三条例子,效果立刻不一样。 演示里做了一个分类任务:六条用户留言,分到咨询、投诉、建议三类。

每类给几个例子 例子总数 分对 准确率
0 0 3 / 6 50%
1 3 3 / 6 50%
2 6 4 / 6 67%
3 9 6 / 6 100%

零例子那行是纯关键词规则的成绩。 加上例子之后往上走,但中间有一段是平的——从三个例子加到六个,一个都没多分对。 平的那一段是本节的重点:例子数量加了,覆盖面没加。

二、为什么第三个例子是决定性的

从六个例子加到九个,准确率从 67% 跳到 100%。 原因很简单: 第三批例子里有三条正好覆盖了测试集里那三种说法——「修了三次还是没好」对「修三次都没好」、 「能不能上门服务」对「能不能上门取车」、「首保要带什么材料」对「首保要带啥」。 前六个例子里没有这样的对照,所以加了等于没加。

挑例子的时候要问:这三条是不是在说同一件事的三种说法?是的话,再加三条也没用。 反过来,三条各说一件事,比九条说同一件事有用得多。

三、技巧二:给边界

边界就是「不许干什么」和「只能来自什么」。上一节讲过它的重要性,这一节讲写法。 写法一,只来自某处。 「金额与时间只能来自资料原文。」这一句把编造的路堵死了。 写法二,超了就怎样。 「资料里没有的,回答『需要转人工』。 」不只说不能编,还说编不了的时候怎么办。

写法三,给一个默认值。 「拿不准时输出咨询。 」分类任务必须有这一句,否则遇到模糊的样本它会随机挑。 三种写法里第二种最容易被漏。 只说「不许编」不够,还得说「编不了时说什么」——不然它就在「编」和「沉默」之间反复, 而沉默对用户是最差的体验。

四、技巧三:给输出格式

输出格式要写到「下游能直接用」的程度。 要 JSON 就给一个骨架,别只说「输出 JSON」。字段名、嵌套、要不要代码块包裹,都得写。 要几句就写几句,还要说「不用列表」「不加序号」。不然它会给你排成条目。

要标注出处就写清标法:「句末用 [1][2] 标出依据的资料编号」。 只说「标注出处」,标法每次都不一样。 格式这一段的好处是错了立刻能发现——不用看内容对不对,看形状就知道。 所以它是提示词里最容易调的一段。

五、三个技巧的合用顺序

别一次全上。一次全上,出了问题不知道是哪一样起的作用。 第一步,四段写齐,跑一遍。 记下准确率。 第二步,加边界(兜底那句)。 再跑。这一步通常改善的是「硬答」问题,不是准确率。

第三步,加例子。 再跑。这一步改善的才是准确率。 第四步,把例子从三条加到九条,看还有没有提升。 没有就别加了——按第 6.1 节的账, 多加六条例子会让整份提示词长三成,注意力预算更紧。 四步走完,你手上有一份「每一项都验证过」的提示词。这比一次写一份完美的提示词快得多。

六、一个容易忽略的点:例子的标签必须对

演示里那九个例子的标签是我手写的,全对。真项目里这一步最容易出错。 一条标错的例子,比没有例子更糟。 因为它不只是没帮上忙,它还在教错。 所以准备例子的时候要两个人各标一遍,不一致的挑出来讨论。九条例子两个人标,二十分钟的事。

还有一条:例子里的说法要贴近真实用户。拿书面语当例子,用户说口语时它还是不会分。

七、动手 Demo:给例子:从零个到五个,准确率怎么走

九条标注好的留言当例子池,六条当测试集。 例子从零个加到每类三个,看准确率怎么走,再看中间那一段为什么是平的。

def rule_only(s):          # 零例子:只有两条关键词规则
    if u'差' in s or u'投诉' in s:
        return u'投诉'
    if u'建议' in s or u'希望' in s:
        return u'建议'
    return u'咨询'

def with_examples(s, ex):  # 有例子:在例子里找最像的一条,抄标签
    if not ex:
        return rule_only(s)
    hits = Q.retrieve(s, [t for t, _g in ex], top=1)
    if not hits:
        return rule_only(s)      # 一条都不像,退回规则
    for t, g in ex:
        if t == hits[0][1]:
            return g
    return rule_only(s)

实跑输出:

--------------------------------------------------------------------
给例子:从零个到五个,准确率怎么走
--------------------------------------------------------------------


  ① 例子数从 0 到 3,准确率
  --------------------------------------------------------------------

| 每类给几个例子 | 例子总数 | 分对 | 准确率 |
|---:|---:|---:|---:|
| 0 | 0 | 3 / 6 | 50% |
| 1 | 3 | 3 / 6 | 50% |
| 2 | 6 | 4 / 6 | 67% |
| 3 | 9 | 6 / 6 | 100% |

  零例子那行是纯关键词规则的成绩。
  加上例子之后一路往上,但中间有一段平的——那一段是「例子数量加了,覆盖面没加」。

  ② 只给一个例子时,错在哪
  --------------------------------------------------------------------
  「等两个小时都没人接待」应为 投诉,判成了 咨询
  「修三次都没好」应为 投诉,判成了 咨询
  「能不能上门取车」应为 建议,判成了 咨询
  错的三条有个共同点:例子里没有和它说法相近的句子。
  「等两个小时都没人接待」和一个例子「服务态度差」一个字都不重合,找邻居找不到,只能退回规则,
  规则又把它当咨询。

  ③ 第三个例子为什么是决定性的
  --------------------------------------------------------------------
  从两个例子加到三个例子,准确率跳了一大截。
  因为第三批例子覆盖到了「修了三次还是没好」「能不能上门服务」「首保要带什么材料」这三种说法。
  例子的价值不在数量,在覆盖几种说法。
  所以挑例子的时候要问:这三条是不是在说同一件事的三种说法?是的话,再加三条也没用。

  ④ 例子不是越多越好
  --------------------------------------------------------------------
  例子多了有两个代价:提示词变长(第 6.1 节那个注意力预算),以及 token 变贵。
  实操建议:每类三到五条,挑说法差别最大的那几条,不要挑最像的。
  还有一条容易忽略:例子的标签必须绝对正确。一条标错的例子,比没有例子更糟。
  ! 这个 Demo 用的是「找最像的邻居」当 few-shot 的替身,只能看字面重合。
  真模型能跨过同义,所以真机上的曲线会比这张表好看——这张表是下限,不是上限。
  但它测出来的方向是真的:例子的覆盖面,决定了模型对「说法差异」的容忍度。

①第一张表四行。零例子 3 / 6,每类一个 3 / 6,每类两个 4 / 6,每类三个 6 / 6。 ②第一行到第二行一个都没涨——加了三个例子,成绩没动。 那三个例子离测试句太远。 ③第三行涨了一个,第四行涨了两个。最后那三个例子正好覆盖了测试集的三种说法。 ④第二段把错的三条列出来了。它们的共同点:例子里没有和它说法相近的句子。 「等两个小时都没人接待」和一个例子「服务态度差」一个字都不重合。 ⑤这个 Demo 用的是「找最像的邻居」当替身,只能看字面重合。 真模型能跨过同义,所以真机上的曲线会比这张表好看——这张表是下限。

30 秒实验

  1. 把你现在的提示词加三条例子(每种情况一条),跑一遍记分,再加三条,再记一次。
  2. 检查你例子的标签,找一个人重标一遍,看有几条不一致。
  3. 把「不许编」改成「不许编,编不了时说这句话」,再跑一遍那两个不能答的问题。

常见误区

  1. 「例子越多越好。」前六个例子一个分都没涨。例子的价值在覆盖说法,不在数量。
  2. 「只说不要编就够了。」不够。还得说「编不了时说什么」,不然它在编和沉默之间反复。
  3. 「例子随便写几条。」标签必须绝对正确,说法要贴近真实用户。一条错例子比没例子更糟。
自测三问(点开对答案) 1. 加了六个例子为什么没涨分? —— 例子数量加了,覆盖面没加。六个例子说的是同一批说法,测试集里的新说法一个都没覆盖。 2. 「不许编」还缺什么? —— 缺「编不了时说什么」。要给它一条兜底话术,不然它在编造和沉默之间反复。 3. 三个技巧该按什么顺序加? —— 四段、边界、例子。一步步加才知道哪一步起作用。一次全上,出问题分不清原因。

技巧都讲完了,最后一节落到平台上:提示词在扣子里有四个位置,每个位置该写什么、写错了会怎样。

相关笔记