平台把 RAG 的四步做成了四个按钮:上传、切分、向量化、召回。 四个里唯一需要你调的是切分——分段长度、重叠长度、按什么切。 这一节拿三组参数真跑一遍,发现最小的那档最差,和直觉相反。
上一节讲 RAG 的原理,这一节讲平台上的操作。 这一节有四个小节:知识库概述、使用流程、在智能体里用、在工作流里用。 前两个是操作,后两个是用法。 第 4 章那个知识库检索节点,就是这里的「召回」那一步。两处讲的是一件事。
一、四个按钮各管什么
| 步骤 | 平台上的动作 | 要你决定什么 |
|---|---|---|
| 上传 | 选文件或填网址 | 哪些文档进这个库 |
| 切分 | 设分段长度与重叠 | 一段多少字、重叠多少 |
| 向量化 | 选 embedding 模型 | 一般不用改 |
| 召回 | 设 top-k 与阈值 | 取几段、多少分以下不要 |
四个里向量化基本不用管,平台默认的模型够用。上传是一次性的活。 真正要调的是切分和召回这两个参数。 而且这两个参数是连着的:切分定得不好,召回怎么调都救不回来。
二、切分:三个参数
分段长度:一块多少字。平台默认通常在几百字,对中文手册偏大。 重叠长度:下一块往回退多少字,防止一句话被切成两半。常见是分段长度的 10%。 切分方式:按字符切、按段落切、按标记切。 能按段落切就别按字符切——段落是作者已经分好的语义边界,比你随便数到第 300 字靠谱。
演示里量了三组:(40, 0)、(60, 10)、(120, 20)。 结果是 (40, 0) 这档最差:top1 只中 3 / 4,另外两档全中。 原因不是它块小,是它既小又不重叠。 答案「长按顶部按键 3 秒」被切成「需长按顶部按」和「键 3 秒,指示灯变蓝」两片,哪一片都不完整。
三、块大好还是块小好
两边都有代价,得看你的资料长什么样。 块小:余弦容易高(一段里全是相关的话),但答案容易断在两块之间,交给模型的上下文也太碎。 块大:上下文完整,但一段里无关的字多,会稀释余弦,排名掉下去。
| 分段 / 重叠 | 块数 | top1 命中 | 三段 token |
|---|---|---|---|
| 40 / 0 | 11 | 3 / 4 | 86 |
| 60 / 10 | 7 | 4 / 4 | 128 |
| 120 / 20 | 5 | 4 / 4 | 165 |
看表最后两行:块从 60 涨到 120,命中没变好,token 却从 128 涨到 165。这一段是「白花的钱」。 演示里 120 那档没掉分,但这一项本课没测出「稀释」的差距——因为只有五份文档, 彼此讲的是不同部件,一段里几乎没有无关的字。文档一多、段落彼此相似,稀释才会出来。 所以结论要连环境一起说: 在这批语料上,60 和 120 命中一样好,但 120 明显更贵;40 明显更差。 换一批语料数字会变, 「太小会切断、太大白花钱」这两条不变。
四、召回:两个参数
top-k:取几段。常用 3 到 5。取太少漏,取太多稀释。 阈值:分数低于多少就不要。这是「宁可不答」的开关,第 5.5 节会量它。 两个参数一起调的时候有个陷阱: 阈值调高,可能把装着答案的那一段筛掉,留下的是分数高但不相关的一段。
演示第 5.5 节里就出现了这种事——「预约保养怎么约」这题,阈值一调高就从答对变答错。
五、在智能体里用 vs 在工作流里用
两种用法的差别和第 3.2 节插件那两种接法一模一样。 挂给智能体:知识库挂到智能体的知识区,模型自己决定查不查。灵活,但可能一步都不查。 插进工作流:放一个知识库检索节点,链走到那儿一定查。确定,但用户只要闲聊时也照查。
判断:要答业务问题的(客服、导购、内训)插工作流;要陪聊兼答疑的挂智能体。 还有一条实操建议:先在工作流里调通,再决定要不要挂给智能体。工作流里能看到每一段的分数,好调; 挂给智能体之后是个黑箱。
六、建库的三条经验
一、一个主题一个库。 员工制度和产品手册不要混在一个库里——混在一起,检索时两边互相干扰。 二、先整理再上传。 一份格式混乱的文档切出来的块也混乱。 把标题、编号、表头理清楚,切分质量立刻上一个台阶。 三、上传完拿十个真问题试。 别等上线。试的时候看两件事:该中的中没中、不该中的有没有中。
三条里第二条花的功夫最多,收益也最大。切分的上限是文档本身的质量。
七、动手 Demo:四步走完,切分参数怎么定
同一批语料用三组参数切:(40, 0)、(60, 10)、(120, 20)。 量四件事:块数、平均块长、四道题的命中、三段召回的 token 数。
CASES = [(40, 0), (60, 10), (120, 20)]
for size, ov in CASES:
bs = []
for d in manual:
bs.extend(Q.chunk(d, size=size, overlap=ov))
h1 = sum(1 for q, e in QS
if (Q.retrieve(q, bs, top=1) or [(0, u'')])[0][1].find(e) >= 0)
ctx = Q.pack_context(Q.retrieve(QS[0][0], bs, top=3), 3)
print(u'%d/%d' % (size, ov), len(bs), Q.tokens(ctx), h1)
实跑输出:
--------------------------------------------------------------------
四步走完,切分参数怎么定
--------------------------------------------------------------------
① 三次切法,三张成绩
--------------------------------------------------------------------
| 分段 / 重叠 | 块数 | 平均块长 | top1 命中 | top3 命中 | 三段 token |
|:---:|---:|---:|---:|---:|---:|
| 40 / 0 | 11 | 29 | 3 / 4 | 3 / 4 | 86 |
| 60 / 10 | 7 | 49 | 4 / 4 | 4 / 4 | 128 |
| 120 / 20 | 5 | 64 | 4 / 4 | 4 / 4 | 165 |
② 结果和直觉反过来:最小的那档最差
--------------------------------------------------------------------
分段 40 那档掉了 1 题,其余两档全中。掉的是这一题:
问「第一次配网怎么操作」,答案「长按顶部按键 3 秒」在原文里,但 40 字的块把它切成两半:
第 1 片:智能音箱 A1 支持 2.4G 与 5G 双频 Wi-Fi,首次配网需长按顶部按
第 2 片:键 3 秒,指示灯变蓝后在 App 里选择网络。不支持 5G 独立组网的路由器需
所以「块越小越好命中」是错的。块小,余弦容易高,但答案会断在两块之间。
③ 大块这一档这次没掉分
--------------------------------------------------------------------
分段 120 那档平均 64 字,一块正好一份文档。四题全中,三段 token 也不比 60 那档多。
这一档为什么没暴露问题?因为这批语料只有 5 份,彼此讲的是不同部件,一段里几乎没有无关的字。
文档一多、段落彼此相似,稀释就出来了:分母被无关的字撑大,该出来的那块排到第四第五。
这一项本课没测出数,只能说机制在这儿。
④ 重叠的作用
--------------------------------------------------------------------
重叠 10 的意思:下一块往回退 10 个字,让一句话有机会完整落在某一块里。
它治的正是②里那个毛病。代价是块数变多、存储变大、召回里出现重复。
分段 40 那档重叠是 0——所以它既小又不重叠,两个毛病都占全了。
! 平台上的分段默认值通常是几百字,对中文手册偏大。
本课的建议:先按段落切,再按 300 字上限合并,重叠留 10% 左右。
定完这三个数,拿二十个真问题跑一遍看 top3 命中率——别凭感觉。
①第一张表六列。先看块数:40 那档切出 11 块,120 那档只切出 5 块——后者等于一份文档一块。 ②最反常的是 top1 那一列:40 那档 3 / 4,另两档 4 / 4。块最小反而最差。 ③第二段把原因摆出来了:答案「长按顶部按键 3 秒」被切成两片,一片以「需长按顶部按」结尾, 一片以「键 3 秒」开头。 ④第三段说清了 120 那档为什么没掉分——只有五份文档,彼此不相似,稀释出不来。 这一项本课没测出差距,只能说机制在。 ⑤最后看 token 那一列:120 那档三段要 165,比 60 那档的 128 贵三成,而命中一个都没多。 这一段是白花的钱。
30 秒实验
- 把你的一份文档按 300 字切一遍,数有几块是从句子中间断开的。
- 把你们最常见的一个问题输进去,看 top3 里有没有一段是碎片。
- 把你的库按主题拆一遍。制度和产品混在一起的,检索准确率通常有明显提升。
常见误区
- 「块越小检索越准。」块小余弦容易高,但答案会断在两块之间。40 字那档实测最差。
- 「按字符切就行。」能按段落切就按段落切。段落是作者已经分好的语义边界。
- 「top-k 取 10 更保险。」塞太多会稀释模型注意力,也贵。3 到 5 是常用的起点。
自测三问(点开对答案)
1. 四个按钮里哪两个要你调? —— 切分和召回。向量化用平台默认,上传是一次性的活。 2. 为什么块太小反而检索不准? —— 答案会断在两块之间,哪一块都不完整。演示里 40 字那档就丢了一题。 3. 知识库该挂智能体还是插工作流? —— 要答业务问题就插工作流,能看到每段分数好调;要陪聊兼答疑才挂智能体。参数会调了,下一节把这四步装进一条工作流,做成一个能对话的汽车客服——九步,最后一步是建智能体。
- ☐ (本篇完,下一篇 5.5 案例实战:打造汽车行业智能客服)
相关笔记
- 知识库的理论基础 RAG:RAG 的四个动作
- 扣子工作流的常见节点:知识库检索节点吃什么吐什么
- 15 数据库基础 · 索引
- 🐦 扣子开发 AI Agent · 索引