微信扫码
添加专属顾问
我要投稿
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+中大型企业
2026-02-02
OpenViking:面向 Agent 的上下文数据库
2026-02-02
别再迷信向量数据库了,RAG 的“大力出奇迹”该结束了
2026-01-29
告别黑盒开发!清华系团队开源 UltraRAG:用“搭积木”的方式构建复杂 RAG 流程
2026-01-28
RAG优化不抓瞎!Milvus检索可视化,帮你快速定位嵌入、切块、索引哪有问题
2026-01-28
今天,分享Clawdbot记忆系统最佳工程实践
2026-01-28
Fusion GraphRAG:超越 GraphRAG 的多模态企业级 AI 问答
2026-01-28
Semantic Kernel内存管理系统——为AI注入持久记忆与上下文感知能力
2026-01-28
AgentSkills 揭示的真相:上下文工程走错了三年
2025-12-04
2025-12-03
2025-11-13
2025-12-02
2025-11-13
2025-11-05
2026-01-15
2025-12-07
2025-11-06
2026-01-02
2026-01-19
2026-01-12
2026-01-08
2026-01-02
2025-12-23
2025-12-21
2025-12-10
2025-11-23