跳到主要内容

RAG 语料库架构:决定检索质量的索引决策

· 阅读需 13 分钟
Tian Pan
Software Engineer

当 RAG 系统返回错误答案时,事后分析几乎总是聚焦于同一批嫌疑人:检索查询、相似度阈值、重排序器、提示词。团队会花好几天调整这些组件,而真正的原因却静静地躺在索引流水线里无人触碰。失败早在几周前就已发生——那时有人拍板决定了分块大小。

大多数 RAG 质量问题是架构性的,而非运营性的。它们源于索引时做出的决策,这些决策会悄然塑造 LLM 最终能看到的内容。等到用户投诉时,检索系统正在做它被设计好的事——只是那个设计本身就是错的。

本文是一份关于最重要的索引时决策指南,涵盖 2024–2026 年基准测试的实际结论,以及在生产中持续区分高质量与低质量 RAG 系统的设计模式。

索引陷阱:症状如何向下游迁移

对 RAG 的朴素认知将检索视为查询时的问题。你有一个向量存储,发送查询,拿回分块。如果分块不对,就调整查询。如果模型产生幻觉,就检查提示词。

真实的故障模型并非如此。索引架构设定了一个上限,无论怎么调整查询都无法突破。如果你的分块在句子边界处切断了关键段落,每一半的嵌入在语义上都会减弱。如果你从未将章节标题注入为元数据,重排序器就没有任何线索可循。如果你对叙述性散文和财务表格使用同一分块大小,两者的表示都会变差。

这些失败会静静地叠加。PDF 提取出错会产生噪声分块。噪声分块产生误导性嵌入。误导性嵌入返回无关上下文。无关上下文导致幻觉。所有责任都落在"模型"身上——但模型只是在根据你提供的内容进行推理。

实践含义:像对待查询流水线一样积极地监测索引流水线。记录分块质量分布。从第一天起就在真实查询上测试。你的评估基准应该建立在真实用户查询上,而不是基于你已经清晰索引的文档所构造的合成查询。

分块大小是一个查询类型决策

索引时最常见的错误是把分块大小当作全局调整的单一参数。不存在普遍最优的分块大小。正确的大小取决于你的系统所面对的查询分布。

事实查询、查找型查询在小分块(128–256 token)下表现最好。更小的单元能产生更聚焦、更具体的嵌入,与精确措辞的问题高度匹配。当用户问"持有不足一年的资产资本利得税率是多少"时,你想要的是一个恰好包含这句话的分块,而不是一个还涵盖遗产规划、赠与税和成本基础递增的分块。

分析型查询——综合、比较、多跳推理——需要更多上下文。一个覆盖文档完整章节的 512–1024 token 分块为模型提供了跨相关概念进行推理的连接纽带。把它切成 128 token 的碎片,会产生对概念关系表示更弱的嵌入。

NVIDIA 2024 年的基准测试显示,页级分块以 64.8% 的准确率和最低方差取得最高精度。但这一发现范围有限:它适用于结构良好的分页文档,其中一页确实代表一个连贯的语义单元。应用于长篇叙述性文本或 FAQ 文档时,页级分块是随意的,而非原则性的。

实践基线:从 400–512 token 的递归字符切分开始。Chroma Research 2025 年的研究发现,此方法在无需语义分块计算开销的情况下实现了 85–90% 的召回率。在有真实流量可测量之后,再根据你的实际查询分布进行调整。

重叠悖论

十年来的 RAG 教程都建议在分块之间添加重叠。理由直觉上说得通:如果关键段落横跨分块边界,重叠能确保两半都不会孤立存在。

2026 年 1 月一项使用 SPLADE 检索在 Natural Questions 数据集上的系统性分析发现,重叠没有带来任何可测量的收益,反而增加了索引成本。直觉失效的具体原因在于:重叠的分块互为近似副本,当两者都被检索到时,它们消耗的是上下文窗口而不是提供额外证据。你得到的是冗余,而不是覆盖。

