🐦 第5章 基于大模型的企业知识库
📄 一句话概括

平台把 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 秒实验

  1. 把你的一份文档按 300 字切一遍,数有几块是从句子中间断开的。
  2. 把你们最常见的一个问题输进去,看 top3 里有没有一段是碎片。
  3. 把你的库按主题拆一遍。制度和产品混在一起的,检索准确率通常有明显提升。

常见误区

  1. 「块越小检索越准。」块小余弦容易高,但答案会断在两块之间。40 字那档实测最差。
  2. 「按字符切就行。」能按段落切就按段落切。段落是作者已经分好的语义边界。
  3. 「top-k 取 10 更保险。」塞太多会稀释模型注意力,也贵。3 到 5 是常用的起点。
自测三问(点开对答案) 1. 四个按钮里哪两个要你调? —— 切分和召回。向量化用平台默认,上传是一次性的活。 2. 为什么块太小反而检索不准? —— 答案会断在两块之间,哪一块都不完整。演示里 40 字那档就丢了一题。 3. 知识库该挂智能体还是插工作流? —— 要答业务问题就插工作流,能看到每段分数好调;要陪聊兼答疑才挂智能体。

参数会调了,下一节把这四步装进一条工作流,做成一个能对话的汽车客服——九步,最后一步是建智能体。

相关笔记