微信扫码
添加专属顾问
我要投稿
RAG系统文本切分算法选型指南:解析不同切分方法的适用场景与优化策略,助你提升检索质量与生成效果。 核心内容: 1. 文本切分在RAG系统中的关键作用与核心目标 2. 基于字符和基于令牌的切分方法对比分析 3. 不同检索器搭配切分算法的最佳实践方案
在构建企业级检索增强生成(RAG)系统时,文本切分算法的选择至关重要。切分策略直接影响检索的质量和生成结果的准确性。本文档将介绍常用的文本切分方法,分析其优缺点,并结合不同检索器给出最佳实践方案。
RAG系统通常包含两个主要组件:
其中,文本切分是索引阶段的关键步骤,它将大型文档分割成更小的块,以便于检索和处理。
文本切分算法的主要目标是将长文本分割成语义连贯的小块,使其既能保持上下文完整性,又能有效地用于检索和传递给模型。理想的切分算法应该能够:
基于字符的切分是最简单的切分方法,它根据字符数量将文本切分成固定大小的块。
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个块的字符数
chunk_overlap=200, # 相邻块之间的重叠字符数
separators=["\n\n", "\n", " ", ""] # 优先按照这些分隔符切分
)
docs = text_splitter.split_documents(documents)BM25Retriever或简单的向量检索chunk_size(500-1000)基于令牌的切分根据LLM的令牌(token)计数来切分文本,这更符合模型处理文本的方式。
from langchain_text_splitters import TokenTextSplitter
text_splitter = TokenTextSplitter(
chunk_size=500, # 每个块的最大令牌数
chunk_overlap=50 # 相邻块之间的重叠令牌数
)
docs = text_splitter.split_documents(documents)VectorStoreRetriever使用基于语义的切分通过计算文本嵌入并识别语义边界来切分文本,确保每个块的语义连贯性。
SemanticChunker提供了四种不同的阈值类型(breakpoint_threshold_type),用于确定文本的切分点:
1. 百分位数方法(percentile)
breakpoint_threshold_amount(0-100之间的值)控制切分的粒度,值越高切分越少,默认为95.02. 标准差方法(standard_deviation)
breakpoint_threshold_amount设置标准差的倍数,默认为1.03. 四分位距方法(interquartile)
breakpoint_threshold_amount调整IQR的倍数,默认为1.54. 梯度方法(gradient)
breakpoint_threshold_amount设置百分位阈值,默认为95.0百分位数方法:
from langchain_text_splitters import SemanticChunker
from langchain_openai import OpenAIEmbeddings
text_splitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="percentile", # 使用百分位数方法
breakpoint_threshold_amount=95.0 # 95百分位数
)
docs = text_splitter.create_documents([text])标准差方法:
text_splitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="standard_deviation", # 使用标准差方法
breakpoint_threshold_amount=1.5 # 1.5倍标准差
)
docs = text_splitter.create_documents([text])四分位距方法:
text_splitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="interquartile", # 使用四分位距方法
breakpoint_threshold_amount=1.5 # 1.5倍四分位距
)
docs = text_splitter.create_documents([text])梯度方法:
text_splitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="gradient", # 使用梯度方法
breakpoint_threshold_amount=95.0 # 95百分位数
)
docs = text_splitter.create_documents([text])MMR(最大边际相关性)检索策略结合使用HyperRetriever或SelfQueryRetriever增强语义检索能力针对特定格式的文档(如Markdown、HTML、代码等)的专用切分器,能够理解文档结构。
Markdown切分:
from langchain_text_splitters import MarkdownHeaderTextSplitter
headers_to_split_on = [
("#", "Header 1"),
("##", "Header 2"),
("###", "Header 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(
headers_to_split_on=headers_to_split_on
)
md_docs = markdown_splitter.split_text(markdown_text)HTML切分:
from langchain_text_splitters import HTMLHeaderTextSplitter
html_splitter = HTMLHeaderTextSplitter(tags_to_split_on=["h1", "h2", "h3"])
html_docs = html_splitter.split_text(html_text)代码切分:
from langchain_text_splitters import RecursiveCharacterTextSplitter
python_splitter = RecursiveCharacterTextSplitter.from_language(
language="python",
chunk_size=1000,
chunk_overlap=200
)
code_docs = python_splitter.split_text(code_text)ParentDocumentRetriever保持文档层次结构在企业级RAG系统中,可以考虑采用混合策略,结合多种切分方法的优势:
文本切分是RAG系统的关键环节,直接影响检索质量和生成结果。在企业级应用中,应根据具体需求、文档特性和资源限制选择合适的切分策略。
理想的切分方案应该:
建议在实际部署前进行充分测试,并根据反馈持续优化切分策略。
文本切分可以先通过一些预处理来获得更好的检索效果
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-12-17
企业AI真瓶颈:不在模型,而在语境!
2025-12-17
从 1600+ 份 Word 文档到生产级 RAG:一个工控行业知识库的全链路实战复盘
2025-12-16
短语检索不等于BM25+向量检索| Milvus Phrase Match实战
2025-12-16
让AI真正懂数据:猫超Matra项目中的AI知识库建设之路
2025-12-10
最新力作:一招提升RAG检索精度20%
2025-12-10
Apple 入局 RAG:深度解析 CLaRa 框架,如何实现 128x 文档语义压缩?
2025-12-09
客服、代码、法律场景适配:Milvus Ngram Index如何百倍优化LIKE查询| Milvus Week
2025-12-09
一键把碎片变成有料笔记:NoteGen,一款跨平台的 Markdown 笔记应用
2025-10-04
2025-10-11
2025-09-30
2025-10-12
2025-12-04
2025-11-04
2025-10-31
2025-11-13
2025-10-12
2025-12-03
2025-12-10
2025-11-23
2025-11-20
2025-11-19
2025-11-04
2025-10-04
2025-09-30
2025-09-10