大模型Rag - 文本分块
一.文本分块
在构建智能问答系统或知识库的过程中,文本分块(Text Splitting)是一项基础但极为关键的任务。它不仅决定了后续 embedding 生成的质量,也直接影响向量检索系统的准确率与效率。本文将系统性地介绍文本分块的原理、动因、策略及工具实践,帮助你构建更健壮的语义检索系统。
二.为什么要进行文本分块?
原因:
-
语义多样性问题:一篇长文档可能同时包含多个主题或语义信息,直接对其整体进行 embedding 会导致语义混淆,从而降低检索精度。
-
文本分块技术详解:打造高效的知识库构建流程
-
模型输入限制:大多数 embedding 模型对输入文本长度有限制,超出部分会被截断,导致语义信息缺失。
因此,合理地将文本拆分成较小、语义完整的块是提高系统效果的关键。
三.分块的基本原则
- 每个块应包含完整且语义相关的上下文信息。
- 分块粒度应适中,太小会丢失上下文,太大又可能包含无关信息。
完美的自动化分块有一定难度,因此需要结合策略进行尝试与优化。
四.分块策略一:递归文本分块(Recursive Text Splitting)
核心思想
通过一组由粗到细的分隔符(如段落、句子、标点符号)依次进行文本切割,确保每一块都不超过设定的长度限制。
具体流程:
- 设定块大小(如 200 tokens),确保不超过 embedding 模型的输入长度。
- 定义分隔符优先级:如段落 > 句子 > 标点 > 字符。
- 依次使用分隔符递归切割文本,直到每块长度小于设定值。
五.分块策略二:基于语义的分块(Semantic Splitting)
embedding 向量计算句子间的语义相似度,以此作为分割依据。
实施流程:
- 将文档切分为句子。
- 设置滑动窗口长度(如3句)。
- 计算相邻窗口的 embedding 相似度。
- 根据设定的相似度阈值判断是否分割。