L大语言模型从理论到实践
阅读 PDF ↗
CHAPTER 13

检索增强生成

检索系统找到相关材料之后,问题并没有结束。材料可能重复、过期、缺少例外条款,或者只支持答案的一部分;生成器也可能忽略关键限定,把相似内容拼成错误结论。一个完整的 RAG 系统必须解释证据如何进入生成、每条声明由什么支持,以及知识更新和权限变化后哪些结果仍然有效。

第12章《信息检索》讨论索引、词法与向量检索的基础。本章承接候选召回,进一步建立重排、证据选择、生成与知识服务的关系。书中使用的性能和质量数例均为构造输入上的计算,不是任何产品或部署的实测结果。

13.1检索增强的概率含义

检索作为潜变量

检索增强生成(Retrieval-Augmented Generation,RAG)利用外部材料改变生成条件。原始 RAG 将检索文档看作潜变量(Latent Variable),结合检索分布与条件生成模型,而不只是把搜索结果放进提示词。(Lewis 等 2020)

概率模型与服务边界

给定查询 \(q\) 和固定知识快照 \(\mathcal D\),检索对象 \(z\) 为文档或片段,答案 \(y=(y_1,\ldots,y_T)\) 为有限词元序列。概率模型中的文档分布已归一化。实际系统中,知识范围还受身份、权限和时间条件约束;所有生成器可见的证据必须先满足这些外部约束。检索分数、重排分数与答案正确概率不得未经校准混用。

本章主要符号见表13.1

表 13.2 检索增强生成的主要符号与形状。

符号 含义与形状
符号 含义与形状(续)
续下页
\(p_\eta(z\mid q),p_\theta(y\mid q,z)\) 参数为 \(\eta\) 的检索分布和参数为 \(\theta\) 的条件生成分布。
\(\mathcal C_K,E\) 召回的 \(K\) 个候选与最终有序证据包。
\(f_\eta(q),g_\eta(d)\in\mathbb R^h\) 查询与文档的 \(h\) 维稠密表示。
\(s_i,\gamma_i,l_i\) 候选分数、给定答案后的文档后验责任、证据序列化词元成本。
\(u_i\in\{0,1\},C_E\) 证据选择变量与证据词元预算。
\(A_{ji}\) 证据 \(i\) 是否覆盖问题要点 \(j\) 的指示量。
\(I,P,v\) 已认证身份、当前权限策略、知识或组件版本。

对整条回答共享一个潜在文档,序列级 RAG(RAG-Sequence)写为

\[ p_{\mathrm{seq}}(y\mid q) =\sum_{z\in\mathcal D}p_\eta(z\mid q) \prod_{t=1}^{T}p_\theta(y_t\mid q,z,y_{<t}). \tag{13.1}\]

先在每个文档条件下计算整条答案概率,再对文档求和。对每个词元分别边缘化,词元级 RAG(RAG-Token)则为

\[ p_{\mathrm{token}}(y\mid q) =\prod_{t=1}^{T}\sum_{z\in\mathcal D}p_\eta(z\mid q) p_\theta(y_t\mid q,z,y_{<t}). \tag{13.2}\]

求和与乘积位置不同,意味着模型假设不同:后者允许不同生成位置由不同文档项支持。这里的词元级潜变量边缘化不等于服务端每生成一个词元都必须重新调用搜索引擎。

大语料无法直接遍历全部文档,通常只计算候选集 \(\mathcal C_K\)。如果保留原完整分布的概率,截断求和是一种近似,其总质量可能小于1;如果在候选集重新归一化,定义的是条件于候选集合的分布。记原候选质量为 \(Z_K=\sum_{z\in\mathcal C_K}p_\eta(z\mid q)\),则局部归一化使用 \(\widetilde p_\eta=\frac{p_\eta}{Z_K}\)。两种口径不能在训练与解释时无说明地互换。

设两个候选文档权重为 \((0.6,0.4)\),目标答案由两个词元组成。第一文档对两个词元的条件概率分别为0.9和0.2,第二文档分别为0.1和0.8;第二个概率均已条件于相同的目标前缀。序列级概率为

\[ p_{\mathrm{seq}}=0.6(0.9\cdot0.2)+0.4(0.1\cdot0.8)=0.14. \tag{13.3}\]

词元级概率则为

\[ p_{\mathrm{token}}=(0.6\cdot0.9+0.4\cdot0.1) (0.6\cdot0.2+0.4\cdot0.8)=0.2552. \tag{13.4}\]

差异来自第二个模型可以在不同位置混合文档贡献,不是计算误差。两个数值都描述设定模型对给定词元序列的概率,不能直接解释为答案事实正确率。

序列级模型还可推导检索训练信号。令 \(a_i=p_\theta(y\mid q,z_i)\)\(p_i=\softmax(s)_i\)\(Z=\sum_i p_i a_i\)。给定答案后的文档后验为

\[ \gamma_i=\frac{p_i a_i}{Z}. \tag{13.5}\]

利用 softmax 导数 \(\frac{\partial p_i}{\partial s_j}=p_i(\mathbf1[i=j]-p_j)\)

\begin{align} \frac{\partial Z}{\partial s_j}&=p_ja_j-p_jZ,\tag{13.6}\\ \frac{\partial(-\log Z)}{\partial s_j}&=p_j-\gamma_j. \tag{13.7}\end{align}

例题中 \(\gamma_1=\frac{0.108}{0.14}=\frac{27}{35}\approx0.7714\)\(\gamma_2\approx0.2286\)。第一文档的梯度约为 \(-0.1714\),梯度下降会提高其检索分数。这个信号奖励能解释训练答案的候选,不自动保证文档真实或其引用充分;候选集合之外的文档也不会在该局部计算中得到直接信号。

检索上下文组装

常见服务先选择并序列化证据包 \(E=\mathcal A(q,\mathcal C_K)\),再调用

