2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

RAG Chunking 2.0:提升文档分块效果的一些经验

发布日期:2025-11-13 12:47:08 浏览次数: 2537
作者:深度学习机器

微信搜一搜,关注“深度学习机器”

推荐语

RAG系统文本分块效果提升的实战经验分享,助你优化检索与生成质量。

核心内容:
1. 滑动窗口分块法:通过重叠窗口保持上下文连续性
2. 自适应分块策略:按文档结构智能划分内容单元
3. 不同场景下的参数调优建议与Python实现示例

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

在基于大语言模型的RAG系统里,文本分块是非常关键的一步。分块做得好,后续的向量检索、结果召回和生成质量都会更稳更准。除了大家常用的固定大小、递归、语义、按文档等切法,至少还有好几种策略,能显著提升检索准确率、保持上下文连续,并适配不同任务。


1. 滑动窗口分块

概念

首先设定一个固定大小的窗口,再按设定的重叠量向前滑动,生成一系列重叠块,这样跨块边界的上下文更不容易丢。

使用场景

适合追踪长文档里的「进展」「演变」「关系变化」,比如医疗记录、日志、历史报告等。

Python示例

def sliding_window_chunks(text, window_size=500, overlap=100):
    words = text.split()
    chunks =[]
    start =0
    while start len(words):
        end min(start + window_size,len(words))
        chunk " ".join(words[start:end])
        chunks.append(chunk)
        if end ==len(words):
            break
        start = end - overlap
    return chunks

# 用法示例
doc """...一段非常长的文本..."""
chunks = sliding_window_chunks(doc, window_size=500, overlap=100)
print(f"Generated {len(chunks)} chunks.")

重叠比例可按任务重要性调整,比如医疗记录这些高信息密度的可以达到20%左右,而普通文档只需10%左右即可。



2. 自适应分块


概念

不同于固定大小,自适应分块会尽量把自然文档单元(如条款、段落、章节)放在同一个块里,同时遵守最大token数约束。 这种方法典型的应用是法律法规等文档,因为这些文档通常有明确的章节或段落结构,可按「每一章」「每一节」进行分块处理。

使用场景

非常适合结构化文档:法律合同、协议、白皮书、政策文件等。

Python示例

import re

def adaptive_chunking(text, min_tokens=800, max_tokens=1200, boundary_pattern=r"SECTION\s+\d+:"):
    sections = re.split(boundary_pattern, text)
    chunks =[]
    for sec in sections:
        # 简化:如果 sec 很长,进一步拆分
        words = sec.split()
        if len(words)<= max_tokens:
            chunks.append(sec.strip())
        else:
            # 简单按句子拆
            current =[]
            for w in words:
                current.append(w)
                if len(current)>= max_tokens:
                    chunks.append(" ".join(current))
                    current =[]
            if current:
                chunks.append(" ".join(current))
    return chunks

# 用法
contract_text """SECTION 1: ... SECTION 2: ..."""
chunks = adaptive_chunking(contract_text, min_tokens=800, max_tokens=1200)
print(len(chunks))

需要根据文档类型,使用正确的正则表达式识别边界,从而来提高质量。 此外,应该尽量避免在逻辑单元中间硬拆,否则上下文容易被破坏。除非块的大小仍旧不满足要求,才允许在逻辑单元中间进行拆分。



3. 基于实体分块


概念

先做命名实体识别,再按实体把相关句子聚到同一块里,而不是只按原文顺序切。

使用场景

适合知识库、以实体为核心的QA、新闻档案检索等。比如问「某某人这周做了什么?」,事先把该实体相关内容聚到一起,检索更高效。

Python 示例

import spacy
from collections import defaultdict

nlp = spacy.load("en_core_web_sm")

def entity_based_chunks(text):
    doc = nlp(text)
    entity_map = defaultdict(list)
    for sent in doc.sents:
        ents ={ent.text for ent in sent.ents}
        for e in ents:
            entity_map[e].append(sent.text)
    return {entity:" ".join(sents)for entity, sents in entity_map.items()}

text """Elon Musk announced a new AI initiative. Tesla unveiled its Model Y refresh. SpaceX launched its Starship test flight."""
chunks = entity_based_chunks(text)
for entity, chunk in chunks.items():
    print(f"Entity: {entity}\nChunk: {chunk}\n")

可用特定的NER模型来识别实体。 每个实体生成一个块时,注意句子可能属于多个实体,存在重叠,可以按照重要性或者其他策略进行归类。



4. 混合分块


概念

从名字就可以看出来,可以把多种分块策略组成Pipeline:先按结构拆分,再做语义聚类,最后做实体保留。这样能兼顾结构、语义和实体三方面的优势。

使用场景

适合技术文档、API 文档、软件说明、混合内容(文本 + 代码)等。单一策略很难同时兼顾结构完整性、语义聚合和实体识别时,可以使用混合策略。

Python 示例

def hybrid_chunking(text):
    # Step1: Recursive split by headings
    sections = text.split("\n## ")
    chunks_stage1 =[sec for sec in sections]
    # Step2: Within each section, semantic cluster paragraphs (reuse previous code)
    paragraphs =[sec.split("\n")for sec in chunks_stage1]
    chunks_stage2 =[]
    for paras in paragraphs:
        chunks_stage2.extend(topic_based_chunks(paras, n_clusters=2))
    # Step3: Entity preservation: ensure entity sentences stay with their chunk
    final_chunks =[]
    for chunk in chunks_stage2:
    # simple heuristic: if entity appears, include nearby sentences
        final_chunks.append(chunk)
    return final_chunks

text """## Authentication Methods … ## Error Handling … ## Rate Limiting … """
chunks = hybrid_chunking(text)
print(len(chunks))