这不意味着重叠永远是错的。对于 OCR 处理的文本、抓取的网页以及其他空白符和结构不可靠的来源,10–15% 的重叠可以弥补朴素切分会破坏的边界。对于干净、结构良好的文档,它往往只是增加噪声。

实践规则:默认不设重叠,在跨边界查询上测量检索质量,仅当能观察到改善时再添加重叠。大多数场景的适当上限是 10%。

父子层级与小转大模式

生产 RAG 系统中最持久的模式之一是父子检索层级。文档被切分成用于检索的小子分块(100–300 token)和用于生成的大父分块(500–2000 token)。检索系统获取子分块,因为其紧凑的嵌入编码了更精确的语义。生成步骤接收父分块,因为更广的上下文能产生更好的答案。

理解其有效性的原理很重要。当你嵌入一个横跨多个子主题的 1500 token 分块时,得到的向量是所有这些主题的加权平均,嵌入是模糊的。当你嵌入一个 200 token 的句子窗口分块时,向量捕捉到了更聚焦的语义单元——检索相似度分数相应提高。

在生成时,窄分块通常不够用。模型需要周围上下文来解析代词、遵循逻辑链并理解主张之间的关系。父分块提供了这种上下文。

这一模式对技术文档、研究论文以及任何具有清晰层级结构(章节内的小节、小节内的子章节)的语料库特别有效。索引中的层级与源材料中的层级相对应,检索从这种对齐中获益。

元数据增强:团队持续跳过的决策

索引时最被低估的决策是在每个分块进入向量存储之前附加什么元数据。

仅内容的向量存储支持一维检索:语义相似度。元数据丰富的存储支持多维过滤搜索。你可以同时按语义相似度、源文档、发布日期、章节类型和文档分类进行检索。你添加的每个过滤维度都将"找相似的"变成了"找相关的"。

Snowflake 2024 年金融 RAG 基准测试显示,元数据增强检索实现了 82.5% 的精度和 0.813 的 NDCG 分数,大幅超越仅内容的基线。推动差距的元数据包括公司名称、申报日期、表单类型和章节标题——所有这些字段若不作为结构化字段注入,模型都需要从内容中推断。

持续有效的元数据字段:

  • 章节标题和层级结构。 一个说"利率为 5%"的分块是模糊的。一个标注了 section: "2025 年第四季度联邦基金利率" 的分块则不然。标题路径作为一条面包屑线索,消除了检索和生成中的歧义。
  • 文档标识符和来源 URL。 支持去重、来源追踪以及基于来源权威性的置信度评分。
  • 分块序列索引。 允许检索系统在找到匹配项时获取前后分块——对于重建叙事连贯性至关重要。
  • 文档级摘要或摘要。 在每个分块前添加简要文档描述(例如,"本章节来自 2025 年 SEC 申报文件,讨论半导体业务的营收预测")可以解析代词引用和隐含上下文,否则模型只能猜测。

2024 年 MDKeyChunker 研究发现,LLM 生成的多层元数据——包括主题聚类、关联实体以及每个分块生成的问答对——显著提升了下游检索质量。索引时增加的额外成本在查询时收回了红利。

结构感知分块:表格和代码不是散文

混合内容文档语料库架构中最大的单一失败,是将叙述性分块规则应用于非叙述性内容。

向量存储中的表格需要原子化处理。跨两个分块切分的表格比没用还糟——每个分块包含没有可解释含义的不完整列。半张表格的嵌入与用户会写出的任何查询都毫无相似之处。至少,表格应当被视为语义单元,并在保留其标题的情况下进行分块。更好的做法是:生成对表格内容的自然语言描述,并将描述和结构化 markdown 一起作为单个分块存储。

代码块有类似的问题。代码语义依赖缩进、变量作用域和结构完整性。在任意字符数处切分函数会产生一个代表半个函数的嵌入——什么都匹配不到。在函数或类边界处进行结构感知切分,产生的嵌入是可解释且可检索的。一些常见的文本切分器还会通过去除空白符或引入不需要的换行来破坏代码,即使分块边界选择正确,也会破坏嵌入。