\[ p_\theta(y\mid q,\operatorname{serialize}(E)). \tag{13.8}\]

这允许生成器同时阅读多个片段并综合条件,却没有显式计算式(13.1)中的文档概率边缘化。重排分数只决定排序或选择,除非目标另行定义,并不会自动成为生成概率中的混合权重。

证据拼接具有明确的工程可控性:可以带上来源、时间、权限与引用标识,也容易替换检索器。但生成器的注意力分配并不等同于已知的证据后验。某文档排在首位或被注意力关注,不能直接证明最终声明由它支持。1

13.2召回、重排及训练关系

多路检索的目标

稀疏检索(Sparse Retrieval)通过词项维度匹配材料,BM25 使用词频饱和、逆文档频率和长度校正;稠密检索(Dense Retrieval)通过学习表示的相似度选择材料。基础公式见前章。本章关注它们在管线中的不同职责:词法路径保留编号、专名和少见术语的精确线索,语义路径连接不同表达,均不能保证命中答案所需的全部限定。

稠密双编码器常使用 \(s(q,d)=f_\eta(q)^\mathsf T g_\eta(d)\)。对正例 \(d^+\) 与候选负例集 \(\mathcal N\),一种训练目标为

\[ \mathcal L_{\mathrm{ret}}=-\log \frac{e^{\frac{s(q,d^+)}{\tau_r}}} {e^{\frac{s(q,d^+)}{\tau_r}}+\sum_{d^-\in\mathcal N}e^{\frac{s(q,d^-)}{\tau_r}}}, \tag{13.9}\]

其中 \(\tau_r>0\) 是排序温度。它使正例相对负例更靠前;负例采样和潜在假负例会改变学习信号。DPR 是采用双编码器进行段落检索的重要实例。(Karpukhin 等 2020) 这一相对训练目标仍不提供跨任意问题通用的事实正确概率。

混合检索(Hybrid Retrieval)将多路候选取并集,再做融合。若使用分数线性组合 \(s_h=\alpha\widetilde s_{\mathrm{lex}}+(1-\alpha)\widetilde s_{\mathrm{dense}}\),应先定义两路尺度校准;原始 BM25 与余弦分数直接相加通常缺少稳定解释。也可按名次融合,例如 \(s_h(d)=\sum_j\frac{1}{c+\operatorname{rank}_j(d)}\),其中 \(c>0\) 平滑名次影响,未召回项不贡献分数。此类融合得到排序量,不是经过概率归一化的证据置信度。

并集召回提高候选覆盖的可能性,也会增加重复、噪声和后续重排成本。只有被所有查询路径统一授权的候选才能进入并集,不能让某条备用路径绕过身份过滤。

联合编码重排

重排(Re-ranking)在较小候选集上计算更精细的查询与文档关系。交叉编码器(Cross-encoder)共同编码查询和候选内容,可以直接比较限定条件、否定关系和实体对应,通常比独立向量内积具有更强的交互能力,但每个查询文档对都需执行模型。使用 BERT 进行段落重排的工作展示了这一模式。(Nogueira 和 Cho 2019)

若候选得分为 \(a_i=r_\phi(q,d_i)\),成对目标可写为

\[ \mathcal L_{\mathrm{pair}}=-\log\sigma(a_+-a_-). \tag{13.10}\]

其对正例分数的导数为 \(-\sigma(a_--a_+)\),对负例为相反数,促使正例相对提升。若有多个相关候选,列表目标可用标签分布 \(t_i\) 对 softmax 分数做交叉熵:

\[ \mathcal L_{\mathrm{list}}=-\sum_i t_i\log\frac{e^{a_i}}{\sum_j e^{a_j}}. \tag{13.11}\]

成对和列表目标都必须明确相关性含义。与问题主题相似、包含某个答案词、足以支持结论,分别对应不同标签。训练只标注主题相关性,部署却要求证据充分性,会形成目标错位。

重排只能调整已进入候选集的对象,无法恢复完全漏召回的事实。候选文本截断还可能丢失例外条款,使重排器看见的内容与生成器最终读取的材料不同。因此重排输入范围和证据正文范围应可追踪,不能只保存一个浮点分数。

检索模型训练

嵌入模型优化召回,重排器优化候选顺序,生成器优化在证据条件下回答。三者可以分别训练,也可让后者提供监督,但训练依赖必须明确。式(13.7)提供一种答案似然到候选分数的信号;离散近邻搜索的候选成员变化并不能由普通反向传播完整穿过,因此“联合训练”仍可能采用固定候选、近似梯度或交替刷新索引。

文档编码器更新后,旧向量索引通常不再与查询向量同属一致表示空间,必须重建或采用明确的过渡策略。只更新查询侧、冻结文档编码器可以降低刷新成本,但限制了可调整范围。重排或生成模型升级也可能改变证据选择和引用行为,即使文档索引未变仍需独立比较。

生成器训练需要包含充分证据、缺失证据和冲突证据,而不是所有样本都提供完美材料。否则训练目标鼓励始终作答,部署拒答就只能依赖脆弱的提示。用模型自身答案生成检索监督还可能强化既有错误,教师或生成分数应视为弱监督并保留独立证据标注。

13.3证据预算及选择

有效长度约束

证据组装(Evidence Assembly)把候选变成可被生成器读取的有序材料。总上下文容量 \(C_{\mathrm{ctx}}\) 应满足

\[ C_E\leq C_{\mathrm{ctx}}-C_{\mathrm{sys}}-C_q-C_{\mathrm{hist}}-C_{\mathrm{out}}-C_{\mathrm{reserve}}. \tag{13.12}\]

各项分别是系统模板、问题、对话历史、输出与保留余量。证据成本 \(l_i\) 必须按实际分词器和序列化格式计算,包含标题、来源与引用标识,而不只是正文字符数。预算为负时应调整上下文策略,不能静默裁掉必要约束。