Pipeline可以按照这种顺序处理:结构 → 语义 → 实体,由简到难。


5. 任务感知分块


概念

根据下游任务类型(如摘要、检索、问答等不同需求)选择不同分块规则。同一内容可以针对不同任务生成不同的分块方案。

使用场景

比如对代码库做摘要时,用更小的函数级分块;做检索时,按函数签名+文档字符串成块;做QA时,按类或模块级别成块。

Python 示例

def task_aware_chunking(code_text, task='search'):
    if task =='summarization':
        # chunk size small: 20-30 lines per function
        return code_text.split("\n\n")# 简化版
    elif task =='search':
        # chunk: function signature + docstring
        chunks =[]
        for func in code_text.split("def "):
        if not func.strip():continue
            chunks.append("def "+ func.split("\n")[0])
        return chunks
    elif task =='qa':
        # chunk: entire class definitions (~100-200 lines)
        return code_text.split("class ")
    else:
    return [code_text]

code """class AuthenticationManager: … def authenticate … def refresh_token …"""
for task in['summarization','search','qa']:
print(task,len(task_aware_chunking(code, task)))
  • • 为不同任务维护不同配置(chunk 大小、策略、优先级)更稳。
  • • 同一语料可以面向多任务同时生成多个索引,每个任务一套策略。


6. 基于HTML/XML标签拆分


概念

解析 HTML 或 XML 的 DOM 结构,根据标签(如 <h2><section><div>)来确定chunk的边界,更好地保留页面结构。

使用场景

适合处理爬虫网页、博客文章、在线文档等含结构化标记的内容。优点是能保留页面结构,而不是盲目按词或句拆分。

Python 示例

from bs4 importBeautifulSoup

def tag_based_splitting(html, boundary_tags=["h2", "section"]):
    soup =BeautifulSoup(html,"html.parser")
    chunks =[]
    for tag in soup.find_all(boundary_tags):
        # get text of this section
        section_text = tag.get_text(separator="\n")
        chunks.append(section_text)
    return chunks

html """<article><h2>Introduction</h2><p>…</p><h2>Supervised Learning</h2><p>…</p></article>"""
chunks = tag_based_splitting(html)
for i, c in enumerate(chunks):print(i, c[:50])

注意标签嵌套:例如 <h3> 是否作为子块,还是合并到 <h2>,可以根据实际需求来定。



7. 基于抽象语法树的代码文件拆分


概念

针对代码文本,使用AST或语言特定模式识别函数、类、模块等逻辑边界来拆分。这种方法在很多Coding Agent出现,如Cursor,Trae等。

使用场景

适合开发文档、代码审查、自动生成文档、代码问答等场景。往往把整个类或函数作为一个 chunk,而不是简单按行数来切。

Python 示例

import ast

def code_specific_chunks(code):
    tree = ast.parse(code)
    chunks =[]
    for node in tree.body:
    if isinstance(node, ast.ClassDefor isinstance(node, ast.FunctionDef):
            start = node.lineno -1
            end = node.end_lineno
            chunk ="\n".join(code.splitlines()[start:end])
            chunks.append(chunk)
    return chunks

code ="""
class UserManager:
    def __init__(self):
        pass
    def add_user(self, name, email):
        pass

def helper_function(x, y):
    return x + y
"""

chunks = code_specific_chunks(code)
for c in chunks:
    print("Chunk:", c.splitlines()[0])

可用ast来处理Python,或更通用的Tree-Sitter以支持更多的编程语言。 可以适当保留注释和docstring,以增强可读性和语义。


8. 正则表达式分块

概念

基于可预测的文本模式(时间戳、分隔符、标记等),用正则表达式定位拆分边界。每次匹配产生一个新块。

比如Jina-AI之前发布过的一个正则模板,号称使用正则表达式解析整本书《爱丽丝梦游仙境》只需要2毫秒,总共产生了1204个块。

使用场景

这种方法理论上能提取所有格式,但是需要根据实际情况调整正则表达式模式。

Python 示例

# 比如可以从日志记录中按时间戳进行切分
import re

def regex_chunking(text, pattern=r"\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\]"):
    parts = re.split(pattern, text)
    chunks =[]
    for part in parts:
        if part.strip():
            chunks.append(part.strip())
    return chunks

log ="""[2025-01-15 10:23:45] INFO: User john logged in
[2025-01-15 10:24:12] ERROR: DB connection failed
[2025-01-15 10:24:15] INFO: Retrying…"""

chunks = regex_chunking(log)
for c in chunks:
    print("Chunk:", c[:50])

一些实践经验

在选择文本分块策略时,一般需要从最简单的入手,如按照固定的chunk size进行切分,待效果稳定后再逐步升级到更复杂的方案。 在评估环节,需要通过检索准确率和响应质量等指标衡量实际效果,必要时可进行A/B测试。

此外,可以按照如下的技巧来快速选择合适的分块策略:

类型
分块策略
需要保留跨边界上下文
滑动窗口
处理合同、协议类文档
自适应分块
构建实体知识库
实体分块
内容复杂、结构多样
混合分块
任务不同
任务感知分块
结构化 HTML/XML 网页
标签拆分
代码内容
代码专用拆分
日志/流水/带标记文本
正则分块


总结

对于实际的应用来说,并没有包罗万象的分块方法,包括上面的提到这些分块策略,也并不能保证能够完美提升RAG的效果,只是在不同场景下的一种折衷方案而已。

好的分块策略不只是「把文本切成块」,而是要同时考虑 内容类型/任务类型/文档结构,再选择或组合合适的方法, 让RAG系统更好地利用上下文、提供更准的答案,并提升整体体验。

掌握上面的几种策略,并结合自己正在做的场景做一些实验,通常都能带来很可观的提升。

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