RAG 怎样为不同文档类型设置分块策略
我在排查 RAG “明明把文档放进去了,却总是答非所问”时,最先怀疑的往往不是 embedding 模型,而是分块边界。普通说明文、代码和表格共用一套按字符截断的规则,常见结果是标题留在上一块、正文落到下一块,代码被拆成半个函数,表头又和数据行分离。分块策略的核心不是追求一个固定 chunk_size,而是让每个块在自己的文档类型里保留足够完整的语义。
- 长段落优先按标题、段落和句子递归切分,必要时再用 token 上限兜底。
- 代码块要以函数、类或完整示例为边界,并把文件、符号和语言写入元数据。
- 表格不能只按换行切开,应保留表头、单位和一组相关行;查询复盘要按文档类型拆开看。
先从“召回不对”反推是哪种边界坏了
一个很典型的症状是:问概念时能召回,问“某个字段为什么这样填”却召回不到;或者代码解释看起来相关,却缺少函数签名和返回值。此时我会先把问题分成三类:块太大导致多个主题混在一起,块太小导致上下文断裂,或者解析阶段已经把标题、代码、表格的结构抹平。
这一步很重要,因为“把 chunk_size 调大”只对第三类问题之外的部分情况有效。Hugging Face 的 RAG 示例也把目标表述为语义相关的片段:太小不足以支撑答案,太大又会稀释单个观点。先确认症状属于哪一类,再决定是否调整大小。

普通长文:先保住标题,再递归处理段落
普通技术文档适合从大到小处理:先按章节标题分组,再按段落切分,最后才在单个段落过长时按句子或 token 上限拆分。每个块最好带上父级标题,而不是只保存一段孤立正文。这样用户问“连接池为什么要设置上限”时,召回内容仍能带着所属章节的语义。
重叠窗口可以作为补救,但不要把它当作结构解析的替代品。我的起点通常是让相邻块保留少量句子或约一成的 token 重叠,然后用真实问题检查:答案需要跨段落时是否仍能同时召回,单段落查询是否会被相邻主题干扰。
def split_long_paragraph(text, limit=420, overlap=40):
# 先按句号切分,避免在中文观点中间硬切。
sentences = [s.strip() for s in text.replace("!", "。\n").replace("?", "。\n").split("。") if s.strip()]
chunks, current = [], ""
for sentence in sentences:
candidate = (current + "。" + sentence).strip("。")
if current and len(candidate) > limit:
chunks.append(current + "。")
# 只保留尾部短上下文,避免相邻主题大量重复。
current = current[-overlap:] + sentence
else:
current = candidate
if current:
chunks.append(current + "。")
return chunks
这段代码只是说明“先按句子、再按上限”的最小策略;生产解析器还应把父标题、页码、段落序号和文档标识写入 metadata。不要把这个字符数直接当成所有模型的 token 限制。
代码文档:函数和类比固定长度更值得优先保留
代码的自然单位不是连续字符,而是文件、模块、类、函数和代码块。最容易复现的故障是把函数签名切到上一块,把函数体切到下一块;用户检索函数名时,向量可能只能看到一个无上下文的调用片段。更稳妥的做法是先按 fenced code block 或语法节点切分,再对超长函数按逻辑子块处理,并把语言、文件路径、符号名写入元数据。
def code_chunk(code, language, file_name, symbol):
# 一个函数或类先作为完整单元,避免符号和实现分离。
return {
"text": code,
"metadata": {
"doc_type": "code",
"language": language,
"file": file_name,
"symbol": symbol,
},
}
def should_split_code(chunk, max_chars=1800):
# 超长代码才进入二次切分,普通函数不使用重叠字符硬切。
return len(chunk["text"]) > max_chars
代码块的检索内容还可以补一行简短的结构前缀,例如“文件:router.py;符号:match_route;语言:Python”。前缀不是为了伪造摘要,而是让 embedding 同时看到符号身份和实现内容。
表格文档:表头、单位和相关行必须绑定
表格的召回问题经常被误判为“向量模型不懂表格”。实际上,单纯按换行拆分会让“延迟(毫秒)”留在第一块,而具体数值被分散到后面;模型得到数字,却不知道列含义。表格应先作为结构元素保存,再根据行数或 token 上限切成若干行组,每个行组重复携带表头、单位和表格标题。
如果表格存在合并单元格或多级表头,解析阶段应先把列路径展开成稳定字段,例如“华东 / 读取 / P95(毫秒)”。这比在向量库查询时临时猜列名可靠得多。对跨页表格,还要把页码和表格编号写进 metadata,方便回答时回到原文位置。