选择变量 \(u_i\in\{0,1\}\) 满足 \(\sum_i u_il_i\leq C_E\)。只最大化 \(\sum_i u_i s_i\) 是带预算的相关性选择,但不能自动保证多要点覆盖或去重。若问题被分为要点 \(j\),覆盖指示为 \(A_{ji}\),可定义

\[ F(S)=\sum_j w_j\min\left(1,\sum_{i\in S}A_{ji}\right) -\lambda\sum_{i<k,\ i,k\in S}r_{ik}, \tag{13.13}\]

其中 \(r_{ik}\geq0\) 衡量重复,\(w_j\) 表示要点权重。覆盖部分具有重复收益递减的性质;加入任意重复惩罚后,整体未必单调,简单贪心的最优性保证也需重新判断。

来源权限、有效日期和必要限定通常应作为约束,而不是用一个小罚分抵消。例如证据只在某版本产品下适用,就不能因相关性高而压过版本不符。多个来源互相转述也不一定提供独立佐证,来源多样性应追踪原始出处。

设总上下文为1024词元,系统模板180、问题80、历史160、输出240、余量44,可用证据预算为320。查询需要三个要点:A为适用条件,B为例外情况,C为生效日期。候选如下,长度已包含引用元数据。

片段 长度 重排分数 支持要点
\(d_1\) 220 0.95 A
\(d_2\) 180 0.85 A、B
\(d_3\) 120 0.75 C
\(d_4\) 100 0.70 B

顺序装入最高分 \(d_1\) 后只剩100词元,可以装入 \(d_4\),用满320却缺少C。选择 \(d_2,d_3\) 只用300词元,覆盖全部三个要点。即使采用分数总和,前一方案为1.65、后一方案为1.60,仍会偏向不完整的证据包。检索分数之和因此不能替代任务覆盖目标。

如果 \(d_2\) 的例外条款依赖前一段定义,应把必要上下文的额外成本纳入 \(l_2\),重新选择,而不是截断后仍声称覆盖B。若C的来源已过期,则两个方案都可能不足;预算优化只能在有效证据中选择,不能创造缺失事实。

压缩、排序及引用锚点

证据过长时,可以提取相关句段或生成摘要。上下文压缩(Context Compression)应保留数值、否定、范围与例外;生成摘要可能加入原文不存在的连接推断,因此摘要仍需映射回原始片段。引用不应只指向一个不可复原的摘要缓存。

排序影响模型读取,但不是数学上的事实优先级。可按子问题组织证据,把一般规则与例外相邻放置,并标明来源日期和适用条件。重复块可合并展示,同时保留全部来源映射;多块共享同一引用标识会使声明定位模糊。证据 ID 应稳定指向文档版本及局部位置,而不能只使用随排序变化的“第3条”。

13.4查询变换及检索控制

(选修)

查询改写约束

查询改写(Query Rewriting)把用户措辞转换为更适合检索的表达,例如补齐多轮对话中的指代、展开缩略语、产生同义表达。改写器可由规则或语言模型实现,也可根据后续阅读器的反馈训练(Ma 等 2023)。但是,检索友好性不等于语义等价性。把“去年生效的规则”改写为“最新规则”,会提高某些文本的相关分数,却改变问题的时间边界。

因此,查询状态至少分为原始问题、可变的检索表达与不可由模型修改的约束。用户身份、租户、授权范围、时间口径、已明确的实体标识和输出语言应由控制平面保存;每次改写只生成候选表达,不覆盖原始请求。若对话指代仍有歧义,系统可以并行检索明确列出的候选实体,或要求澄清。把不确定指代强行绑定到最高频实体,会使后续全部证据看似一致而实际答非所问。

设原始问题为 \(q\),固定约束为 \(b\),第 \(j\) 个检索表达为 \(q^{(j)}=g_j(q,b)\)。多路检索取得

\[ \mathcal C=\bigcup_j\operatorname{Retrieve}(q^{(j)};\mathcal D_{I,P},b), \tag{13.14}\]

其中 \(\mathcal D_{I,P}\) 是当前身份和策略允许读取的语料。合并后按文档版本及片段位置去重,再使用原始问题和约束重排。这样可以避免改写器生成的一条宽泛查询主导最终答案,也使“某个候选来自哪条改写”成为可审计信息。

分解及结构化知识

查询分解(Query Decomposition)把复合问题拆为若干子问题。独立子问题可以并行;存在实体或时间依赖的子问题则应构成有向无环图。例如“某项目负责人管理的服务在上月发生了几次故障”,应先确定指定时点的负责人和服务范围,再查询相同时间窗口内的故障记录。只按句号拆分不能保证依赖正确,现任负责人也不能自动代表上月负责人。

结构化数据适合精确筛选、连接与聚合,文本适合解释规则与例外。系统可以把问题映射为受约束的查询计划,但字段、连接路径、读写权限、扫描范围和结果上限由执行层校验。模型提出的查询不是数据库授权。聚合结果应附带查询口径、数据快照、过滤条件和可追溯的来源记录范围;“总数为0”“没有匹配数据”和“权限不足,无法查询”必须使用不同状态,不能都被生成器解释成零。

图结构知识同样需要语义约束。两条边共享实体不意味着关系可传递;路径检索所得事实必须保留边类型、方向、有效时间与来源。把图路径和表格结果转换为统一证据对象,有助于生成器跨来源组织回答;这种统一不应抹去原来的精确查询条件。

线性、条件、分支及迭代流程

线性流程按改写、检索、重排、组装、生成依次运行,适用于证据需求已知的问题。条件流程在确定性信息充分时选择不同路径,例如精确文档 ID 走版本读取,统计问题走结构化查询,解释性问题走文本检索。路由器的错误率本身需要评估;不能把所有端到端失败都归因于检索器。

