产品问题这条支路三步:改写、检索、生成。三步一步都不能省,省哪步坏哪样,而且都不报错。 五句口语直接检索只落到一句;加一张同义词表换词之后,五句全对。改的是词,不是意思。 生成那一步的活是「把检索到的段落说成人话」,不是「自己编一个答案」。
这一节对应书上三个小节:问题理解与改写、知识库配置与检索、大模型回复生成。 三个小节点串成一条直线,没有分支。这一章的分支在 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. 生成节点的提示词必须写死哪一句? —— 只根据给定资料回答,资料里没有就说不知道。不写这句,模型会用常识补。支路填完了,下一节配那张 FAQ 表。它是给运营用的,不是给开发用的。
- ☐ (本篇完,下一篇 13.4 飞书多维表格配置)
相关笔记
- 创建对话流与基础配置:上一节建对话流
- 扣子知识库介绍:检索节点怎么配
- 编写有效提示词的技巧:提示词里的边界句
- 🐦 扣子开发 AI Agent · 索引