Q2042RAG 检索增强真题解析RAG(检索增强生成)AgentAlpha 社区真题库约 9 分钟更新 2026-09-29

What are the different types of chunking methods

What are the different types of chunking methods

1️⃣ 考察意图

面试官想考察你对 RAG 系统底层数据处理的深度理解,而非简单背诵方法名称。这是典型的“工程取舍+系统设计”题,刁钻点在于:候选人常只罗列方法,却说不清每种方法在延迟、召回率、语义完整性上的具体 trade-off,以及如何根据文档类型(代码/法律合同/新闻)做选择。答好了能展示你对 RAG pipeline 端到端优化的硬实力——从 token 利用率到检索质量,再到下游 LLM 的上下文窗口适配。

2️⃣ 标准答

Chunking 方法可归为四大类,核心差异在“分割粒度”与“语义边界”的权衡。以下按复杂度递增展开:

  • 固定大小分割(Fixed-size Chunking)
  • 做法:按字符数(如 512 chars)或 token 数(如 256 tokens)硬切,常配合 overlap(如 10-20%)。
  • 工具:LangChain 的 RecursiveCharacterTextSplitter 默认 chunk_size=1000, chunk_overlap=200。
  • 优点:实现简单,计算开销 O(n),适合快速原型。
  • 缺点:语义断裂严重——一句话可能被切到两个 chunk,导致检索时丢失上下文。例如“苹果公司发布新款 iPhone”被切成“苹果公司发布”和“新款 iPhone”,检索“苹果手机”时两个 chunk 都低分。
  • 工程取舍:overlap 越大,语义连贯性越好,但存储和检索成本线性增加。实际落地中,overlap 设为 chunk_size 的 15-20% 是常见折中。
  • 递归分割(Recursive Chunking)
  • 做法:按分隔符优先级递归切分,如段落(\n\n)→ 句子(. )→ 子句(, )。若 chunk 仍超限,则降级到下一级分隔符。
  • 工具:LangChain RecursiveCharacterTextSplitter 默认分隔符列表 ["\n\n", "\n", " ", ""]。
  • 优点:保留文档结构,减少语义断裂。对新闻、博客等自然文本效果好。
  • 坑:代码文档中 \n 可能出现在函数体内,导致 chunk 边界在逻辑块中间。解法:对代码文档使用专用分隔符(如 def , class )。
  • 实际落地:在金融研报场景,先按 ## 标题 切分,再对每个标题下内容递归切到 512 tokens,召回率比固定分割高 12-18%(内部 A/B 测试数据)。
  • 语义分割(Semantic Chunking)
  • 做法:用 embedding 模型(如 Sentence-BERT, Instructor-XL)计算句子向量,当相邻句子余弦相似度低于阈值(如 0.7)时切分。或直接用 NLP 模型(如 spaCy 的 sentencizer)检测句子边界。
  • 论文参考:LlamaIndex 的 SemanticSplitterNodeParser 基于此思路。
  • 优点:语义边界准确,适合问答场景。例如法律条款中“甲方义务”和“乙方权利”自然分开。
  • 缺点:计算开销大——对 1000 句文档需 1000 次 embedding 推理,延迟从毫秒级升到秒级。trade-off:可先用递归分割粗切,再对每个 chunk 做语义精分,平衡速度与质量。
  • 坑:阈值设置敏感——0.7 可能过切(把同一段落切碎),0.5 可能欠切(把不同主题混在一起)。解法:用文档集做 grid search,选使 chunk 内平均相似度最高且 chunk 间相似度最低的阈值。
  • 文档结构感知分割(Structure-aware Chunking)
  • 做法:利用文档的显式结构(Markdown 标题、HTML 标签、PDF 表格、JSON 键值对)作为分割锚点。
  • 工具:Unstructured.io 的 partition_pdf() 可提取表格和标题;LlamaParse 对 PDF 做结构解析。
  • 优点:对结构化文档(如 API 文档、产品手册)效果极佳,chunk 天然对应逻辑单元。
  • 工程取舍:结构解析依赖文档格式,PDF 表格解析准确率约 85%(Unstructured 官方数据),需结合 OCR 后处理。实际落地中,对 PDF 先转 Markdown 再按标题切分,比直接切 PDF 文本召回率高 20%+。
  • 混合方法(Hybrid Chunking)
  • 做法:组合上述方法。例如:先按文档结构切(标题/章节),再对超大 chunk 递归切到目标大小,最后用语义分割微调边界。
  • 实战案例:在阿里云客服 RAG 中,对 FAQ 文档先用 ## 问题 切分,再对答案部分递归切到 300 tokens,最后用 Sentence-BERT 检查 chunk 内语义一致性,若低于 0.6 则重新分割。最终检索准确率从 78% 提升到 91%。
  • 坑:多阶段处理增加 pipeline 复杂度,需监控每阶段耗时。解法:用缓存机制,对已切分的文档存储 chunk 元数据(起始位置、类型),避免重复计算。

