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

短答案最怕被切。一条 33 字以内的 FAQ 按 60 字切,一块都不切,这是好事。 长文档切开要有重叠。没有重叠,一句话会被拦腰截断,两块都读不通。 标准问法问自己能全对,这一列不说明任何问题。要让真实说法也能接住,得把关键词并进文档。

📝 本章和前面几章的关系

这一节对应书上两个小节:飞书表格知识库配置、知识库检索节点配置。 第 5 章讲过知识库的原理(RAG、切块、向量、召回),这一节只讲这个案例里的具体配置。 特别的地方是:这一章的知识源不是 PDF 也不是网页,是一张在线表格。表格当知识源有它自己的坑。

一、一行拼成一段

把 FAQ 表的一行拼成一段文档:「能保温多久。装满热水能保温 12 小时,采用 316 不锈钢内胆。 」——问题在前,答案在后。 为什么问题也要拼进去?因为检索时要靠问句的字面去撞。 只有答案没有问句,「能保温多久」这五个字就丢了。 五条拼起来都在 33 字以下。按 60 字一段切,一条都不切——这是最好的情况,一块就是一条完整答案。

如果一条 FAQ 拼起来超过 60 字,它就会被切开,答案的前半段和后半段分到两个块里。 检索到半句,等于没检索到。

二、长文档切开要有重叠

一段 104 字的产品介绍,按 60 字切、重叠 10 字,切成两块。第一块 60 字,第二块 54 字。 第二块的开头是「出水设计,倒水不挂壁」——它就是第一块结尾那 10 个字。 这 10 个字看着浪费,其实是救命用的:没有它,一句话被拦腰截断,两块都读不通,检索到哪块都缺半句。

重叠也不能给太大。同一段给到 30 字重叠,切成 3 块,一大半内容是重复的,检索时这几块还会互相抢分。

三、标准问法全对,不代表能用在生产

拿五条标准问法去问自己,五条全对,分数 0.41 到 0.50。 这一列看着挺漂亮,可它说明不了任何问题——真实用户不会照标准问法说话。 第 13.3 节的五句口语直接检索只落到一句,就是这个道理。标准问法本身就是文档里的原句,当然全对。

所以这一节真正要看的指标不是「标准问法全对」,是「口语问法能接住几条」。

四、把关键词并进文档

五句口语再跑一遍,只对两句。把 keywords 那一列也拼进文档之后,五句全对。 救回来的那三句,靠的都是答案里没写过、只在关键词里躺着的说法:退款、物流、折扣。 关键词不是标签,是「用户会怎么说」的备忘。 它得和答案一起进库,不然检索的时候用不上。

注意:并进去之后,文档长度从 24 字涨到 40 字左右,还都在 60 字以内,不会被切开。 要是关键词写二十个,就会超长被切——关键词也要克制。

五、检索节点怎么配

检索节点三个参数:知识库选哪个、召回几条、相似度阈值多少。 召回条数这一章用 3。用 1 条,只要那一条挑错就全错;用 3 条,模型还能从三条里挑。 阈值不建议一开始就调高。 先用 0 跑一遍看分数分布,再定阈值。 一上来定 0.7,可能一条都召回不了,你会以为知识库坏了。

以上是平台配置,本沙箱不执行。下面的 Demo 用真实的切块和检索算法跑同一批数据。

六、动手 Demo:把一张表喂成知识库

先看五条 FAQ 拼成文档后会不会被切,再看一段长文档切开的边界在哪。 最后对比「标准问法」和「口语问法」,以及把关键词并进文档前后的差别。

docs = [qq + u'。' + aa for qq, aa, _k in FAQ]
D2   = [qq + u'。' + aa + u'。关键词:' + kk.replace(u',', u'、')
        for qq, aa, kk in FAQ]

Q.retrieve(u'能退款吗', docs, top=1)   # 并之前:落不到第 2 条
Q.retrieve(u'能退款吗', D2,   top=1)   # 并之后:落到第 2 条

实跑输出:

--------------------------------------------------------------------
把一张表喂成知识库
--------------------------------------------------------------------


  ① 一行拼成一段,还是一行当一段
  --------------------------------------------------------------------

