在RAG中,最重要的就是把内容进行分块,向量化,存到向量数据库里面。RAG检索结果的准确度主要还是要看内容分块是否合理。
本章我们主要介绍下文本切块(chunking)的几种方式。
方式 1:固定长度切
做法:每 N 个字符/词一刀切。
优点:无脑快,代码 3 行搞定。
缺点:容易把句子拦腰斩断,“北京大学”切成“北京+大学”,语义全断,自然处理效果就不会很好。
方式2:滑动窗口切(overlap)
做法:每 N 个词后回退 M 个词再切,像卷尺量两次。按照一个窗口一样往前滑动。
优点:减少断句,提高召回率。
缺点:块数翻倍,存储和检索成本大大滴高。目前我在工作中没咋用这种形式。
方式 3:按句子切(句号、换行)
做法:按 。!?\n
等能够明确的区分段落,完整句子的标识进行分割。
优点:语义完整,适合短问答。
缺点:句子太长或太短都不好;超长句子仍需二次切。主要还是向量化算法要求的token有限。
普通 BGE(bge-base/large-zh-v1.5 等)默认最多 512 token
新一代 BGE-M3 最长支持 8192 token
BGE 家族现在有两代产品:
-
第一代的 bge-base-zh-v1.5、bge-large-zh-v1.5 等,基于 BERT 类架构,训练时就固定了 512 token 的输入窗口。我们工作中用的就是bge-large-zh-v1.5这个版本。
-
2024 年发布的 BGE-M3