🐦 第13章 实战案例:智能客服
📄 一句话概括

产品问题这条支路三步:改写、检索、生成。三步一步都不能省,省哪步坏哪样,而且都不报错。 五句口语直接检索只落到一句;加一张同义词表换词之后,五句全对。改的是词,不是意思。 生成那一步的活是「把检索到的段落说成人话」,不是「自己编一个答案」。

📝 本章和前面几章的关系

这一节对应书上三个小节:问题理解与改写、知识库配置与检索、大模型回复生成。 三个小节点串成一条直线,没有分支。这一章的分支在 13.2 的意图识别和 13.8 的兜底。 改写这一步很多人省掉。省掉之后链不会报错,只是答不上来的比例悄悄变高。

一、口语直接检索,五句落一句

五句真实说法:「这玩意儿咋这么保温」「能不能退啊」「盖子能拆下来洗不」「拍下多久到」「有优惠没」。 直接拿这五句去检索五段产品说明,字面分全在 0.10 以下,只有第一句靠「保温」两个字落到第一段。 正确率一句。 原因很直白:用户说「这玩意儿」「咋」「洗不」,文档写「保温杯」「怎么」「清洗」。 同一个意思,一个词都不重合。

这不是检索坏了,是口语和文档本来就是两套词。 所以中间要插一步换词。

二、改写只能换词,不能换意思

原话 改写后 对不对
这玩意儿咋这么保温 保温杯怎么这么保温 对
能不能退啊 能不能退货 对
盖子能拆下来洗不 杯盖能拆下来清洗吗 对
拍下多久到 下单多久送到 对
有优惠没 会员有什么优惠 对

看第二列:句子还是那个句子,只是把口语词换成了文档词。五句全对。 改意思就成了「替用户重新提问」,那是另一个错。 用户问能不能退,你改写成了怎么退——答案会跑偏, 而且用户看不出来你改过。 真机上这一步交给大模型,它还能换句式(「有没有盖子能拆的型号」也能改写过来)。 本课的同义词表只会换词,演示的是下限,不是上限。

三、生成那一步在干什么

检索到两段之后,把它们拼成上下文喂进去: 「[1] 保温杯支持七天无理由退货……[2] 保温杯的杯盖可以拆开清洗……」。 生成节点的活是把这两段说成人话。不是自己编一个答案。 提示词里要写死一句:只根据给定资料回答,资料里没有就说不知道。这一句不写, 模型会用它自己的常识补——补得挺像,但对不上你们的产品。

这一句是第 6 章讲的「边界句」。 它在客服场景里的分量比在别处重:别处编错了用户能看出来,客服编错了用户会照着做。

四、三步省掉哪一步

省掉哪步 结果 代价
省掉改写 口语问题检索不到 答不上来的比例上升
省掉检索 模型凭常识答 答案对不上产品,还可能过时
省掉生成 直接把段落贴给用户 用户要读三段文档才找到答案

三步里最容易被省的是生成——很多人觉得检索到就完了。可用户要的是答案,不是文档。 第二行那种错最隐蔽:模型答得流畅、有细节、还挺像,可它说的是「一般保温杯」的做法,不是你们这款。 三步都不能省,而且都不会报错。 这是这条支路最坑的地方:你不测,就不知道它错在哪。

五、这条支路的四个节点

节点 输入 输出
意图识别(上一节) 用户这句话 产品 / 其他
改写 用户原话 改写后的问题
知识库检索 改写后的问题 两到三段原文
大模型生成 原文 + 用户原话 一句人话

注意第四行:喂给模型的除了检索到的原文,还有用户原话。 只给原文,模型不知道用户在问什么,会答得很全;给了原话,它才知道该挑哪一句说。 这一条在 13.7 配知识库时要再确认一次,因为检索节点也可能只传原文不传问题。

六、动手 Demo:改写、检索、生成,三步都不能省

五句口语先直接检索,看能落到几段;再加一张同义词表重跑一遍。 最后看生成节点拿到的上下文长什么样。

REW = [(u'这玩意儿', u'保温杯'), (u'咋', u'怎么'), (u'退啊', u'退货'),
       (u'盖子', u'杯盖'), (u'洗不', u'清洗吗'), (u'拍下', u'下单'),
       (u'多久到', u'多久送到'), (u'有优惠没', u'会员有什么优惠')]

def rewrite(t):
    for a, b in REW:
        t = t.replace(a, b)   # 只换词,不动句子结构
    return t

实跑输出:

