RAG十五种分块策略全面汇总介绍
系统梳理了15种主流文本分块策略,涵盖固定大小、句子、段落、语义、多模态、滑动窗口、分层、内容感知、表感知、基于令牌及基于实体等方法,剖析了每种策略的适用场景、核心优势与潜在局限,为构建高效检索增强生成系统提供选择依据。
在构建高效的检索增强生成(RAG)系统时,文本分块策略是决定检索质量的核心环节。本教程将为您系统梳理15种主流分块策略,深入剖析每种策略的适用场景、核心优势与潜在局限,并附带实用代码示例,帮助您根据实际文档类型与业务需求做出最优选择。

一、固定大小分块
01
固定大小分块将文档拆分为预设尺寸的片段,通常以字数、标记数或字符数为单位。
适用场景:当您需要一种简单明了的方法并且文档结构并不重要时。它在处理较小、不太复杂的文档时效果很好。
优势:
- 实施简便。
- 块大小一致。
- 计算速度快。
弊端:
- 可能断开句子或段落,导致上下文丢失。
- 对于含义保持至关重要的文档,并不理想。
小提示:固定大小分块适合批量处理同质化文本,如日志文件。但若文档包含重要标题或列表,建议先验证语义完整性。
常见问题:固定大小分块后如何恢复上下文?
可以通过引入滑动窗口机制(见后续策略06),让相邻块保留重叠内容来缓解上下文丢失问题。
二、基于句子分块
02
此方法根据自然句子边界对文本进行分块。每个块都包含一定数量的句子,保留语义单元。保持连贯的思想至关重要,在句子中间拆分会导致意义丧失。
优势:
- 保留句子级别的含义。
- 上下文保留更佳。
弊端:
- 块大小不均匀,因为句子长度不同。
- 当句子过长时,可能超出模型的标记限制。
import spacy
nlp = spacy.load("en_core_web_sm")
def sentence_chunk(text):
doc = nlp(text)
return [sent.text for sent in doc.sents]
# Applying Sentence-Based Chunking
sentence_chunks = sentence_chunk(sample_text)
for chunk in sentence_chunks:
print(chunk, '\n---\n')
小提示:使用spacy等NLP库进行句子分割时,注意中文需加载对应语言模型(如zh_core_web_sm)。
三、基于段落分块
03
此策略根据段落边界拆分文本,将每个段落视为一个块。最适合结构化文档,如报告或论文,其中每个段落都包含一个完整的想法或论点。
优势:
- 自然文档分割。
- 在段落中保留较大的上下文。
弊端:
- 段落长度不同,导致块大小不均匀。
- 长段落可能仍会超出标记限制。
def paragraph_chunk(text):
paragraphs = text.split('\n\n')
return paragraphs
# Applying Paragraph-Based Chunking
paragraph_chunks = paragraph_chunk(sample_text)
for chunk in paragraph_chunks:
print(chunk, '\n---\n')
四、基于语义的分块
04
此方法使用机器学习模型(如 transformers)根据语义含义将文本拆分为块。当保留最高级别的上下文至关重要时,例如在复杂的技术文档中。
优势:
- 具有上下文意义的块。
- 捕获句子之间的语义关系。
弊端:
- 需要高级 NLP 模型,计算成本较高。
- 实现起来更复杂。
def semantic_chunk(text, max_len=200):
doc = nlp(text)
chunks = []
current_chunk = []
for sent in doc.sents:
current_chunk.append(sent.text)
if len(' '.join(current_chunk)) > max_len:
chunks.append(' '.join(current_chunk))
current_chunk = []
if current_chunk:
chunks.append(' '.join(current_chunk))
return chunks
# Applying Semantic-Based Chunking
semantic_chunks = semantic_chunk(sample_text)
for chunk in semantic_chunks:
print(chunk, '\n---\n')
常见问题:语义分块与句子分块有何本质区别?
句子分块按语法边界分割,而语义分块根据内容含义的完整性分割,可能将多个相关句子合并,也可能拆分长段落中语义转折的部分。
五、基于多模态的分块
05
此策略分别处理不同的内容类型(文本、图像、表格)。每种模态都根据其特征独立分块。适用于包含各种内容类型的文档,如 PDF 或具有混合媒体的技术手册。
优势:
- 专为混合媒体文档量身定制。
- 允许对不同模态进行自定义处理。
弊端:
- 实施和管理复杂。
- 每种模式需要不同的处理逻辑。
def modality_chunk(text, images=None, tables=None):
# This function assumes you ha ve pre-processed text, images, and tables
text_chunks = paragraph_chunk(text)
return {'text_chunks': text_chunks, 'images': images, 'tables': tables}
# Applying Modality-Specific Chunking
modality_chunks = modality_chunk(sample_text, images=['img1.png'], tables=['table1'])
print(modality_chunks)
六、滑动窗口分块
06
滑动窗口分块会创建重叠的数据块,从而允许每个数据块与下一个数据块共享其部分内容。当您需要确保块之间上下文的连续性时,例如在法律或学术文档中。
优势:
- 跨数据块保留上下文。
- 减少数据块边界处的信息丢失。
弊端:
- 可能会通过在多个块中重复内容来引入冗余。
- 需要更多处理。
def sliding_window_chunk(text, chunk_size=100, overlap=20):
tokens = text.split()
chunks = []
for i in range(0, len(tokens), chunk_size - overlap):
chunk = ' '.join(tokens[i:i + chunk_size])
chunks.append(chunk)
return chunks
# Applying Sliding Window Chunking
sliding_chunks = sliding_window_chunk(sample_text)
for chunk in sliding_chunks:
print(chunk, '\n---\n')
小提示:重叠比例建议控制在10%~30%之间,既能保留上下文连续性,又不过度冗余。
七、分层分块
07
分层分块在多个级别划分文档,例如部分、小节和段落。对于高度结构化的文档,如学术论文或法律文本,维护层次结构是必不可少的。
优势:
- 保留文档结构。
- 在多个粒度级别维护上下文。
弊端:
- 实现起来更复杂。
- 可能导致块状不均匀。
def hierarchical_chunk(text, section_keywords):
sections = []
current_section = []
for line in text.splitlines():
if any(keyword in line for keyword in section_keywords):
if current_section:
sections.append("\n".join(current_section))
current_section = [line]
else:
current_section.append(line)
if current_section:
sections.append("\n".join(current_section))
return sections
# Applying Hierarchical Chunking
section_keywords = ["Introduction", "Overview", "Methods", "Conclusion"]
hierarchical_chunks = hierarchical_chunk(sample_text, section_keywords)
for chunk in hierarchical_chunks:
print(chunk, '\n---\n')
八、内容感知分块
08
此方法根据内容特征(例如,在段落级别对文本进行分块,将表格作为单独的实体)进行调整。对于内容异构的文档,例如电子书或技术手册,分块必须根据内容类型而变化。
优势:
- 灵活且可适应不同的内容类型。
- 保持多种格式的文档完整性。
弊端:
- 需要复杂的动态分块逻辑。
- 对于内容结构多样的文档,难以实现。
def content_aware_chunk(text):
chunks = []
current_chunk = []
for line in text.splitlines():
if line.startswith(('##', '###', 'Introduction', 'Conclusion')):
if current_chunk:
chunks.append('\n'.join(current_chunk))
current_chunk = [line]
else:
current_chunk.append(line)
if current_chunk:
chunks.append('\n'.join(current_chunk))
return chunks
# Applying Content-Aware Chunking
content_chunks = content_aware_chunk(sample_text)
for chunk in content_chunks:
print(chunk, '\n---\n')
九、表感知分块
09
此策略通过将文档表提取为独立的块并将其转换为 markdown 或 JSON 等格式以便于处理来专门处理文档表。对于包含表格数据的文档,例如财务报告或技术文档,其中的表格包含重要信息。
优势:
- 保留表结构以进行高效的下游处理。
- 允许独立处理表格数据。
弊端:
- 在转换过程中,格式可能会丢失。
- 需要对具有复杂结构的表进行特殊处理。
import pandas as pd
def table_aware_chunk(table):
return table.to_markdown()
# Sample table data
table = pd.DataFrame({
"Name": ["John", "Alice", "Bob"],
"Age": [25, 30, 22],
"Occupation": ["Engineer", "Doctor", "Artist"]
})
# Applying Table-Aware Chunking
table_markdown = table_aware_chunk(table)
print(table_markdown)
常见问题:表格中的合并单元格如何处理?
建议先使用PDF解析库(如Camelot或Tabula)提取原始表格结构,保留行列关系后再转换为markdown或JSON格式。
十、基于令牌分块
10
基于标记的分块根据固定数量的标记而不是单词或句子来拆分文本。它使用来自 NLP 模型的分词器。对于对 Token 进行操作的模型,例如具有 Token 限制的基于 transformer 的模型(例如 GPT-3 或 GPT-4)。
优势:
- 适用于基于 transformer 的模型。
- 确保遵守令牌限制。
弊端:
- 分词可能会拆分句子或破坏上下文。
- 并不总是与自然语言边界保持一致。
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
def token_based_chunk(text, max_tokens=200):
tokens = tokenizer(text)["input_ids"]
chunks = [tokens[i:i + max_tokens] for i in range(0, len(tokens), max_tokens)]
return [tokenizer.decode(chunk) for chunk in chunks]
# Applying Token-Based Chunking
token_chunks = token_based_chunk(sample_text)
for chunk in token_chunks:
print(chunk, '\n---\n')
小提示:不同模型的分词器(如GPT-2、GPT-4、BERT)对相同文本产生的token数量不同,需按实际使用模型选择对应分词器。
十一、基于实体分块
11
基于实体的分块利用命名实体识别(NER)根据识别的实体(如人员、组织或位置)将文本分成多个块。对于特定实体必须作为上下文单元进行维护的文档,例如简历、合同或法律文档。
优势:
- 保持命名实体不变。
- 可以通过关注相关实体来提高检索准确性。
弊端:
- 需要经过训练的 NER 模型。
- 实体可能会重叠,从而导致复杂的块边界。
def entity_based_chunk(text):
doc = nlp(text)
entities = [ent.text for ent in doc.ents]
return entities
# Applying Entity-Based Chunking
entity_chunks = entity_based_chunk(sample_text)
print(entity_chunks)
十二、基于主题分块
12
用于涵盖多个主题的文档,例如新闻文章、研究论文或具有不同主题的报告。
优势:
- 将相关信息分组在一起。
- 有助于根据特定主题进行重点检索。
弊端:
- 需要额外的处理(主题建模)。
- 对于简短的文档或重叠的主题,可能并不精确。
小提示:常用的主题建模工具有LDA、BERTopic等。对于短文本,建议使用基于嵌入的主题聚类。
十三、基于页面分块
13
根据页面边界拆分文档,页面边界通常用于 PDF 或格式化文档,其中每个页面都被视为一个块。对于页面边界具有语义重要性的页面文档,如 PDF 或可打印报表。
优势:
- 易于使用 PDF 文档实现。
- 遵守页面边界。
弊端:
- 页面可能与自然文本分隔符不对应。
- 页面之间的上下文可能会丢失。
def page_based_chunk(pages):
# Split based on pre-processed page list (simulating PDF page text)
return pages
# Sample pages
pages = ["Page 1 content", "Page 2 content", "Page 3 content"]
# Applying Page-Based Chunking
page_chunks = page_based_chunk(pages)
for chunk in page_chunks:
print(chunk, '\n---\n')
十四、基于关键字分块
14
此方法根据表示主题转移的预定义关键字或短语(例如,“Introduction”、“Conclusion”)对文档进行分块。适合遵循清晰结构的文档,例如科学论文或技术规范。
优势:
- 根据关键字捕获自然的主题分隔符。
- 适用于结构化文档。
弊端:
- 需要一组预定义的关键字。
- 不适应非结构化文本。
def keyword_based_chunk(text, keywords):
chunks = []
current_chunk = []
for line in text.splitlines():
if any(keyword in line for keyword in keywords):
if current_chunk:
chunks.append('\n'.join(current_chunk))
current_chunk = [line]
else:
current_chunk.append(line)
if current_chunk:
chunks.append('\n'.join(current_chunk))
return chunks
# Applying Keyword-Based Chunking
keywords = ["Introduction", "Overview", "Conclusion", "Methods", "Challenges"]
keyword_chunks = keyword_based_chunk(sample_text, keywords)
for chunk in keyword_chunks:
print(chunk, '\n---\n')
常见问题:关键字分块与内容感知分块有何不同?
内容感知分块通过识别标题样式(如Markdown的##)来分割,而关键字分块依赖文本中包含的特定词汇,两者可结合使用。
十五、混合分块
15
根据内容类型和文档结构组合了多个分块策略。例如,文本可以按句子分块,而表格和图像是分开处理的。用于包含各种内容类型的复杂文档,如技术报告、业务文档或产品手册。
优势:
- 高度适应各种文档结构。
- 允许对不同的内容类型进行精细控制。
弊端:
- 实现起来更复杂。
- 需要自定义逻辑来处理每种内容类型。
def hybrid_chunk(text):
paragraphs = paragraph_chunk(text)
hybrid_chunks = []
for paragraph in paragraphs:
hybrid_chunks += sentence_chunk(paragraph)
return hybrid_chunks
# Applying Hybrid Chunking
hybrid_chunks = hybrid_chunk(sample_text)
for chunk in hybrid_chunks:
print(chunk, '\n---\n')
总结与优化建议
在构建检索增强生成(RAG)系统时,针对特定用例和文档类型优化分块至关重要。不同的场景根据文档大小、内容多样性和检索速度有不同的要求。选择正确的分块策略取决于多个因素,包括文档类型、上下文保留的需求以及检索速度与准确性之间的平衡。无论您是处理学术论文、法律文档还是混合内容文件,选择合适的方法都可以显著提高 RAG 的有效性。通过迭代和优化分块方法,您可以适应不断变化的文档类型和用户需求,确保您的检索系统保持稳健和高效。
核心建议:
- 对于纯文本且结构简单 → 优先考虑固定大小或句子分块。
- 对于结构化文档(论文、法律文本)→ 分层或基于关键字分块。
- 对于混合内容(含表格、图片)→ 多模态或混合分块。
- 对于检索连续性要求高 → 滑动窗口分块。
- 对于模型token限制严格 → 基于令牌分块。
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:RAG十五种分块策略全面汇总介绍要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
相关热点DiffusionLogoStudio是一款面向个人创业者、小型企业主和创业公司的AI工具,无需设计知识即可生成独特、可商用的品牌标识。它支持Logo定制、无限可伸缩、添加文字及模拟场景预览,低成本解决传统设计成本高、易撞脸的问题。
Stratup ai是一款基于人工智能的创业点子生成与探索工具,面向创业者、企业家和投资者。它能发现商业创意、分析市场需求与竞争格局,生成包括市场规模、风险评估在内的详细报告,辅助商业决策,将创意转化为系统流程。
猫眼是一套基于人工智能的校园反欺凌系统,通过分析音频与视频信号实时检测言语威胁和肢体冲突,秒级向教职工发送警报,将被动监控升级为主动防御,助力学校及时干预欺凌事件。
SAP推出商业智能AI助手Joule,将生成式AI嵌入企业工作流,覆盖HR、财务、供应链等领域。能撰写招聘广告、分析销售业绩、提供供应链改善方案并自动联系系统,核心特色是理解业务语境,提供情景化建议并协助完成日常工作。
- 日榜
- 周榜
- 月榜
热点快看