分支流程同时调用不同检索通道,随后融合。设分支耗时为 \(t_1,\ldots,t_J\),在资源充足且没有排队竞争的理想条件下,等待全部分支的耗时约为 \(\max_jt_j+t_{\mathrm{merge}}\),而调用成本仍接近各分支成本之和。超时返回部分结果时,必须把缺失通道记录为未完成,不能把它当成“该通道没有证据”。

迭代检索(Iterative Retrieval)根据当前证据缺口提出新查询。主动检索研究还探讨在生成过程中触发额外检索(Jiang 等 2023)。这里需要区分词元低概率和事实缺失:罕见专有名词可能概率低但证据充分;常见却错误的说法也可能概率高。触发信号可以辅助决策,不能充当事实正确性证明。

\(E_t\) 为第 \(t\) 轮有效证据,\(U_t\) 为尚未解决的事实需求集合,则一种明确的状态转移为

\begin{align} q_{t+1}&=\operatorname{Rewrite}(q,b,E_t,U_t),\tag{13.15}\\ E_{t+1}&=\operatorname{Select}\bigl(E_t\cup\operatorname{Retrieve}(q_{t+1}),C_E\bigr),\tag{13.16}\\ U_{t+1}&=\operatorname{Assess}(q,b,E_{t+1}). \tag{13.17}\end{align}

式中的检索与选择均隐含授权和版本检查。需求评估可以由规则与模型共同完成,但必须保留不确定状态。停止条件至少包括证据已足够、连续一轮没有新增有效证据、迭代次数达到上限、词元预算耗尽和截止时间到达。终止后未解决的问题应进入有限回答或拒答路径,而不是因为“轮数已经用完”变成确定结论。

受约束的检索生成流程。迭代补充的是证据;身份、时间范围和资源上限由外部控制层保持。
图 13.1 受约束的检索生成流程。迭代补充的是证据;身份、时间范围和资源上限由外部控制层保持。

算法13.1 有界证据检索与回答

  1. 接收问题 \(q\)、身份 \(I\)、固定约束 \(b\) 与截止时间;取得语料快照和当前授权策略。初始化证据 \(E=\varnothing\),未解决需求 \(U\)

  2. 在轮数、调用量、词元与时间均未超限时,依据 \(q,b,U\) 生成检索计划;校验计划只包含允许的数据源和只读操作。

  3. 并行执行可独立的分支,区分成功为空、失败和超时。合并候选,检查当前权限、来源版本与有效时间,记录各分支来源。

  4. 用原始问题重排候选;在实际序列化词元预算内选择证据,保留定义、例外与引用锚点。更新 \(U\)

  5. 若证据充分则结束检索;若没有新增有效证据或预算耗尽则保留未解决状态并结束;否则继续针对缺口检索。

  6. 根据证据生成有限范围的回答,把声明映射至来源。检查引用解析、语义支持和冲突;失败声明删除、限定或转为拒答。

  7. 输出前再次检查访问权限,返回答案状态、来源版本、未解决事项和运行清单。权限撤销使相应证据失效时,不返回依赖它的答案。

13.5引用、冲突及拒答

声明证据映射

证据忠实度(Evidence Faithfulness)衡量回答声明是否受到给定证据支持。它不同于答案在外部世界中是否正确:模型可能凭参数记忆答对,却引用了不相关段落;也可能忠实复述一份已经过期的文件。因此,引用评估必须与答案正确性分别进行,相关研究也把引用质量作为独立评价维度(Gao 等 2023)

设答案包含可验证声明 \(c_1,\ldots,c_M\),来源集合为 \(E\)。引用关系 \(J\subseteq\{1,\ldots,M\}\times E\) 不只是格式标记,还应附带支持、矛盾或证据不足的判定。检查分为三层:引用标识是否属于本次证据包;标识是否仍能解析到指定版本及片段;该片段或明确组合的片段是否支持声明。仅验证第一层可以阻止虚构 ID,却不能阻止使用真实 ID 进行错误归因。

一句话可能同时包含一般规则、时间条件与例外,应按可独立核实的主张划分,而非机械按标点切分。跨文档推导需标明各来源承担的前提;计算结论需保留输入数值、单位和计算规则。来源提到“多数情况适用”不能支持“所有情况适用”,来源写“建议”也不能支持“必须”。自动蕴含判别可作为检查器,但其输出依然需要在领域样本上校准,不能把另一个模型的判断当作形式证明。

新鲜度及冲突的处理顺序

数据新鲜度(Data Freshness)描述服务使用的数据与所需时间状态之间的差距。抓取时间、发布日期和生效时间是不同字段。今天重新抓取的旧文件,不会因此成为新规则;下月才生效的文件,也不能直接用于回答今天的状态。

处理冲突时,先确认实体、辖域、版本、有效时间和适用对象是否一致;若适用条件不同,应分别回答。只有条件相同而结论不一致时,才属于待解决的实质冲突。来源权威性也应由领域规则确定,不能从文风或搜索名次推断。无法确定替代关系时,应并列说明冲突及来源时间,并收缩结论范围。

例如,以下是为分析构造的虚拟制度:版本v1规定普通批处理任务上限30分钟,版本v2自某日开始调整为45分钟;同时存在“维护窗口内上限10分钟”的特殊条款。问普通工作日的当前限制,应核对v2是否已生效;问维护窗口,须保留10分钟例外;问历史日期,则可能仍使用v1。把三条证据合并成“上限平均为28.3分钟”没有语义依据。若维护窗口的适用范围缺失,回答应明确这一缺口,而不能选取分数最高的45分钟。

选择性回答的决策条件

拒答(Abstention)是证据不足时的一种合法输出状态,包括完全拒答和只回答已证实部分。它不同于访问拒绝、服务异常或问题超出支持范围,后者需要分别记录,避免质量指标掩盖系统故障。