用统一元数据和小样本查询防止策略漂移
分块完成后,我会要求每个 chunk 至少有 doc_type、document_id、section 和 source_locator 四类字段;代码再加 symbol,表格再加 table_id 与列信息。这样当召回偏移时,可以先按 doc_type 分组,看问题只发生在表格还是所有文档都发生。
验证不要只拿一条“标准问题”。为每类文档准备几条真实查询:长文问一个观点,代码问一个符号和参数,表格问一个字段与数值关系。记录“命中块是否包含完整支撑信息”,而不是只看相似度排序。若代码问题命中调用点却没有定义,就回到代码边界;若表格只命中数值没有表头,就回到行组封装。
| 文档类型 | 优先边界 | 建议元数据 | 常见故障 |
|---|---|---|---|
| 普通长文 | 标题 → 段落 → 句子 | 章节、段落、页码 | 观点被相邻主题稀释 |
| 代码 | 文件 → 类/函数 → 逻辑子块 | 语言、文件、符号 | 签名与实现分离 |
| 表格 | 标题/表头 → 相关行组 | 表格编号、列路径、单位 | 数值脱离列含义 |
常见问题
所有文档都用相同的 chunk_size 可以吗?
可以作为初始基线,但不应作为最终策略。只要文档结构差异明显,就应先按结构元素切分,再让长度上限处理极端长块。
chunk_overlap 越大越好吗?
不是。重叠只能补充相邻上下文,过大会增加重复向量和噪声。先保证标题、代码符号、表头这些关键边界没有被拆开。
为什么表格要重复表头?
因为数据行脱离列名和单位后,数值本身缺少可检索语义。每个行组携带必要表头,才能让召回片段独立解释数据。
RAG top-k 怎样结合 rerank 控制上下文长度
- 上一篇
- RAG top-k 怎样结合 rerank 控制上下文长度
- 下一篇
- Embedding 怎样为短文本选择归一化策略
-
- 科技周边 · 人工智能 | 49分钟前 | RAG AI评测 生成错误 检索错误 faithfulness context precision
- AI 评测怎样区分检索错误与生成错误
- 419浏览 收藏
-
- 科技周边 · 人工智能 | 52分钟前 | 人工智能 · 多模态 · 多模态输入 Processor Hugging Face Transformers chat template 图片文本绑定
- 多模态输入怎样把图片与文本绑定同一请求
- 199浏览 收藏
-
- 科技周边 · 人工智能 | 55分钟前 |
- 结构化输出怎样处理模型缺少可选字段
- 288浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- AI Agent 怎样记录工具调用轨迹供回放
- 444浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- RAG 检索怎样用 query rewrite 减少召回偏移
- 416浏览 收藏
-
- 科技周边 · 人工智能 | 1天前 |
- Hugging Face Hub 怎样用 commit hash 固定模型文件版本
- 191浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 548次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 601次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 628次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 581次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 406次使用
-
- 量化模型本地推理的显存估算方法
- 2026-10-17 501浏览
-
- 本地大模型反复输出同一句话怎么调整生成参数
- 2026-09-06 501浏览
-
- Python 调用大模型时如何用结构化输出校验 JSON:从解析失败到可重试
- 2026-08-29 501浏览
-
- AI写作工具免费版安装教程(含豆包Clawdbot)
- 2026-05-30 501浏览
-
- WPS AI能自动生成PPT吗?输入主题一键制作演示文稿
- 2026-05-27 501浏览