3️⃣ 答题模板(30 秒电梯版)

“这个问题我从方法分类、工程取舍、落地坑点三个层面回答。方法上,有固定大小、递归、语义、结构感知和混合五种,核心差异在分割粒度与语义边界的权衡。工程上,固定大小简单但语义断裂,递归保留结构但代码文档需定制分隔符,语义分割准确但计算开销大。落地坑点包括 overlap 比例选择、阈值调优、PDF 表格解析准确率。总结一句:没有万能方法,需根据文档类型和延迟要求做组合,通常混合方法效果最优。”

4️⃣ 高频追问 & 应对

追问 1:你如何评估不同 chunking 方法的好坏?具体用什么指标?

评估分三个维度:1)检索质量:用 Recall@K 和 MRR,对同一 query 集比较不同 chunking 下的检索结果。2)语义完整性:计算 chunk 内句子间的平均余弦相似度(越高越好),以及 chunk 间相似度(越低越好)。3)效率:记录每文档的 chunking 耗时和存储空间。实战中,用 LlamaIndex 的 ChunkingEvaluator 可自动化对比。注意:指标需结合下游任务,例如问答场景更关注 Recall@1,摘要场景更关注 chunk 内连贯性。

追问 2:如果文档是代码(如 Python 文件),你会怎么切?和自然文本有什么区别?

代码文档需按逻辑块切分,而非自然语言分隔符。具体做法:1)用 AST 解析器提取函数、类定义作为 chunk 边界,例如 Python 的 ast 模块。2)对函数内部,按代码行数或 token 数递归切分,但保留函数签名和 docstring 在 chunk 开头。3)坑:注释和字符串可能包含自然语言,需用正则过滤。实战中,对 GitHub 仓库文档,先用 tree-sitter 解析语法树,再按函数粒度切分,检索代码片段时 Recall@5 比固定分割高 35%。

追问 3:chunk 大小如何选择?有没有通用经验值?

通用经验:chunk_size 设为下游 LLM 上下文窗口的 10-20%。例如 GPT-4 的 8K 窗口,chunk 取 800-1600 tokens。但需根据文档类型调整:法律合同(长句多)取 512 tokens,新闻(短句多)取 256 tokens。实战中,用 grid search 在 128/256/512/1024 tokens 上测试,选使检索 Recall@5 最高的值。注意:chunk 太小(<128 tokens)导致上下文不足,太大(>2048 tokens)导致 LLM 处理时注意力分散,且检索时可能包含无关信息。

5️⃣ 避坑 · 常见错误答法

  • ❌ 说“chunking 就是按字符数切分,overlap 越大越好” → ✅ 正确切入:overlap 增加语义连贯性,但会放大存储和检索成本,需根据文档类型和延迟要求做折中,通常 15-20% 是安全起点。
  • ❌ 说“语义分割用 BERT 就行,不需要调参” → ✅ 正确切入:语义分割的阈值(如余弦相似度 0.7)需对文档集做 grid search,且不同文档类型(技术文档 vs 小说)阈值差异大,需单独调优。
  • ❌ 说“代码文档和自然文本用同一套方法” → ✅ 正确切入:代码需用 AST 或 tree-sitter 按函数/类粒度切分,自然文本用递归分割,两者 pipeline 完全不同。

6️⃣ 简历呼应

  • 如果你有 RAG 项目:从“混合 chunking 在客服场景的落地”切入,强调你如何用结构感知+语义分割提升 Recall@5 从 78% 到 91%,并给出具体阈值和 overlap 值。
  • 如果你只做过传统 NLP:用“文本分割 vs chunking”类比迁移,强调你对句子边界检测(spaCy)和语义相似度(Sentence-BERT)的掌握,并说明如何将 NLP 技术用于 RAG 数据预处理。
  • 如果你是校招无项目:聚焦“固定 vs 递归 vs 语义”三种方法的论文复现 demo,用 LlamaIndex 的 ChunkingEvaluator 对比结果,并给出一个文档集(如 Wikipedia 子集)的 Recall@K 对比表。
  • LangChain 官方文档:RecursiveCharacterTextSplitter 源码与参数详解
  • LlamaIndex 博客:SemanticSplitterNodeParser 设计与实验对比
  • 论文:”Chunking for Retrieval-Augmented Generation: A Comparative Study” (2024)
  • 工具:Unstructured.io 的 partition_pdf() 文档与表格提取示例
  • 博客:”The Ultimate Guide to Chunking in RAG” by Pinecone (2023)
—— 本场面试完 ——

我们不做玩具级 Demo 教学。训练营的作业是开源项目和论文——我们想陪伴你,做出能改变生活、最后改变世界的项目。