RAG文档切分
📅 2026/7/29 2:07:37
👁️ 阅读次数
📝 编程学习
1、为什么切分
- 避免无关内容对结果影响,提升检索精度
- 突破Token数量限制,控制经济成本
- 提升信噪比,减少信息干扰,物理抑制大模型“幻觉”
- 元数据挂载,数据治理与溯源
- 混合架构中提升多路召回精确度
2、切分策略
具体切分时,可以采用如下策略,具体采用哪种,主要取决于在实际使用场景当中,对于语义连贯性,完整性的要求:
- 按照固定字符数或 Token 数来切分,但可能会在不适当的位置切断句子,导致语义不连贯。
- 语义切分:根据文本的语义内容切分,旨在保持相关信息的集中和完整,适用于需要高度语义保持的场景。
- 但处理速度较慢,且可能出现不同块之间长度极不均衡的情况。
- 具体切分过程为:将相邻的几个句子拼成一个句组。对所有句组进行嵌入,并比较嵌入向量的距离,找到语义变化大的位置,根据阈值确定切分点(比如计算相邻句子嵌入向量的余弦距离,取距离分布的第 N 百分位值作为阈值,高于此值则切分)。按照切分点切分出若干个语义段,并合并某些长度很短的语义段。
- 递归使用多个分隔符切分,同时尽量保证字符数或 Token 数不超出限制。能保证不切断完整的句子。
3、RecursiveCharacterTextSplitter
RecursiveCharacterTextSplitter(递归字符文本切分器)是最常用的切分器,它由一个字符列表作为参数,默认列表为["\n\n", "\n", " ", ""],并且会尝试按顺序使用这些字符进行切分,直到块足够小。由此尽可能地将所有段落(然后是句子,最后是词)保持在一起,因为这些段落通常看起来是语义上最相关的文本片段。
同时为了保证段之间语义完整,可以设置每个块之间有一部分重叠。
举例:
以下是一个完整的 Python 代码示例,演示如何使用 RecursiveCharacterTextSplitter 进行文本切分:
# 安装必要的库 # pip install langchain-text-splitters # 导入所需模块 from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.document_loaders import UnstructuredWordDocumentLoader #加载文档 docs = UnstructuredWordDocumentLoader( file_path="assets/sample.docx", mode="single" ).load() #切分为文本块 chunks = RecursiveCharacterTextSplitter( separators=["\n\n", "\n", "。", "!", "?", "……", ",", ""], # 分隔符列表 chunk_size=400, # 每个块的最大长度 chunk_overlap=50, # 每个块重叠的长度 length_function=len, # 可选:计算文本长度的函数,默认为字符串长度,可自定义函数来实现按 token 数切分 add_start_index=True # 可选:块的元数据中添加此块起始索引 ).split_documents(docs) #输出切分结果 print(chunks)这段代码展示了 RecursiveCharacterTextSplitter 的基本用法:首先加载文档,然后配置切分器的参数,最后执行切分操作并输出结果。
整个切分过程可以通过如下流程图所示:
编程学习
技术分享
实战经验