--------------------------------------------------------------------
改写、检索、生成,三步都不能省
--------------------------------------------------------------------


  ① 五句口语,直接拿去检索
  --------------------------------------------------------------------

| 用户原话 | 字面分 | 命中文档词 | 落到哪段 |
|---|---|---|---|
| 这玩意儿咋这么保温 | 0.08 | 1 个 | 第 1 段 |
| 能不能退啊 | 0.00 | 0 个 | 没对上 |
| 盖子能拆下来洗不 | 0.00 | 0 个 | 没对上 |
| 拍下多久到 | 0.00 | 0 个 | 没对上 |
| 有优惠没 | 0.00 | 0 个 | 没对上 |

  五句里落到正确段落的:1 句。字面分那一列全在 0.10 以下,等于没给信息。
  原因很直白:用户说的是「这玩意儿」「咋」「洗不」,文档里写的是「保温杯」「怎么」「清洗」。
  同一个意思,一个词都不重合。

  ② 先改写,再检索
  --------------------------------------------------------------------

| 原话 | 改写后 | 命中文档词 | 对不对 |
|---|---|---|---|
| 这玩意儿咋这么保温 | 保温杯怎么这么保温 | 1 个 | 对 |
| 能不能退啊 | 能不能退货 | 1 个 | 对 |
| 盖子能拆下来洗不 | 杯盖能拆下来清洗吗 | 2 个 | 对 |
| 拍下多久到 | 下单多久送到 | 1 个 | 对 |
| 有优惠没 | 会员有什么优惠 | 1 个 | 对 |

  改写后命中 5 句,改写前 1 句。
  看第二列:改的只是词,句子还是那个句子。改的是词,不是意思——这是改写的边界。
  真机上这一步交给大模型,它还能换句式(「有没有盖子能拆的型号」也能改写过来)。
  沙箱里这张表只会换词,所以它演示的是改写的下限,不是上限。

  ③ 生成那一步在干什么
  --------------------------------------------------------------------
  喂给模型的上下文:[1] 保温杯支持七天无理由退货,十五天内出现质量问题可以换新。
  [2] 保温杯的杯盖可以拆开清洗,不建议放进洗碗机。
  生成节点的活是「把检索到的段落说成人话」,不是「自己编一个答案」。
  提示词里要写死一句:只根据给定资料回答,资料里没有就说不知道。
  这一句不写,模型会用它自己的常识补——补得挺像,但对不上你们的产品。

  ④ 三步省掉哪一步会怎样
  --------------------------------------------------------------------

| 省掉哪步 | 结果 | 代价 |
|---|---|---|
| 省掉改写 | 口语问题检索不到 | 答不上来的比例上升 |
| 省掉检索 | 模型凭常识答 | 答案对不上产品,还可能过时 |
| 省掉生成 | 直接把段落贴给用户 | 用户要读三段文档才找到答案 |

  三步里最容易被省的是生成——很多人觉得检索到就完了。可用户要的是答案,不是文档。
  ! 三步一步都不能省。 省哪步,坏哪样,而且都不报错。

①五句口语直接检索:只有一句落到正确段落,字面分全在 0.10 以下。 ②同义词表八条规则,改完五句全对——改的只是词,句子还是那个句子。 ③生成节点拿到的上下文是两段原文,拼成 [1] [2] 喂进去。 ④第四张表三步各去掉一样:三种坏法,一种都不报错。 ⑤第二节最后一句是本节的边界:改意思就成了替用户重新提问。

30 秒实验

  1. 把你产品的五段说明抄下来,再写五句用户真实说法,看直接检索能落几句。
  2. 写一张同义词表,至少十条。写不出来的那几条,就是你的知识库要补的说法。
  3. 在生成节点的提示词里加一句「资料里没有就说不知道」,再用一个资料里没有的问题试。

常见误区

  1. 「改写就是让模型把问题重写一遍。」那是改写意思。只能换词,不能换问的东西。
  2. 「检索到段落就算答完了。」用户要答案,不要文档。生成那一步不能省。
  3. 「省一步不报错,应该没事。」三步都不报错,也都会悄悄变差。
自测三问(点开对答案) 1. 为什么要先改写再检索? —— 口语和文档是两套词。不换词,字面重合太低,检索落不到正确段落。 2. 改写的边界在哪? —— 只换词,不换意思。改成「替用户重新提问」会让答案跑偏,而且用户看不出。 3. 生成节点的提示词必须写死哪一句? —— 只根据给定资料回答,资料里没有就说不知道。不写这句,模型会用常识补。

支路填完了,下一节配那张 FAQ 表。它是给运营用的,不是给开发用的。

相关笔记