可以通过一个简化决策模型说明阈值的来源。设 \(p\) 是在当前证据条件下某一拟答结论正确且适用的校准概率,答错成本为 \(C_w\),拒答成本为 \(C_r\),答对成本为0,且 \(0<C_r<C_w\)。回答与拒答的期望成本分别为

\[ R_{\mathrm{answer}}=(1-p)C_w,\qquad R_{\mathrm{abstain}}=C_r. \tag{13.18}\]

选择回答的条件为

\[ (1-p)C_w\le C_r \quad\Longleftrightarrow\quad p\ge1-\frac{C_r}{C_w}. \tag{13.19}\]

例如 \(C_w=20,C_r=1\) 时,阈值为0.95。这个数值是给定成本模型的推论,不是通用 RAG 参数。真实系统还可能区分不同错误类型以及部分回答的成本。尤其不能把 BM25 分数、向量内积或语言模型最大词元概率直接代入 \(p\);这些量没有自动获得所需的概率语义。

阈值应在与目标分布相符的开发集上选择,报告回答覆盖率和已回答问题的错误率,并单独分析知识库不可回答的问题。若只奖励拒答准确率,系统可能拒绝所有问题;若只奖励已回答准确率,也可能通过少答取得表面提升。可用性与错误风险应同时呈现。

13.6知识服务的数据及执行契约

离线知识管线

完整服务首先需要可追溯的知识摄取流程:从授权来源取得原始文件及版本,解析为段落、表格和结构块,保存来源位置,按语义关系切分,计算检索表示,构建索引,最后发布可查询快照。解析与切分会改变信息可见性,必须保留原始文件到片段的映射。表头、单位、脚注与跨页续表若被丢弃,即使后续向量检索完全准确,也无法恢复正确语义。

数据契约(Data Contract)规定各阶段对字段、版本和失败状态的共同解释。文档对象至少包含稳定文档 ID、源版本、内容哈希、来源位置、有效时间、观测时间、授权标签和删除状态;片段额外包含父文档版本、局部位置、解析器与切分规则版本。嵌入记录还要包含模型和预处理版本。向量维度相同并不表示表示空间相容,因此模型升级不能仅检查维数后混用旧向量。

快照清单(Snapshot Manifest)记录一次发布使用的文档集合、索引分片、解析和嵌入版本,以及构建完成状态。新快照在暂存区完成后再切换查询指针,使一次查询使用可解释的版本组合。若数据量要求增量发布,也应显式定义可见水位及各分片版本,不能把“最终会同步”表述为当前强一致。

知识发布与在线读取的关系。内容快照保证可复现性,权限撤销仍须及时作用于在线访问。
图 13.2 知识发布与在线读取的关系。内容快照保证可复现性,权限撤销仍须及时作用于在线访问。

增量更新及故障恢复

知识摄取常由变更数据捕获(Change Data Capture,CDC)或周期扫描驱动。系统应假定事件可能重复、乱序或暂时丢失,并使用源版本与操作类型构造幂等键。重复处理同一版本不应生成新的逻辑片段;较旧更新也不应覆盖较新的删除标记。没有全局递增版本的来源,可使用来源提供的条件读取与内容哈希,并明确它只能判断哪些一致性关系。

解析失败应保留原始对象和错误原因,便于使用修复后的解析器重放。嵌入失败可以重试该版本的片段;索引写入部分成功时,发布状态不能提前宣称整份文档完成。重试次数耗尽的对象进入待修复队列,并纳入覆盖率和新鲜度报告。将失败文件悄悄丢弃,会使回答系统把摄取故障误认为知识不存在。

删除必须传播到片段、索引、摘要、引用解析服务和答案缓存。逻辑删除标记可先阻止在线读取,后台再回收物理数据;权限撤销则应优先改变访问判定,不等待所有索引副本重建。历史审计需要保留什么数据、保留多久,由独立的数据治理规则决定,不能用“为了可复现”无限保存已经不应保留的内容。

在线对象及失败状态

13.2列出模块之间需要交换的核心对象。分数、文本与来源必须一起传递;只返回字符串列表,会丢失授权、版本和重试语义。

表 13.1 知识服务的最小逻辑数据契约。具体编码形式可变,字段语义应保持稳定。

对象 关键字段及含义
查询请求 原始问题、身份、租户、时间口径、截止时间、允许的数据源与输出约束
候选证据 文档及片段 ID、源版本、通道及原始分数、位置、授权标签、有效时间
证据包 已选择的原文、引用锚点、序列化词元数、覆盖需求、未解决冲突、快照 ID
回答对象 回答状态、文本、声明到来源映射、未解决需求、访问和引用检查结果
运行清单 各模型与提示版本、检索参数、快照、分支状态、耗时、预算消耗和错误码

在线状态应区分无相关候选、证据不足、来源冲突、无权限、上游不可用、预算耗尽和正常完成。某个非必要分支失败时可以在限定范围内继续;必要证据源不可用时,应返回降级状态,而非伪装成完整答案。生成阶段重试可复用同一证据快照,但需要再次读取当前权限。取消请求后,也应取消尚未执行的分支,避免孤立的检索与模型调用继续消耗资源。

流式输出会使检查更困难:一旦错误声明已经发给用户,后台撤回并不等价于从未发布。对需要强引用约束的答案,可先生成并检查声明片段再发送,或明确区分尚未核实的过程状态与最终答案。选择粒度会影响首字延迟,应作为服务契约的一部分。

13.7授权边界及缓存一致性

权限过滤贯穿整条管线

设授权判定为 \(\operatorname{Allow}(I,P,d)\),可访问语料定义为

\[ \mathcal D_{I,P}=\{d\in\mathcal D:\operatorname{Allow}(I,P,d)=1\}. \tag{13.20}\]

检索、重排、摘要和生成原则上都只能处理这个集合中的内容。只在最终答案中隐藏文档链接是不够的,因为未授权内容可能已经进入模型上下文、日志或缓存。向外部服务发送查询和证据,还需要满足相应数据处理边界。

