RAG 常见分块策略全解析:一文了解7种分块方法【附代码】

在这里插入图片描述

引言

在检索增强生成(RAG)系统中,分块策略是决定系统性能的基石。本文基于 2023 - 2025 年最新研究成果,深度剖析 12 种分块方法的实现原理,并通过 Python 代码演示其应用场景。


大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。
知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。
欢迎关注《大模型理论和实战》《DeepSeek技术解析和实战》,一起探索技术的无限可能!

【大模型篇】更多阅读
【大模型篇】万字长文从OpenAI到DeepSeek:大模型发展趋势及原理解读
【大模型篇】目前主流 AI 大模型体系全解析:架构、特点与应用
【大模型篇 】 Grok-3 与 DeepSeek 的技术架构与性能分析
【大模型篇】速读版DeepSeek核心技术解密:与 GPT-4、Claude、LLaMA 技术路线差异对比分析

一、为什么需要分块?

1.1 上下文窗口限制

RAG 模型中的检索部分会从文档库中检索与用户查询相关的文本块,这些文本块将作为上下文输入到生成模型中。然而,生成模型(如大型语言模型,LLM)的上下文窗口是有限的,这意味着它能够处理的输入文本长度是有限制的。例如,许多 LLM 的上下文窗口最多只能容纳 2048 个令牌(tokens)。如果检索到的文本块过大,超出了这个限制,就无法完整地输入到生成模型中,从而可能导致生成的响应不准确或不完整。通过将文档分块,可以确保每个块的大小都在生成模型的上下文窗口范围内,从而使模型能够有效地处理和生成高质量的响应。

大型语言模型(LLM)存在严格的 Token 限制:

  • GPT - 4:32K Token
  • Claude 3:200K Token
  • Gemini 1.5:1M Token

尽管上下文窗口持续扩大,但处理 100 页以上的文档仍需要分块机制。以 1M Token 的 Gemini 1.5 为例:

  • 单 Token ≈ 0.75 个英文单词
  • 1M Token ≈ 75 万单词 ≈ 750 页 A4 纸
    实际业务文档往往超过这个规模(如企业知识库、医疗档案)。

1.2 块大小对检索精度的影响

  • 当文档被分块后,每个块都包含了相对独立和完整的信息单元。这使得检索系统能够更精确地定

RAG(Retrieval-Augmented Generation)系统中,文本分块(Text Chunking)是关键的预处理步骤,其目的是将长文本分割为具有语义连贯性的片段,以便后续的检索与生成任务更高效、准确地进行。以下是一些常见文本分块方法及其代码实现: ### 固定长度分块(Fixed-Length Chunking) 这种方法文本按照固定数量的字符或 token 进行分割,是最基础的分块策略。虽然实现简单,但可能会破坏语义完整性。 ```python from langchain.text_splitter import CharacterTextSplitter # 创建固定长度分块器 fixed_splitter = CharacterTextSplitter( separator="\n", # 分隔符 chunk_size=1000, # 每个分块的字符数 chunk_overlap=200, # 重叠字符数 length_function=len, # 长度计算方式 ) # 分块 fixed_chunks = fixed_splitter.split_text(long_text) ``` ### 基于句子的分块(Sentence-Based Chunking) 该方法文本按句子边界进行分割,避免破坏句子结构,适合大多数自然语言处理任务。 ```python from langchain.text_splitter import RecursiveCharacterTextSplitter # 创建基于句子的分块器 sentence_splitter = RecursiveCharacterTextSplitter( separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""], # 分割符优先级 chunk_size=1000, chunk_overlap=200, ) # 分块 sentence_chunks = sentence_splitter.split_text(long_text) ``` ### 语义感知分块(Semantic Chunking) 语义分块通过计算文本片段之间的语义相似性来决定分块位置,确保每个分块在语义上保持一致性。可以使用 Sentence Transformers 等模型来获取文本 embedding。 ```python from langchain.text_splitter import SentenceTransformersTokenTextSplitter # 创建基于语义的分块器 semantic_splitter = SentenceTransformersTokenTextSplitter( model_name="all-MiniLM-L6-v2", # 指定embedding模型 threshold_strategy="percentile", # 百分位策略 threshold=0.95, # 95%分位数作为阈值 window_size=3 # 滑动窗口大小 ) # 分块 semantic_chunks = semantic_splitter.split_text(long_text) ``` ### 基于滑动窗口和相似度的分块 这种方法通过滑动窗口计算相邻文本片段的 embedding 相似度,当相似度低于设定阈值时进行分块。适用于长文档的语义分割。 ```python from sentence_transformers import SentenceTransformer import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 加载预训练的embedding模型 model = SentenceTransformer('all-MiniLM-L6-v2') # 将文本按句子拆分 sentences = long_text.split("。") embeddings = model.encode(sentences) # 设置阈值 threshold = 0.7 current_chunk = [] chunks = [] # 遍历句子并计算相似度 for i in range(len(embeddings) - 1): sim = cosine_similarity([embeddings[i]], [embeddings[i+1]])[0][0] if sim > threshold: current_chunk.append(sentences[i]) else: current_chunk.append(sentences[i]) chunks.append("。".join(current_chunk)) current_chunk = [] if current_chunk: chunks.append("。".join(current_chunk)) ``` ### 自适应分块(Adaptive Chunking) 自适应分块结合了多种策略,根据文本内容动态调整分块大小和位置,通常用于处理结构复杂的文档。 ```python from langchain.text_splitter import TokenTextSplitter # 创建基于token的自适应分块器 adaptive_splitter = TokenTextSplitter( chunk_size=200, # 每个分块的token数 chunk_overlap=50 # 重叠token数 ) # 分块 adaptive_chunks = adaptive_splitter.split_text(long_text) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大F的智能小课

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值