异构文档的实践模式:在提取时识别内容类型,然后路由到特定类型的分块处理。叙述性散文使用递归字符切分。表格作为原子单元提取并生成描述。代码在逻辑边界处使用 AST 感知切分。

延迟分块:嵌入你在分块时还没有的上下文

Jina AI 2024 年的一项开发解决了传统分块的根本局限:当你先分块后嵌入时,每个分块在嵌入时就失去了对周围上下文的访问。

延迟分块颠倒了顺序。整个文档首先通过长上下文嵌入模型,产生捕获了文档完整上下文的 token 级嵌入。然后通过对这些富含上下文的嵌入在 token 范围内进行均值池化来形成分块。

结果是分块嵌入编码了每个段落在上下文中出现时的含义,而不是孤立存在的含义。分块中像"它"这样的代词拥有反映周围文本中"它"所指代内容的嵌入。子章节中的主张拥有反映它所支持的更大论点的嵌入。

2025 年的实证比较显示,延迟分块在多种任务上产生了更强的检索性能。权衡是它需要长上下文嵌入模型,并施加全文档编码的延迟。对于检索精度比索引吞吐量更重要的高价值文档语料库,这是正确的选择。对于大量普通内容,有良好元数据增强的传统分块通常已经足够。

在用户发现之前诊断索引故障

RAG 开发姿态中最具生产力的转变,是将索引流水线视为拥有自己评估规范的一流系统——而不是运行一次就被遗忘的预处理步骤。

配置漂移是最常见的静默故障模式。查询时使用的嵌入模型必须与索引时使用的完全相同。维度数、分词器、归一化行为——所有都必须匹配。托管嵌入 API 中透明发生的模型更新可能在没有任何警告的情况下使你的存储错位。将嵌入模型版本固定,并将不匹配设为显式错误,而非静默降级。

过期索引是另一类不可见故障。当源文档发生变化而向量存储没有跟进时,用户遇到的检索返回过时、矛盾或已删除的内容。这产生的幻觉被归咎于模型,而不是过期索引。将文档更新传播到索引中的变更数据捕获流水线,对于实时知识库来说不是可选项。

摄入时的质量检查应当在提取故障传播之前捕获它们。PDF 解析、OCR 和 HTML 提取都会以产生畸形分块的方式静默失败。在摄入时运行基本的结构有效性检查(预期字符数、编码有效性、无提取artifacts),在修复成本低廉时捕获故障,而不是在它们污染了数百个下游查询之后。

结束循环的评估方法:从真实用户查询(而不是你已知索引清晰的文档)构建检索评估集。对每个查询,测量基准段落是否出现在 top-K 结果中。这个集合上的低召回率是索引架构问题,而不是查询问题。将检索质量视为可部署的指标,有自己的回归测试、版本历史和回滚标准。

胜过复杂方案的基线

2026 年 Vectara 基准测试在真实文档语料库上测试了分块策略。递归 512 token 切分实现了 69% 的准确率。语义分块——听起来更有原则——得了 54%,因为语义算法将文档过度碎片化为平均 43 token 的分块,太窄以至于无法使用。

这是一个一贯的规律。团队倾向于更复杂的方案,因为"语义的"听起来比"递归的"更好。实证结果是,在大多数真实场景中,递归切分配置得当后优于语义切分,因为语义算法优化的是边界优雅度,而不是检索实用性。

任何新 RAG 系统的实践基线:

  • 400–512 token 的递归字符切分
  • 默认 0% 重叠(仅当跨边界查询退化时才添加 10–15%)
  • 至少包含章节标题和文档上下文的元数据增强
  • 对表格和代码块的特定类型处理
  • 在声明索引完成之前在真实查询上进行评估

这不是最有趣的选择集合。但它持续产出有效的系统。只有在测量到基线对你的特定语料库和查询分布不足之后,才向更复杂的方向优化。

构建最佳 RAG 系统的团队不是那些应用最先进技术的团队。他们是积极监测索引流水线、从第一天起就在真实查询上评估、并将索引架构视为拥有自己故障模式的领域——而不是将其当作在有趣工作开始之前运行的已解决问题——的团队。

Let's stay in touch and Follow me for more thoughts and updates