索引能够执行权限预过滤时,应把身份约束纳入候选生成;如果某种近似索引只能在召回后过滤,必须评估过滤导致的候选不足,并确保未授权文本不进入后续模块。授权过滤前后的候选数量也不应无条件暴露给用户,以免透露隐藏资源是否存在。用户可见状态应符合系统既定的资源存在性策略。

提示注入(Prompt Injection)在 RAG 中常来自检索文档内伪装成指令的文字。结构化分隔和明确提示有助于模型识别证据边界,但不是授权机制。检索内容不能修改租户、权限、数据源白名单和工具能力;这些控制由模型外部执行。审计日志本身也应受访问与保留策略约束,不能成为敏感证据的旁路副本。

缓存键、依赖及失效

缓存减少重复计算,但回答缓存保存的是依赖特定知识状态和访问条件的结果。一个逻辑缓存键可以写为

\[ K_{\mathrm{cache}}=H(q_{\mathrm{norm}},I_{\mathrm{scope}},P_{\mathrm{epoch}},v_{\mathcal D}, v_{\mathrm{models}},v_{\mathrm{prompt}},b,v_{\mathrm{config}}), \tag{13.21}\]

其中 \(H\) 是键构造函数,\(I_{\mathrm{scope}}\) 是授权等价范围的标识,\(P_{\mathrm{epoch}}\) 为策略版本。问题归一化不能删除否定、日期或实体限定。即便两个用户问题相同,也不能在没有证明授权等价时共享答案。

缓存还应记录来源 ID 和版本依赖。更新或撤销某个来源后,可使依赖该来源的答案失效;但新文档可能改变从未引用它的旧答案,尤其是原先“未找到证据”的负缓存(Negative Cache)。因此,仅按已有引用做反向失效并不充分,还需要语料代际、主题分区版本或有明确定义的新鲜度窗口。

存活时间(Time to Live,TTL)可限制缓存陈旧的最长时间,却不能替代权限检查。权限撤销后,即使缓存尚未到期,也应阻止读取依赖被撤销证据的内容。另一方面,把每次摄取都绑定到全局缓存清空虽简单,却可能造成集中失效和负载突增。可使用分区版本及带抖动的过期时间改善负载,但必须保留正确的依赖语义。

可复现与当前授权是不同约束

内容快照说明“答案依据了什么版本”,当前授权说明“此刻是否允许读取这些内容”。历史快照不能豁免权限撤销;权限相同也不能说明缓存中的知识仍符合问题要求的时间范围。

13.8分层评估及反事实分析

检索生成质量链

评估应使用保留原始问题、参考事实、可接受来源与时间范围的数据集,并记录知识库是否实际包含所需证据。对于可回答问题,检索层评估相关片段召回与排序;证据组装层评估预算内覆盖、例外保留和冗余;生成层分别评估正确性、忠实度和引用;端到端层再统计延迟、成本、拒答、权限边界与新鲜度。

在多跳问题中,“命中任意一份相关文档”过于宽松。若每个问题需要若干事实组,每组允许若干替代来源,则证据充分要求每个必要事实组至少有一份有效支持。文档级召回成功不保证被选中的片段包含答案;排序指标的提高也不保证有限上下文中保留了必要例外。

定义事件 \(R\) 为必要证据被召回,\(E\) 为必要证据在组装后仍充分,\(G\) 为在充分证据下正确生成。链式法则给出

\[ \Pr(R\cap E\cap G)=\Pr(R)\Pr(E\mid R)\Pr(G\mid R,E). \tag{13.22}\]

这不要求三事件独立。若三个条件概率经测量分别为0.90、0.80和0.85,则完整受证据支持的成功路径概率为 \(0.90\times0.80\times0.85=0.612\)。这里不是把三个任意仪表盘指标相乘,而是使用同一总体上定义一致的条件事件。模型可能在缺证据时凭记忆答对,因此该乘积也不等于所有可能路径的答案正确率。

引用、忠实及拒答指标

设可核实声明数为 \(M\),受到证据支持的声明数为 \(M_s\),可定义声明级忠实度为 \(\frac{M_s}{M}\)。声明划分规则必须固定,否则模型通过合并或拆分句子就可能改变指标。引用精确率可按被评估的声明—来源关系中真正提供支持的比例计算;引用覆盖率则衡量需要引用的声明中有多少具有充分引用。两者的分母不同,不能互换。若支持依赖多份证据的联合,应使用预先声明的集合级判定,不能错误要求每一份单独支持全部结论。

没有可核实声明的回答,其忠实度分母为零,应单列为不适用,而非自动记满分。对于不可回答问题,应统计正确拒答率;对于可回答问题,应统计过度拒答率。系统故障和无权限样本单列,避免通过接口失败“提高拒答表现”。模型评审器可扩大检查覆盖面,但需使用人工标注样本估计其误判,并保存版本和判据。

反事实切片定位故障

反事实评估(Counterfactual Evaluation)在保持问题与主要配置固定时,改变某个证据条件,观察回答如何变化。它有助于定位依赖关系,但只有干预条件与随机性得到控制时,才支持相应的因果解释。

可使用以下成对切片:将检索证据替换为人工确认的充分证据,观察是否仍答错;移除唯一支持某声明的片段,观察是否收缩或拒答;加入条件相同但版本过期的冲突片段,检查时间判断;撤销来源权限,检查检索、上下文和缓存是否共同失效;添加重复、乱序和长干扰片段,检查预算选择的稳定性。还可以固定证据只更换生成器,或固定生成器只更换重排器,使模块差异可解释。

人工充分证据条件能帮助区分召回和生成问题,但不能直接当作线上结果,因为它消除了真实检索困难。对于有随机性的生成,应采用相同抽样策略并重复测量,而不是把单个不同答案都归因于被改变的模块。各切片需包含专业术语、跨文档关联、时间限定、低频实体、表格与不可回答问题,防止总体平均值掩盖系统边界。