| 标准问法 | 拼起来字数 | 答案字数 | 会不会被切 |
|---|---:|---:|---|
| 能保温多久 | 33 | 27 | 不切 |
| 支持退货吗 | 28 | 22 | 不切 |
| 杯盖能洗吗 | 24 | 18 | 不切 |
| 多久能到 | 24 | 19 | 不切 |
| 有优惠吗 | 21 | 16 | 不切 |

  五条拼起来都在 33 字以下,按 60 字一段切,一条都不切。
  短答案最怕被切。 一被切,答案的前半段和后半段就分到两个块里,检索到半句等于没检索到。

  ② 长答案切开会怎样
  --------------------------------------------------------------------
  一段 104 字的产品介绍,按 60 字切、重叠 10 字,切成 2 块。

| 块 | 字数 | 开头 | 结尾 |
|---|---|---|---|
| 1 | 60 | 保温杯采用 316 … | …出水设计,倒水不挂壁 |
| 2 | 54 | 出水设计,倒水不挂壁… | …清洗时分开洗更彻底。 |

  看第二块的开头「出水设计,倒水不挂壁」——它就是第一块结尾那 10 个字。
  重叠 10 字就是为这个:没有重叠,一句话会被拦腰截断,两块都读不通,检索到哪块都缺半句。
  重叠也不能给太大:同一段给到 30 字重叠,切成 3 块,比现在的 2 块多 1 块,一大半内容是重复的,
  检索时这几块还会互相抢分。

  ③ 检索到的是不是自己
  --------------------------------------------------------------------

| 拿标准问法去问 | 最高分 | 对不对 |
|---|---|---|
| 能保温多久 | 0.50 | 对 |
| 支持退货吗 | 0.45 | 对 |
| 杯盖能洗吗 | 0.49 | 对 |
| 多久能到 | 0.41 | 对 |
| 有优惠吗 | 0.45 | 对 |

  标准问法问自己,五条全对,分数也高。这一列不说明任何问题——真实用户不会这么问。

  ④ 把关键词并进文档,口语才接得住
  --------------------------------------------------------------------

| 口语问法 | 并进关键词前落到哪条 | 前 | 后 |
|---|---|---|---|
| 能退款吗 | — | 错 | 对 |
| 走什么物流 | — | 错 | 对 |
| 有没有折扣 | — | 错 | 对 |
| 能热多久 | 能保温多久。装满热水能… | 对 | 对 |
| 几天能到货 | 多久能到。发货后三到五… | 对 | 对 |

  并进关键词之后命中数从 2 涨到 5。
  它救回来的那几句,靠的都是答案里没写过、只在关键词里躺着的说法:退款、物流、折扣。
  ! 关键词不是标签,是「用户会怎么说」的备忘。它得和答案一起进库,不然检索时用不上。

①五条 FAQ 拼起来都在 33 字以下,按 60 字切一条都不切。 ②104 字的长文档切成 2 块,第二块开头就是第一块结尾那 10 个字。 ③重叠给到 30 字,同一段切成 3 块,大半是重复内容。 ④标准问法问自己五条全对——这一列不说明任何问题。 ⑤并进关键词之后命中数从 2 涨到 5,救回来的是退款、物流、折扣这三个说法。

30 秒实验

  1. 把你最长的三条 FAQ 量一下字数。超过切块长度两倍的,应该拆成两条。
  2. 先用阈值 0 跑一遍,把每条问句的分数抄下来,再决定阈值定在哪。
  3. 把你们的行业黑话写进关键词列,各写三个。写完再跑一遍那五句口语。

常见误区

  1. 「标准问法全对就说明知识库没问题。」那只能说明文档里有这句话。要测口语。
  2. 「切块重叠越大越保险。」重叠 30 字,块数翻倍,大半内容重复,还互相抢分。
  3. 「关键词是给运营看的标签。」它要并进文档,不然检索时根本用不上。
自测三问(点开对答案) 1. 为什么问题也要拼进文档? —— 检索靠字面撞。只有答案没有问句,「能保温多久」这几个字就丢了,问句撞不上。 2. 重叠的作用是什么? —— 防止一句话被拦腰截断。第二块的开头就是第一块结尾那几个字,两块都还能读通。 3. 关键词列为什么必须并进文档? —— 它记的是用户会怎么说。不并进去,检索时这一列等于不存在。

知识库配好了,下一节处理剩下那条路:非产品问题,以及答不上来怎么办。

相关笔记