检索与文档智能
检索不是附加在模型上的数据库功能,而是一项证据服务。它有两项职责:先为源材料发布可信的表示,再只返回调用方有权查看的证据。第 44 章 解释检索增强生成(RAG)的原理,第 46 章 解释如何把选中的证据放入模型上下文,本章则把二者变成一套可运营的系统。最终交付的是一项检索发布:带版本的语料库、经过测试的查询路径,以及支持部署或回滚的完整证据 (Lewis et al. 2020)。
先定义契约,再列产品候选。契约应记录语料边界、系统必须回答的查询类型、发布所需的成功证据,以及每项来源的使用权限。还要规定新鲜度与删除服务等级、延迟与成本预算,以及回滚窗口。缺少这些信息,再快的索引或再亮眼的基准分数也没有运营意义。
| 契约字段 | 发布必须回答的问题 |
|---|---|
| 语料边界 | 哪些代码库、格式、语言、日期和源修订版本属于范围内? |
| 查询类型 | 哪些精确查找、释义查询、表格问题、时序问题和无答案情况最重要? |
| 成功证据 | 哪些解析、检索、引用、回答、安全、延迟和成本测试必须通过? |
| 权限 | 每项内容受哪个主体、租户、用途、策略和保留规则约束? |
| 变更 | 新鲜度 SLA 与删除 SLA 分别是什么,在哪里测量? |
| 恢复 | 哪个上一已知正常发布版本仍然可用,回滚如何演练? |
图 86.1 把离线发布路径与经过授权的在线路径分开。评估同时观察两条路径,不能只在生成答案后追加一次最终检查。
保留证据谱系
文档不只是一段字符串。PDF 可能同时包含数字文本层、页面图像、批注、字体、表单字段、标签和隐藏内容,而且这些视图之间可能互相矛盾 (International Organization for Standardization 2020)。在开始任何转换前,先保存原始源对象和内容摘要。字节序列只要发生变化,就创建新的源修订版本。渲染器生成页面渲染结果,解析器生成文档元素,切分器生成分块 ID 和精确的源位置,嵌入模型在指定空间中生成表示,索引快照再把它发布出去。从最终引用必须能够沿这条来源链一路追溯到源对象 (World Wide Web Consortium 2013)。
一条有用的谱系记录至少包括:来源标识、修订版本与摘要;媒体类型与获取时间;租户、访问控制策略、权利与保留状态;渲染版本,以及解析器、Schema、规范化器和切分器的修订版本;页面坐标与阅读顺序;原始文本和规范化文本;父元素与标题路径;以及所有已发布的索引世代。原始证据与规范化检索文本分开保存,这样修改规范化方法时无需改写历史。
以发布流程管理数据摄取
应当像管理发布流水线一样管理数据摄取:
- 获取并授权。 确定来源身份、字节内容、使用权、租户、保留规则和当前访问控制状态。
- 检查。 不依赖文件名,单独验证媒体类型;扫描恶意软件;限制字节数、页数、像素数、压缩包和可执行内容。格式错误、加密、含活动内容或可疑的输入必须拒绝或隔离。
- 规范化并渲染。 保留原始内容,再按明确的页面边界框、旋转角度、坐标原点和单位生成确定性的渲染结果。
- 解析。 数字文本层可靠时直接读取;否则进行 OCR、版面分析、表格和公式识别,并恢复阅读顺序。
- 抽取并验证。 生成文档元素和带证据定位信息的结构化抽取结果。保留不确定性,不得编造值。
- 切分并生成嵌入。 在授权与保留边界内创建检索单元;模型输入超过上限时必须报错,不能悄悄截断。
- 暂存、核对并发布。 核对数量、摘要、遗漏、墓碑标记和覆盖率。以原子方式发布完整世代,否则继续使用上一世代。不得悄悄晋升不完整的输出。
重试必须具备幂等性。工作进程在第 17 页崩溃、同一任务重复交付,或同一个 URI 返回了不同字节时,系统都应核对并创建一致的新修订版本,不能得到一半新、一半旧的索引。
测量文档理解质量
光学字符识别(OCR),也就是光学字符识别,从像素中识别文字。视觉语言模型(VLM),也就是视觉语言模型,同时读取页面图像和文本。这两个术语都不能涵盖所有文档任务:检测版面、恢复阅读顺序、重建表格、识别公式和映射坐标是彼此独立的操作;原生数字文档的文本抽取又是另一项操作。Docling 之类的工具包可以组合其中多项操作,端到端模型则可能直接输出结构化表示 (Auer et al. 2024)。
不存在适用于所有文档的最佳解析器。应建立一份留出语料库,并按故障方式差异明显的文档分层:原生数字页面与扫描页面、多种文字系统、从右向左的文本、旋转页面、低分辨率、多栏版面、表单、表格、公式、手写内容、脱敏区域、隐藏文本和格式错误的文件。OmniDocBench 可以提供背景信息,却不能用公开平均分取代本地的文档分层评估 (Ouyang et al. 2025)。
转写质量可用字符错误率(CER)表示:
其中,、 和 分别是字符替换、删除和插入的数量, 是参考文本的字符总数。CER 不能代替其他质量指标。元素检测的精确率与召回率、阅读顺序错误、表格结构相似度、公式识别、字段级精确率与召回率,以及来源定位准确率,都要分别测量。对于置信度低且影响重大的情况,应安排人工复核,并记录复核比例,不能把它隐藏在一个总分里。
结构化抽取有两类有效性
JSON Schema 可以证明输出的结构和类型符合 Schema,却无法证明内容在语义上正确。发票即使通过 Schema 验证,其中的总金额仍可能是错的。每个字段都应保留证据定位信息和明确的 unknown 状态;证据缺失或含义不明时,抽取器应选择不作答。还要执行领域后置条件,例如小计运算、日期范围、标识符校验和与跨字段一致性。自动重试不能把不确定性变成编造出来的确定性。
视觉检索是一种需要评估的替代方案
文本检索并不是唯一方案。ColPali 一类视觉检索方法对页面图像生成嵌入,并通过后期交互把页面与查询匹配 (Faysse et al. 2025)。它能够保留文本转换时容易丢失的版面信息,对视觉内容丰富或多语言文档也可能更有效。但它同时改变了成本、存储、可访问性、可解释性和生成器要求。
应在同一组带标注查询上比较文本检索、视觉检索和多模态组合。即使解析很少,系统仍需稳定的页面标识、授权、来源信息、可访问文本或等效适配;下游需要字段而不是像素时,也仍要进行结构化抽取。
按检索和引用需求切分文档
检索单元是排序器返回的内容,引用单元是读者能够核验的最小来源区域,两者不必相同。检索器可以先给命题或段落打分,再展开到父元素或章节来补足上下文。每个单元都应保留稳定的分块 ID、父元素、源修订版本与源位置、标题路径、语言、页面与坐标、内容摘要、策略和有效时间区间。
分块大小不存在通用常量。应使用同一查询集比较结构感知元素、固定窗口、句子、命题和父子扩展,并对边界与重叠策略做版本管理。重叠可以保护跨边界证据,却会增加索引体积并产生重复结果。组装上下文时要识别重复内容,同时不能丢掉有用的相互印证。分块不能跨越授权或保留边界。
对在线查询先授权
查询契约包括查询内容、经过验证的主体和租户、已经校验的元数据过滤条件、查询时点、结果与上下文预算、排序策略,以及解析后的索引世代。访问控制是候选资格条件,不是相关性特征。授权必须发生在候选生成之前,并使用当前资源状态。先从全局 top-k 检索再过滤,既可能泄露数据,也可能使授权结果不足额。
对于查询 、主体 、评估时间 和不可变世代 ,授权集合定义为:
其中, 是索引世代 , 是候选项, 是主体 在时间 的策略判断。检索只能从 中返回 top-k。策略元数据缺失或无效时必须关闭访问。错误租户的数据绝不能出现在候选项、重排器输入、调试输出、追踪或缓存中。这是检索系统对 第 56 章 的具体落实。
根据实测效果选择表示方式
不同检索方法采用不同表示,也有不同成本:
- 稀疏检索(例如 BM25)根据分析后的词项打分。对于名称、标识符和罕见词,它是很强的词法基线,但分析器、语言规则、字段权重和参数都属于索引版本的一部分。
- 稠密检索使用双编码器。文档表示可以离线预计算,查询则在线编码。学习到的相似度能够关联释义表达,也可能模糊关键的词法差异 (Karpukhin et al. 2020)。
- 后期交互保留词元级的文档表示,并在查询时合并匹配结果。ColBERT 把它用作第一阶段检索器,而不只是重排器 (Khattab and Zaharia 2020)。
- 交叉编码器联合计算每个查询与文档对的得分。它通常更昂贵,因此一般只应用于受限的候选并集。候选生成遗漏的证据,它无法找回。
这些方法在不同数据集上的排序会变化。BEIR 和 MTEB 适合比较方法和筛选模型,但是否发布仍取决于本地查询分层 (Thakur et al. 2021; Muennighoff et al. 2023)。从词法基线开始,再通过消融实验分别测量每种新增表示方法和重排器。
固定嵌入兼容性契约
嵌入是模型特有的表示,其相似度由训练目标决定。必须记录模型和分词器摘要、嵌入维度、归一化方式、距离度量、查询前缀、文档前缀、截断规则和输入上限。余弦相似度、内积和欧氏距离只有在归一化假设允许时才可以互换。
查询向量和文档向量必须标明同一个嵌入空间修订版本。维度、前缀、归一化方式或空间不匹配时直接拒绝。更换模型通常需要创建新世代并重新生成嵌入;维度相等或模型名称相似都不能证明兼容。即使模型通过 第 82 章 所述的网关提供服务,也要以原子方式切换查询编码器和索引选择。
融合排名,但不要假装分数可比
稀疏、稠密和视觉检索分数通常没有相同的校准尺度。倒数排名融合(RRF)不直接比较这些分数,而是融合名次 (Cormack et al. 2009)。给定排名列表集合 ,定义:
其中, 是候选项, 是第 个排名列表, 是候选项 在该列表中从 1 开始计算的名次, 是列表权重, 是融合常数。某个列表没有返回某个候选项时,该列表的贡献为零。RRF 不会校准相关性分数,也不会使用分数大小。候选深度、权重、融合常数、缺失项处理方式和确定性的并列处理规则都属于排序策略,应该在验证数据上调优,并在留出评估前固定。
下面这段简短实现把这些语义变成可以测试的代码:
def reciprocal_rank_fusion(ranked_lists, k0, weights=None):
"""Return (document, score) pairs in deterministic descending order."""
if k0 <= 0:
raise ValueError("k0 must be positive")
weights = weights or [1.0] * len(ranked_lists)
if len(weights) != len(ranked_lists):
raise ValueError("one weight is required for each ranked list")
scores = {}
for weight, ranked in zip(weights, ranked_lists):
if weight < 0:
raise ValueError("weights must be non-negative")
for rank, document_id in enumerate(dict.fromkeys(ranked), start=1):
scores[document_id] = scores.get(document_id, 0.0) + weight / (k0 + rank)
return sorted(scores.items(), key=lambda item: (-item[1], item[0]))
重排与上下文选择仍是两项独立决定。候选深度、重排深度、最终 top-k 和上下文预算都要分别测量。还要执行重排器的延迟预算和输入上限。最大边际相关性之类的多样性控制可以减少重复上下文,但它需要在相关性与多样性之间做权衡,也不能保证去重。
发布新一代索引
向量索引提供精确或近似邻居检索。生产存储还必须满足索引契约,覆盖持久性、元数据、过滤、数据一致性、备份、恢复、租户隔离和迁移。至少记录:
- 语料水位与来源覆盖率;
- 元数据 Schema、策略字段和过滤选择率分布;
- 分析器、嵌入空间、距离与排序策略修订版本;
- 向量数量、维度、摘要、墓碑标记和重复项策略;
- 索引算法与参数、构建硬件、构建时长和恢复时间;
- 精确检索基线、ANN 召回率、延迟百分位、并发和成本;
- 支持的更新、删除、备份、恢复与回滚行为。
HNSW 是一种基于图的近似邻居索引,其内存、构建、召回率和延迟取舍取决于工作负载 (Malkov and Yashunin 2020)。DiskANN 一类方法通过面向 SSD 的图检索改变资源取舍 (Subramanya et al. 2019)。这两个名称都不能替团队做出存储选择。应在真实的过滤、更新、并发、缓存状态和租户偏斜下,比较精确扫描、HNSW、DiskANN、IVF 或压缩变体。对于每个重要的过滤选择率,都要以精确检索得到的合格 top-k 为基准报告 ANN 召回率。
发布清单不必很长,但必须防止不同版本意外混用:
generation: corpus-2026-08-07-03
source_watermark: "2026-08-07T08:00:00Z"
parser: doc-parser@sha256:...
segmenter: headings-v4
embedding_space: embed-model-v7-d1024-cosine
ranking_policy: hybrid-rrf-rerank-v5
policy_schema: acl-v3
deletion_watermark: "2026-08-07T08:05:00Z"
把新的不可变世代构建成影子索引。完成回填,核对来源数量、摘要和墓碑标记,再把变更追到明确水位。先运行影子查询,再对新旧世代进行双读;按查询类型比较质量、授权、新鲜度、延迟和成本。原子路由切换必须同时移动查询编码器和索引,并在回滚窗口内保留上一已知正常世代。不得使用来自不兼容新嵌入空间的向量查询旧索引。
新鲜度与删除必须覆盖每一份副本
新鲜度 SLA 从源变更提交时开始,到变更出现在合格结果中结束;删除 SLA 从撤销权限开始,到所有结果中都不再出现该内容为止。删除操作会创建墓碑标记,并传播到向量索引、词法索引、重排器和答案缓存、已发布快照、副本,以及迁移中的每个世代。逻辑屏蔽应尽快生效,物理清除则按声明的保留流程执行。缓存键必须包含租户、策略版本、索引世代和查询时点。陈旧结果需要明确标记,不能以回退为名悄悄扩大范围。
测试内容插入、更新、ACL 变化、来源删除、回填中断、重复重放、部分索引故障、快照损坏和回滚。必须证明已删除文档不能从缓存、旧快照或影子索引重新出现。
返回证据,而不是没有来源的文本
检索响应是一份证据包。每个条目都包含不可变的证据 ID;源对象、源修订版本、摘要、源位置或页面坐标;索引和排序修订版本;各阶段排名;采用的策略和时间;以及截断、结果不足、超时、陈旧结果和回退标记。把不同类型的分数保留为不同类型,不能把它们伪装成一个已经校准的概率。
每项重要结论都要绑定一个或多个检索到的证据 ID。测量引用精确率(引用证据是否支持对应结论)、引用召回率(有证据支持的结论是否都带引用)、定位有效性、蕴含或矛盾,以及答案正确性 (Gao et al. 2023)。模型生成的引用如果不在证据包中,一律无效。渲染已保存答案时要重新授权相关证据,因为曾经有效的来源可能已经撤销。
检索到的文档不受信任
文本、元数据、OCR 输出、图像文字和批注都属于不受信任的数据。检索页面中的间接提示注入只是内容,不是系统策略 (Greshake et al. 2023)。它不能授予权限、变成工具指令、更改租户、关闭引用,也不能要求数据外泄。指令和证据应使用不同通道,只允许预先批准的工具操作,验证参数,并在每项外部副作用发生前再次授权。
还要测试受污染的语料库:攻击者可能插入看似相关的分块,操纵答案或引用 (Zou et al. 2025)。限制摄取权限,记录来源可信度和谱系,审查异常的来源或排名变化,并保留干净的回滚世代。内容扫描器可以提供帮助,但核心保护仍然是检索文本本身没有任何权限。
按层级和故障模式评估
一个端到端分数无法说明证据在哪一层丢失。每一层都保留一个理想基准,并把部署阶段的结果与它比较。
| 层级 | 发布所需证据 |
|---|---|
| 解析质量 | CER、元素检测、阅读顺序、表格结构、公式和字段级准确率,以及谱系有效性 |
| 候选检索 | Recall@k、nDCG@k、MRR、带过滤召回率、精确检索对照和结果不足率 |
| 融合与重排 | 重排前的候选召回率、重排后的 nDCG、截断、多样性和确定性回退 |
| 上下文与回答 | 答案正确性、忠实度、引用精确率与召回率、矛盾和拒答校准 |
| 系统 | 未授权暴露为零、新鲜度与删除 SLA、p95 延迟、可用性和每个合格答案的成本 |
应按文档族划分数据,而不是把同源分块随机分入训练集和测试集。测试集应包括精确标识符、释义表达、否定、多语言问题、表格、时序问题、歧义实体、多跳证据、困难负样本和无答案情况。模型裁判需要使用稳定的人工复核样本校准;RAGAs 等框架可以帮助自动测量,却不能替产品规定阈值 (Es et al. 2024)。
验收套件必须覆盖负面情况:错误租户、已删除文档、陈旧修订版本、受污染分块、格式错误的表格、空检索结果、重复分块、选择性过滤导致结果不足、重排器超时、索引故障和无答案行为。每种相关故障都要演练降级策略和回滚。系统中断时,可以按照已命名的策略降低排序质量,但不得削弱授权或捏造证据。
运营发布生命周期
- 固定契约。 记录语料、查询类型、策略、服务等级、指标、阈值、延迟与成本预算,以及回滚条件。
- 构建带标注语料库。 按文档、查询、相关性判断、引用、安全情况和预期拒答分层。
- 建立词法基线。 在引入嵌入和 ANN 的复杂性之前,先暴露语料与标注问题。
- 评估候选方案。 以受控消融实验比较解析、切分、稀疏检索、稠密检索、视觉检索、融合、重排和上下文策略。
- 构建并核对。 只有带清单、谱系、策略和完整墓碑标记覆盖的不可变世代才能发布。
- 影子运行。 重放形态接近生产的查询,但不向用户返回结果。
- 金丝雀发布。 只路由一小部分已授权群组,监控质量、泄露、新鲜度、延迟、成本和回退。
- 晋升或回滚。 以原子方式切换,并保留和演练上一已知正常世代。
- 监控漂移。 按分层抽样查询和文档,调查变化并保存决定轨迹,默认不得记录敏感内容。
- 重新验证。 解析器、切分器、嵌入空间、分析器、索引、重排器、策略 Schema、语料边界或工作负载发生重大变化时,都触发重新验证。
最终产物是一份检索发布记录:不可变清单、评估结果、安全与故障证据、新鲜度与删除测量、金丝雀决定、负责人、审批、回滚目标和重新验证触发条件。这份记录是交给生成器或智能体团队的交接物,也是 第 87 章 中更广泛评估工作的输入。
下层会限制上面的每一层:缺失的证据无法由重排器找回,未经授权的证据无法靠提示词变得安全,不兼容的索引也无法由网关路由修复。第 85 章 中的智能体会放大检索调用次数,因此质量、授权、延迟和成本既要在每次调用上成立,也要在完整任务上成立。完整系统的接线方式见 第 88 章。
团队往往还没有代表性语料库或精确检索基线,就先争论产品。顺序应该反过来。只有当存储、解析器、嵌入模型或重排器的完整发布记录满足本地契约时,它才是可接受的选择。不存在站得住脚的通用分块大小、候选深度、融合常数、向量数量门槛或产品默认值。
延伸阅读
- Lewis et al., “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,” 2020. proceedings.neurips.cc该论文提出用于知识密集型任务的检索增强生成方法,将学习得到的检索器与序列生成器结合。
- Auer et al., “Docling Technical Report,” 2024. arXiv:2408.09869该文介绍了一个开放的文档转换工具包,以及它表示页面布局、表格、文本和来源信息的方式。
- Ouyang et al., “OmniDocBench: Benchmarking Diverse PDF Document Parsing with Comprehensive Annotations,” 2025. openaccess.thecvf.com该研究提供了一套文档解析基准,包含文本、布局、表格、公式和阅读顺序的标注与指标。
- Faysse et al., “ColPali: Efficient Document Retrieval with Vision Language Models” (免解析的视觉文档检索:页面图像上的后期交互嵌入;ICLR 2025), 2025. proceedings.iclr.cc该方法把后期交互的视觉语言表示直接用于页面图像检索。
- Karpukhin et al., “Dense Passage Retrieval for Open-Domain Question Answering,” 2020. aclanthology.org该研究展示了一种用于开放域问答的双编码器密集检索器。
- Khattab & Zaharia, “ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT,” 2020. arXiv:2004.12832ColBERT 把查询与文档交互推迟到上下文词元嵌入上的 MaxSim 阶段,以更大的索引换取更细粒度的匹配。
- Thakur et al., “BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models,” 2021. datasets-benchmarks-proceedings.neurips.ccBEIR 在异构检索数据集上比较词法、稀疏、稠密、后期交互与重排系统,揭示明显的领域相关权衡。
- Muennighoff et al., “MTEB: Massive Text Embedding Benchmark,” 2023. aclanthology.org该论文定义了一套跨任务、跨数据集比较文本嵌入的综合基准。
- Cormack et al., “Reciprocal Rank Fusion Outperforms Condorcet and Individual Rank Learning Methods,” 2009. research.googleRRF 给出一种只依赖名次的简单融合规则,并在 TREC 与 LETOR 排名上进行评测。
- Malkov & Yashunin, “Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs,” 2020. arXiv:1603.09320该论文提出了许多近似最近邻索引采用的分层邻近图。
- Subramanya et al., “DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node,” 2019. proceedings.neurips.cc该论文介绍了一种感知 SSD 的图索引,用于十亿级数据点的高召回最近邻搜索。
- Gao et al., “Enabling Large Language Models to Generate Text with Citations,” 2023. aclanthology.org该研究考察了基于检索资料生成的回答中,引用是否正确、是否完整。
- Es et al., “RAGAs: Automated Evaluation of Retrieval Augmented Generation,” 2024. aclanthology.org该文提出了一组无需参考答案即可评估检索增强生成流水线的指标。
- Greshake et al., “Not What You've Signed Up For: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection” (间接/跨域提示注入的奠基之作), 2023. arXiv:2302.12173间接提示注入把对抗性指令放进第三方数据,等待集成大模型的应用检索,从而暴露数据与工具控制风险。
- Zou et al., “PoisonedRAG: Knowledge Corruption Attacks to Retrieval-Augmented Generation of Large Language Models,” 2025. usenix.org该研究考察了向检索增强生成语料库插入恶意文档的定向知识污染攻击。
评论
登录后评论