质量及服务预算联合报告

若各阶段串行执行,端到端时间近似为排队、改写、检索、重排、组装和生成耗时之和;分支阶段则需按实际依赖图计算关键路径。除了平均值,应报告尾部延迟及超时比例,并说明检索候选数、重排长度、证据词元量与输出长度。增加候选数可能提高召回,同时增加重排成本;增加上下文可能补充证据,也可能挤占输出预算。质量与成本曲线应来自同一配置集合,而非拼接不同系统的最好结果。

运行清单使失败可重放,评估集使变化可比较。二者共同回答三个问题:失败发生在哪一层;修复是否改善目标切片;改善是否以更严重的拒答、泄露或超时为代价。只有答案文本而没有证据版本和模块状态,通常不足以完成这类分析。

实践映射

实践主题 90_llm_applications 中的检索、证据引用、拒答与状态记录可用于观察本章机制。实验应保存语料和模型版本、检索与证据选择状态,并分别检查召回、支持关系与答案;小型样本中流程运行成功,不等于权限隔离、时间一致性或生产可靠性已经得到验证。


  1. 当前工程语境常把多种“检索后生成”架构统称为 RAG。本章保留这一广义用法,同时用 RAG-Sequence 与 RAG-Token 指称原论文中的具体概率形式,避免同名导致目标混淆。↩︎

WORKBOOK / 习题

配套习题与解析

先独立作答,再展开参考解析。选修题保留原书标记。

习题 13.1

从序列潜变量和逐词元潜变量的定义分别推导两种 RAG 分解,说明为什么交换乘积与求和一般不成立。

展开参考解析

序列潜变量z在整条答案中固定,由全概率得 \(p(y\mid q)=\sum_zp(z\mid q)\prod_t p(y_t\mid q,z,y_{<t})\)。逐词元潜变量\(z_t\)分别边缘化则为 \(\prod_t\sum_{z_t}p(z_t\mid q)p(y_t\mid q,z_t,y_{<t})\)。展开后一式包含\(z_1\ne z_2\)等跨文档项,前式不含,通常不能交换。它们是不同生成假设,不是同一实现的两种加速写法。

习题 13.2

给出三个文档的检索概率及二词元条件概率,自行计算两种边缘概率;再截断至前两篇,比较保留原概率质量与局部重归一化。

展开参考解析

取权重\((0.5,0.3,0.2)\),两位置条件概率分别\((0.8,0.2),(0.2,0.8),(0.5,0.5)\),均针对同一目标前缀。序列概率\(0.5(0.16)+0.3(0.16)+0.2(0.25)=0.178\);词元概率\((0.4+0.06+0.1)(0.1+0.24+0.1)=0.2464\)。只留前二且保留原权重,分别为0.128、\(0.46\times0.34=0.1564\),是截断质量而非完整归一化分布。局部重归一化权重\((0.625,0.375)\)后为0.16、\(0.575\times0.425=0.244375\),改变了定义;两种截断不能混报。

习题 13.3

推导候选集合固定时检索逻辑值的梯度 \(p_i-\gamma_i\)。若候选遗漏唯一有效证据,解释这个梯度不能解决什么问题。

展开参考解析

\(Z=\sum_i p_i a_i\)且固定\(a_i\)及候选集合,\(\frac{\partial Z}{\partial s_j}=\sum_i a_ip_i(\delta_{ij}-p_j)=p_ja_j-p_jZ\)。于是 \(\frac{\partial(-\log Z)}{\partial s_j}=p_j-\frac{p_ja_j}{Z}=p_j-\gamma_j\)。候选外文档无此局部梯度;若有效证据完全遗漏,更新最多在错误候选中重新分配概率,不能直接创造候选或修复事实性。

习题 13.4

对重排器的成对逻辑损失求正负候选分数的偏导,并说明为什么候选采样分布影响训练目标。

展开参考解析

\(\Delta=s^+-s^-\)\(\ell=\log(1+e^{-\Delta})\),则 \(\frac{\partial\ell}{\partial s^+}=-\frac{1}{1+e^\Delta}\)\(\frac{\partial\ell}{\partial s^-}=\frac{1}{1+e^\Delta}\)。梯度下降提升正例相对分数。训练期望取决于采到哪些查询和负例,曝光偏差及假负例会改变优化对象;部署候选与训练候选不同也可能失配。

习题 13.5

在本章320词元例题中,为 \(d_2\) 增加40词元的必要定义,重新求满足预算且覆盖尽可能多事实的组合。写明并列最优时的选择规则。

展开参考解析

\(d_2\)增至220,\(d_2+d_3=340\)超预算;\(d_1+d_3=340\)也不可行,三片段最短组合仍超320。最多覆盖两要点:\(d_2\)单独覆盖A、B用220,\(d_3+d_4\)覆盖B、C用220,\(d_1+d_4\)覆盖A、B用320,\(d_2+d_4\)用320仍只A、B。可预先规定先最大覆盖、再最短、再总重排分数,则选\(d_3+d_4\)(1.45高于0.85),并明确缺A;若A为必备硬约束,则选\(d_2\)。题设没有要点优先级,不能声称唯一最优。

习题 13.6选修

为含有历史日期和对话指代的问题设计两条改写,列出不得变化的约束,并构造一个检索分数提高却问题语义改变的反例。

展开参考解析

原问“它在去年生效时的退费条件是什么”,先解析“它”为产品P、去年为明确年份Y。改写一为“产品P,Y年生效版本,退费适用条件”;改写二为“P Y年条款:退款例外与生效日期”。产品、年份、所问条件均不能改变。改成“P最新退款优惠”可能命中新页面更多,却把历史约束和退费规则变为当前营销内容。

习题 13.7选修

