微信扫码
添加专属顾问
我要投稿
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-03-21
2025-03-20
2025-03-24
2025-03-24
2025-03-19
2025-03-24
2025-03-28
2025-04-01
2025-03-23
2025-04-13
2025-06-13
2025-06-09
2025-06-06
2025-05-30
2025-05-29
2025-05-29
2025-05-23
2025-05-16