游乐游手机版
首页/AI热点日报/热点详情

RAG十五种分块策略全面汇总介绍

类型:热点整理2026-07-10
系统梳理了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限制严格 → 基于令牌分块。
来源:https://www.53ai.com/news/RAG/2025051210296.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。