将“某负责人所管理服务的故障数”分解为有依赖关系的查询图,说明负责人变更与数据快照怎样进入数据契约。

展开参考解析

节点一按目标历史时点读取项目负责人,输出人ID及任期;节点二按同一快照查其服务归属区间;节点三按服务ID与目标月统计故障,按事件ID去重。任务图为一到二到三,服务间计数可在二后并行。负责人变更用有效时间关联而不是当前姓名,所有结果带快照/水位和时间窗;无法得到一致历史快照时说明估计范围。

习题 13.8

构造一句带有真实引用 ID 但来源不支持的答案,分别说明格式、定位和语义检查的结果。

展开参考解析

来源ID d7真实定位到“普通任务上限30分钟”,答案却写“维护窗口也一律30分钟[d7]”。ID格式检查通过,版本与页码定位通过,但来源不包含维护窗口规则,语义支持检查失败。应返回不支持/需补充例外证据,不能把真实URL当作每条论断正确的充分条件。

习题 13.9选修

在拒答成本模型中令答对也有成本 \(C_c\),推导新的回答条件,说明该模型在哪些情况下不足以表达部分回答。

展开参考解析

回答风险为\(pC_c+(1-p)C_w\),拒答风险为\(C_r\)。若\(C_w>C_c\),回答条件为 \(p>\frac{C_w-C_r}{C_w-C_c}\),等号按预定平局规则;阈值超出\([0,1]\)时可能总拒或总答。若\(C_w=C_c\),只比较常数;若大小逆转,不等号方向需重推。部分回答包含多个论断及不同错误成本,单一二元p和一个拒答成本不能表达覆盖与风险结构。

习题 13.10

设计文档更新、权限撤销和新文档加入三种缓存失效路径,证明只检查已引用文档的版本为何不足以处理负缓存。

展开参考解析

更新文档提升revision并失效引用该版本的证据/答案;撤权先使授权过滤生效,再失效权限域相关缓存;新文档加入提升语料快照或索引水位,使旧无结果缓存重新检索。负缓存没有已引用文档列表,故仅依赖列表校验无法感知新证据。缓存键至少绑定查询、模型/表示、语料与权限身份,失效传播未完成时通过权威版本再校验保护可见性。

习题 13.11

针对重复和乱序摄取事件设计幂等键与版本比较规则;源系统没有全局版本号时,说明能保证和不能保证的一致性。

展开参考解析

\((source,object,revision,event\_type)\)作为事件幂等身份,同对象只允许更高版本覆盖,墓碑参与排序。没有全局版本时可用每对象单调修订或来源游标;这能保证对象内旧写不覆盖新写,却不能保证跨对象同一时点快照。仅有不可靠时间戳时需回源核对或记录冲突,不能用到达先后冒充源事实顺序。

习题 13.12

给出三层条件成功率,并计算完整支持路径的成功率。再构造一个缺证据但凭参数记忆答对的情形,解释两个指标的差别。

展开参考解析

\(P(R)=0.9,P(S\mid R)=0.8,P(A\mid R,S)=0.85\),完整支持路径概率为\(0.612\),无需假定三事件独立。另有0.1样本未召回证据,其中一半凭参数记忆答对,可使答案正确率至少再增0.05,但这些答案不具备该证据路径的可追溯支持。质量报告应分别给事实正确和来源支持,不能把两者相等当公理。

习题 13.13

设计包含可回答、不可回答、权限受限与上游异常的评估集,分别定义正确回答率、过度拒答率和故障率的分母。

展开参考解析

按可回答且授权、不可回答、无权、上游异常四类保留独立标签。正确回答率可用可回答且授权题数为分母,过度拒答率用同一分母;不可回答正确拒答率以真正缺证据题数为分母,权限违规率以无权题数为分母。故障率以全部被评估请求为分母,另列各类故障,不将超时混入正常拒答。端到端总体成功另按预定四类正确行为聚合。

习题 13.14

选择一种重排优化,设计包含充分证据替换、证据删除与版本冲突的反事实评估,说明如何控制生成随机性及预算。

展开参考解析

比较旧/新重排器,固定初召集合、证据预算、生成器、提示和问题。分别将证据替换为人工充分包、删除关键证据、加入同实体冲突版本;同时保留正常条件。若充分包消除差异,瓶颈主要在检索/选择;若删证据仍高分,应审查泄漏和参数记忆。按同题配对控制种子或重复采样,以题为独立单位;不能给新重排器额外上下文后归因于排序算法。

REFERENCES

参考文献

Gao, Tianyu, Howard Yen, Jiatong Yu, 和 Danqi Chen. 2023. 《Enabling Large Language Models to Generate Text with Citations》. https://arxiv.org/abs/2305.14627.
Jiang, Zhengbao, Frank F. Xu, Luyu Gao, Zhiqing Sun, Qian Liu, Jane Dwivedi-Yu, Yiming Yang, Jamie Callan, 和 Graham Neubig. 2023. 《Active Retrieval Augmented Generation》. https://arxiv.org/abs/2305.06983.
Karpukhin, Vladimir, Barlas Oguz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, 和 Wen-tau Yih. 2020. 《Dense Passage Retrieval for Open-Domain Question Answering》. 收入 Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing, 6769–81. https://doi.org/10.18653/v1/2020.emnlp-main.550.
Lewis, Patrick, Ethan Perez, Aleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Küttler, 等. 2020. 《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》. https://arxiv.org/abs/2005.11401.
Ma, Xinbei, Yeyun Gong, Pengcheng He, Hai Zhao, 和 Nan Duan. 2023. 《Query Rewriting for Retrieval-Augmented Large Language Models》. https://arxiv.org/abs/2305.14283.
Nogueira, Rodrigo, 和 Kyunghyun Cho. 2019. 《Passage Re-ranking with BERT》. https://arxiv.org/abs/1901.04085.

搜索全书

搜索全书正文、习题与解析