1. 从独立表示到联合判断
cross-encoder 同时读取查询和文档, 让注意力直接比较实体、条件和否定. 它避免双编码器把两侧提前压成单个向量, 但计算量随候选数增长. 因而典型结构是便宜召回取较大 , 再重排得到较小集合.
1.1. 点式、对式与列表式
点式重排独立给每个候选评分, 易于批处理. 对式比较两个候选, 能表达相对偏好但需要更多调用. 列表式一次观察多项, 可能利用候选间关系, 同时受输入顺序和窗口限制.
重排分数主要用于当前候选内排序, 不一定是“可回答概率”. 若要设阈值或跨查询比较, 需要在带标签数据上校准并按问题类型检查.
2. 排名不是证据集合
逐项相关性无法保证整体覆盖. 前五项可能来自同一文档并重复同一事实, 而多跳问题需要另一份材料. 最大边际相关性等方法在相关性与新颖性之间选择, 也可以显式覆盖问题分解出的子目标.
2.1. 去重与版本冲突
内容哈希、文本相似和共享父节点可以识别重复. 不同版本不能简单去重: 若查询要求当前状态, 应按有效时间过滤; 若分析变化, 两个版本都是必要证据.
证据选择可写成带成本的集合优化: 在总 token 预算内最大化相关性与覆盖, 惩罚冗余. 长文档不应仅因长度获得更多位置, 也不能一律截断到丢失条件.
3. 重排器的训练与数据
3.1. 正负例
随机负例通常过于简单. 高质量负例来自召回器的高排名错误, 包括主题相近但条件不符、旧版本和错误实体. 权限不应作为负例文本交给无权用户的在线模型.
相关、部分支持和充分支持需要区分. 一个片段可能与问题相关却不能独立回答. 重排目标若只标主题相关, 会把看似相关的片段推到前面.
排序训练应对齐“进入上下文是否有助于完成任务”, 而不只对齐主题相似.
4. 评测与成本
4.1. 分层消融
固定召回候选比较不同重排器, 再固定重排结果比较证据选择策略. 重放相同候选可以隔离在线索引波动.
排名指标提升后, 仍需检查答案正确性、引用支持率、延迟和成本. 某些重排器改善 nDCG, 却因输出过长或候选减少损害多跳回答.
生产记录每阶段候选数量、耗时、截断和最终选择理由. 这些信息连接离线指标与用户看到的回答.
5. 从候选分数到证据集合
下面展开融合、cross-encoder、集合选择和生产预算. 排序先比较单个候选, 集合选择再处理互补、重复、冲突与 token 成本; 两步采用不同目标, 但共享同一候选运行记录.
可复算实验固定查询、候选和语料快照, 同时记录排序质量、最终证据覆盖、延迟与成本. 指标改善只有传递到上下文和答案, 才构成系统收益.
2. 融合与重排
2.1. 分数为何不能直接相加
假设 BM25 给文档 的分数是 18 与 12, dense 给出 0.72 与 0.78. 直接计算 BM25 + dense 几乎完全由 BM25 决定;给 dense 乘 20 又把权重绑定到当前分布. 可以在验证集做分位数、温度或学习式校准, 也可以使用 RRF 按排名融合.
RRF 对文档在每个排名中的位置求倒数和. 若 , 在稀疏第 1、稠密第 5, 分数为 ; 在两路都第 2, 分数为 . 后者因跨路稳定而更高. 缺席文档不应虚构一个排名, 同一逻辑文档的重叠片段还要先处理身份, 否则它会凭重复数量获益.
2.2. Cross-encoder 的强交互
Cross-encoder 把 [q; SEP; d] 联合输入模型并输出 . 查询 token 与文档 token 在每层都能相互注意, 更容易识别否定、条件和实体消歧. 代价是每个候选都要运行模型. 假设粗召回 , 重排后只取 10 个, 计算仍发生在 100 对输入上;批处理提高设备利用率, 不消除总计算.
训练重排器时, 随机负样本太容易. 实用负样本通常来自当前召回器的高排名误召, 再加入同实体不同版本、数字接近、否定相反等任务难例. 标注口径要与下游一致: 如果回答需要例外条款, 只含主规则的候选不应标成完全相关.
4. 上下文选择与顺序
4.1. 从 top-k 改成预算内集合
取重排前 条的隐含假设是每条价值独立且长度相近. 实际片段长度不同, 证据之间有重复和互补. 选择器可以逐步加入「单位 token 带来最大新增覆盖」的候选, 并在加入后更新剩余子问题. 对同一来源的重叠窗口先合并或只保留最小支持区间.
上下文中的每个证据包应包含请求内 ID、标题、版本、来源位置、正文和必要元数据. 请求内 ID 用于生成引用, 稳定来源身份用于打开原文. 不能让模型自行从正文猜 URL 或页码. 对结构化结果, 证据包还应带查询、快照和主键.
4.2. 顺序与冲突
长上下文模型仍可能对不同位置利用不均. 排序可以让最关键证据靠近模型较容易使用的位置, 但需要在目标模型上评测. 把多个冲突版本同时放入上下文时, 应明确生效时间并让选择器先按任务时间过滤; 单靠提示词要求模型选最新版, 会把数据约束转给概率生成.
若两个当前来源真的冲突, 系统应保留来源差异并降低回答确定性. 自动摘要可能减少 token, 也可能删掉限定条件. 摘要作为派生证据时要保留回链, 关键命题仍应引用原始片段. 对高风险任务, 可先抽取命题和条件, 再让生成器组织表达.
5. 实验与故障定位
5.1. 最小消融
依次运行 BM25、exact dense、两路 RRF、加入 cross-encoder、换 ANN、加入查询改写和上下文选择. 每步保持其他配置不变, 报告 Recall@k、MRR 或 nDCG、集合覆盖、冗余率、P95/P99 延迟和成本. ANN Recall 以同一向量与过滤条件下的 exact 结果为分母.
候选数与最终上下文预算联合扫描. 若把 从 50 增到 200 只提升 0.5 个点召回, 却让重排 P99 翻倍, 可能不符合服务目标. 若上下文只能放 4 段, Recall@100 很高也不能说明最终证据完整. 最终选择后的 evidence-set coverage 更接近生成器实际条件.
5.2. 失败漏斗
对失败查询依次检查: 证据是否存在于当前快照; 解析与切分是否保留; 权限过滤是否允许; 各召回器是否命中; 融合后排名是否下降; 重排是否误判; 去重或预算是否删掉; 最终上下文是否被截断. 每一问都对应可观察状态.
专名漏召优先查分词与稀疏通道; 语义释义漏召查 embedding 域偏移和模板; 候选正确但前排错误查重排负样本; 多跳只找到一跳查分解与集合标注; 结果少于 查 ANN 过滤时机和重复片段. 先定位数据流中的断点, 再换模型.
6. 索引选择、指标与上线实验
Exit code: 0 Wall time: 0.2 seconds Output:
检索层在调用者有权看到的当前语料中工作, 以可接受的延迟和资源代价召回足以支持任务的证据, 再把候选排序到下游能够使用的规模.
1. 职责边界
本页负责查询表示、过滤、融合、去重、重排、索引选择与检索评测. 语料许可与生成动作由相邻责任层处理.
2. 从任务与相关性开始
"相关"必须先被定义.不同任务需要不同判断:
| 查询类型 | 相关证据的最低条件 | 常见误召回 |
|---|---|---|
| 精确事实 | 直接包含实体,属性,时间和答案 | 同实体旧版本,只有相似主题 |
| 流程/政策 | 包含适用范围,步骤,例外与生效版本 | 只含摘要,没有限制条件 |
| 比较 | 覆盖每个比较对象且口径一致 | 只支持一方或混用年份 |
| 多跳 | 证据集合能连接中间实体/条件 | 各片段分别相关但无法连成推理链 |
| 聚合/过滤 | 数据结构支持完整集合和确定性条件 | 向量相似片段并不能证明"全部" |
先标一小批 (query, corpus_snapshot, relevant_ids, relevance_grade).如果无法指出什么算相关文档,就无法解释 Recall,MRR 或 nDCG,也不能可靠调 top_k.
3. 切分是检索单位设计
没有跨任务通用的 200,500 或 1000 token 最优值.切分要同时保留:
- 检索可区分性:一个片段不要混入太多无关主题;
- 证据完整性:定义与限制,表头与行,条款与例外不能被无条件拆开;
- 可定位性:片段能回到页,节,段落,表格单元或记录主键;
- 更新局部性:一处修改不应让整库片段 ID 全部漂移;
- 模型约束:embedding 与重排模型的实际输入上限和截断行为;
- 权限一致性:不同 ACL 或有效期的内容不能被合成一个片段.
3.1 可选切分方式
- 结构优先:按标题,段落,列表,代码块,表格,记录边界切;超长单元再递归拆分.
- 滑窗:适合结构弱的连续文本,但重叠会增加存储,重复召回和评测去重难度.
- 父子片段:用小片段检索,返回带邻接范围的父段作为证据;必须评测父段扩展是否引入噪声.
- 语义边界:根据相邻单元表示变化建议切点;它仍是模型与阈值相关的启发式,不是"理解正确"的保证.
- 按记录检索:结构化数据保持主键与字段,不应先拼成长文本再假装精确查询.
3.2 切分实验
至少比较两个粒度和一个结构优先方案.固定检索器,分别测:证据召回,冗余率,被截断的重要条件,重排耗时,送入生成的 token 数和引用可定位率.若只比较最终答案,检索问题会被生成模型偶然掩盖.
4. 稀疏检索:词项是不可替代的信号
BM25 根据查询词在文档中的出现,全库区分度和文档长度修正来评分.一种常见形式为:
上式把 写作查询中的唯一词项;若实现显式计入查询词频,评分形式会多一个对应因子.公式族的 IDF,查询词频与参数约定不完全相同,应以具体引擎实现为准.BM25 查询成本主要取决于查询词的倒排表长度,过滤和评分实现,不能只用语料文档数给一个通用复杂度.稀疏检索通常适合:产品号,错误码,人名,条款编号,缩写,罕见术语和需要精确字面命中的查询.它的弱点是同义表达,跨语言,拼写变化和需要语义概括的查询.
中文和多语言系统还要固定分词器,规范化,同义词,停用词与字段权重版本.分析器变更等价于索引语义变化,必须重建并跑回归.
5. 稠密检索:相似度不是概率
双编码器把查询与文档分别编码:
再按模型规定使用内积,余弦或距离. 与 可以共享参数,也可以是不对称编码器;不能把"同一个模型"写成 dense retrieval 的定义.DPR 是一个经典双编码器实例,并在其论文指定的开放域 QA 数据集与 BM25 基线上报告了检索结果;这些结果不能直接外推到企业语料.DPR 论文
余弦相似度为:
该式要求 且 .L2 归一化只把向量长度变为 1,不会把负分量变成非负.两个向量均归一化时,内积等于余弦相似度;是否需要归一化,分数能否跨查询比较,取决于 embedding 模型的训练和官方说明.相似度不是"文档正确概率",不同模型,索引和查询之间的绝对阈值也通常不可直接复用.
稠密检索适合释义,概念与语义近邻,但可能忽略数字差异,否定,时间和专有标识符.稠密相关性分数不承载授权语义:权限必须由可执行过滤器保证;ANN 与过滤组合可能降低召回或返回少于 条,但不得通过放宽权限补足结果.换 embedding 模型必须重建向量索引,并用同一标注集对照,而不是只看演示查询.
6. 结构化与专用检索
当问题要求 金额 > X,时间范围,去重计数,联接,库存状态或权限判定时,SQL,搜索过滤器,图查询或业务 API 往往比文本相似度更合适.路由规则应基于查询需求和可验证 schema,而不是把所有数据都向量化.
检索器可以并行返回文本证据和结构化结果,但最终记录必须说明每个值来自哪个查询,快照和主键.
6.1 其他检索表示放在什么位置
- 学习式稀疏检索仍产出高维稀疏词项权重,可使用倒排索引;它不是"稠密向量换名字",训练域,词表和索引膨胀都要评测.
- 多向量 / late interaction为一个查询或文档保留多个 token/片段表示,在召回效率与细粒度交互之间取中间点;存储,候选打分和压缩成本不能按单向量估算.ColBERTv2
- 查询改写,扩展与分解位于检索前,可改善歧义或多跳覆盖,也可能引入实体漂移和额外调用.保存原查询,每个改写和其候选,独立评测而不是只看最终答案.Query Rewriting in RAG
稀疏与稠密分数尺度不同.未经校准直接线性相加,权重含义不稳定.常见选择:
- 在验证集上对分数归一化/校准后做加权;
- 用学习排序,但需要独立训练与测试数据;
- 用 Reciprocal Rank Fusion(RRF)按排名融合:
其中只对包含文档 的排名列表求和,排名从 1 开始;缺席项不代入一个虚构排名.RRF 的计算随参与融合的候选列表总长度增长.该方法由 Cormack 等在特定 TREC/LETOR 实验中提出并比较;常数 仍是实现参数,不能因论文示例就宣称对所有任务最优.RRF 原论文
融合前先统一逻辑文档 ID,避免同一源的多个重叠片段占满候选.去重也不能只保留最高分:多跳或比较任务可能需要同一文档的多个不同证据区间.
6.4. 重排:用更强交互缩小候选
cross-encoder 通常把查询和单个候选拼接后联合编码,输出相关性分数:
Nogueira 与 Cho 的 BERT 重排论文是经典实例,其结果绑定 TREC-CAR,MS MARCO,模型和训练设置.Passage Re-ranking with BERT
8.1 正确的成本口径
对标准全注意力 Transformer,单个 query–document 序列长度 特殊 token;每层主要计算可近似写成 ,分别对应注意力与投影/前馈量级.对 个候选要运行 次(或批处理);批处理可改变墙钟利用率,但不消除总计算.因此不能把 cross-encoder 总成本统一写成 .真实延迟还取决于层数,隐藏维度,截断,批量,硬件和实现.Attention Is All You Need
8.2 何时值得重排
- 粗召回已经有较高覆盖,但前排噪声多;
- 查询含条件,否定,实体消歧或需要细粒度匹配;
- 上下文预算小,候选顺序直接影响证据覆盖;
- 验证集证明收益超过额外延迟与成本.
若相关证据根本未进入候选,重排无法找回.先诊断候选 Recall,再诊断排序.
9.1 基线:精确搜索
Flat/exhaustive search 对每个查询比较全部 个 维向量,单查询距离计算基线约为 ;结果可作为近似索引召回率的基线.Faiss 官方索引表把 IndexFlatL2 与 IndexFlatIP 标为 exhaustive;归一化后 IndexFlatIP 可用于余弦搜索.Faiss 索引说明
9.2 HNSW
HNSW 建立多层近邻图,通过上层入口逐层搜索.原论文在其模型和实验下讨论了近似对数扩展,但生产复杂度受数据分布,图参数,过滤,删除支持和实现影响,不能统一写成 .HNSW 原论文
Faiss 文档说明 M 增大会提高精度并增加内存,efConstruction 控制构建探索,efSearch 控制查询探索;Faiss 的 HNSW 还不支持直接移除向量.其他引擎的删除语义可能不同,必须读所用版本文档.
9.3 IVF 与压缩
IVF 用粗量化器把向量分到倒排列表,查询只探测部分列表;探测越多通常越接近精确搜索但更慢.PQ/SQ 等压缩减少内存,却会改变距离近似.训练样本,nlist,nprobe,编码与重排共同决定结果.
pgvector 官方文档给出的当前实现对比是:HNSW 通常有更好的速度—召回权衡,但构建更慢,内存更多;IVFFlat 构建更快,内存较少,但需要训练且查询表现不同.这是 pgvector 的实现说明,不应写成所有产品的绝对规则.pgvector 官方文档
9.4 选择矩阵
| 约束 | 先验证的方案 |
|---|---|
| 小语料或强过滤后集合很小 | 精确搜索基线 |
| 高召回,内存可接受,更新方式匹配 | HNSW |
| 大规模,需压缩或控制扫描量 | IVF/PQ 类方案 |
| 频繁删除与权限变化 | 先验证引擎删除,墓碑,重建和过滤行为 |
| 多租户强隔离 | 分区/分表/独立索引与共享过滤做安全和成本对照 |
6.6. 指标与决策流程
| 指标 | 回答的问题 | 局限 |
|---|---|---|
| Recall@k / hit rate | 所需证据是否进入前 | 不惩罚大量噪声;单证据与多证据定义不同 |
| Precision@k | 前 中多少相关 | 可能惩罚有用的多样证据 |
| MRR | 第一个相关结果多靠前 | 不适合必须覆盖多个证据的任务 |
| nDCG@k | 多等级相关结果是否排得合理 | 依赖可靠等级标注 |
| evidence-set coverage | 多跳/比较所需证据集合是否齐全 | 标注成本高 |
| latency / memory / cost | 服务是否满足资源目标 | 不能说明语义质量 |
| authorization correctness | 结果是否全部有权访问 | 应是门槛,不与相关性加权抵消 |
如果下游只允许两个片段,Precision 和排序可能比把 Recall@100 做高更重要;如果法律检索要求不漏条款,集合 Recall 可能优先;如果任何越权结果都不可接受,权限正确性是硬门.指标优先级由任务损失决定.
11. 决策流程
- 按查询类型定义相关性和证据集合.
- 建稀疏精确基线,不从"必须向量库"开始.
- 加一个稠密检索器,分别分析稀疏独有,稠密独有和共同命中.
- 选择融合方式并在验证集调参,测试重叠去重.
- 只有候选覆盖足够后才加重排.
- 用精确向量搜索测 ANN Recall,再在实际过滤与并发下测速度,内存和结果数.
- 在最终上下文预算下选择
K,最终k和片段扩展,而不是分别追求局部最优. - 对实体,否定,数字,时间,多语言,多跳和无答案查询做切片分析.
| 症状 | 优先检查 |
|---|---|
| 专有名词找不到 | 分词/规范化,稀疏通道,词表截断 |
| 语义问题找不到 | embedding 域偏移,查询/文档模板,切分边界 |
| 有候选但第一名错 | 重排,时效/权限特征,负样本与标注 |
top_k 不足 |
ANN 过滤时机,扫描参数,重复片段,授权集合大小 |
| 多跳只找到一跳 | 查询分解,证据集合标注,结构化/图或迭代检索 |
| 换索引后结果漂移 | 近似参数,模型/归一化,索引训练样本,随机性 |
| 延迟长尾 | 重排长度,候选 K,过滤选择性,缓存,并发与批量 |
| 离线好线上差 | 查询分布漂移,标注泄漏,源版本和权限不同 |
13.1 固定资产
- 语料快照和权限矩阵;
- 训练,调参,测试三组查询,按来源或时间隔离;
- 文档/片段相关性与多证据集合标注;
- 索引引擎版本,硬件,线程,并发与缓存状态.
13.2 最小消融表
| 运行 | 切分 | 召回 | 融合 | 重排 | 索引 |
|---|---|---|---|---|---|
| A | 结构基线 | BM25 | 无 | 无 | 稀疏精确 |
| B | 同 A | dense | 无 | 无 | vector exact |
| C | 同 A | BM25+dense | RRF/已校准融合 | 无 | vector exact |
| D | 同 A | 同 C | 同 C | cross-encoder | vector exact |
| E | 同 A | 同 D | 同 D | 同 D | 候选 ANN |
| F | 第二切分方案 | 同 E | 同 E | 同 E | 同 E |
报告总体与查询切片的指标,95% 置信区间或配对重采样,P50/P95/P99 延迟,内存,索引构建时间,失败/少于 比率和授权错误.ANN 的 recall 要相对同一向量与过滤条件下的 exact 结果计算.
相关性定义与证据集合标注已版本化.
稀疏与精确向量基线可重跑.
embedding 的查询/文档格式,归一化和距离符合模型说明.
融合前解决了分数尺度或采用排名融合.
重排收益在实际候选,长度和硬件下测得.
ANN 用 exact 对照验证,并覆盖真实过滤与删除场景.
top_k,候选 K 和最终上下文 token 预算联合调优.权限正确性是硬门,不被相关性分数抵消.
数字,否定,时间,多语言,多跳和无答案切片没有被总平均掩盖.
每次发布保留索引,模型,分析器,参数和硬件口径.
Robertson & Zaragoza, The Probabilistic Relevance Framework: BM25 and Beyond, 2009.
Karpukhin et al., Dense Passage Retrieval for Open-Domain Question Answering, 2020.
Cormack et al., Reciprocal Rank Fusion, 2009.
Nogueira & Cho, Passage Re-ranking with BERT, 2019.
Santhanam et al., ColBERTv2, 2022.
Ma et al., Query Rewriting in Retrieval-Augmented Large Language Models, 2023.
Malkov & Yashunin, HNSW, 2016/2020.
Meta, Faiss indexes.
pgvector, Exact/approximate indexes, filtering and monitoring.
Thakur et al., BEIR 官方仓库.
Robertson & Zaragoza, BM25 and Beyond, 2009.
Cormack et al., Reciprocal Rank Fusion, 2009.
Nogueira & Cho, Passage Re-ranking with BERT, 2019.
Karpukhin et al., Dense Passage Retrieval, 2020.
Khattab & Zaharia, ColBERT, 2020.
Santhanam et al., ColBERTv2, 2022.
Gao et al., HyDE, 2023.
6.11. 集合效用与线上错位
逐项重排优化 , 证据选择优化集合 . 一个常见形式为 , 其中 是子问题或证据槽, 表示片段覆盖槽位. 第一项奖励新增覆盖, 第二项惩罚重复.
有三个槽位权重 3、2、1, 候选 A 覆盖前两个且长 200 token, B 只覆盖第一个且长 80, C 覆盖第三个且长 100. 预算 300 时, 按单项相关性可能选择 A+B, 覆盖效用为 5 且重复第一槽; 选择 A+C 正好 300 token, 覆盖效用为 6. 排名最高的两个片段不一定组成最佳证据集合.
若把成本纳入边际选择, 每步选择 最大的候选. 这种贪心适合单调次模目标, 对必须成组出现的证据不一定有效. 两跳关系的两段证据单独边际都低, 一起加入才有价值, 需要槽位约束、分组候选或小规模组合搜索.
设召回并行耗时 45 ms, 融合 5 ms, cross-encoder 单批 35 ms、每批 16 个候选, 生成预算 600 ms. 重排 64 个候选需四批, 串行约 140 ms, 总关键路径约 790 ms. 若服务目标 750 ms, 可以减少到 48 个候选、并行两批或使用更小模型, 但每种改动都要重测证据覆盖.
候选从 32 增到 64 时 recall 从 0.82 到 0.88, 重排后最终证据覆盖从 0.78 到 0.80, 只传递 2 个百分点. 多出的 6 个召回点大多被重排或预算丢弃. 延迟决策应基于最终证据覆盖的边际收益, 不能只看 recall@K.
LLM 列表式重排还要计入输入 token 与位置偏差. 对同一候选随机旋转顺序, 若前五名变化显著, 分数不适合直接发布. 可以采用多次排列聚合, 代价是调用倍增; 或让 LLM 只比较 cross-encoder 难以区分的小候选集.
Pointwise 把每个 独立标成相关等级, 用二分类交叉熵或回归损失. 它易于批处理和设阈值, 但训练不直接关心候选间顺序. Pairwise 对正负候选优化 , 强制正例高于负例; 结果对负例采样敏感, 也不直接优化 top-k 的整体排列.
Listwise 把一组候选共同输入损失. ListNet 类目标匹配标签与分数的 softmax 分布, LambdaRank 类方法按交换两个文档对 nDCG 的影响加权梯度. 它更贴近排名指标, 每个训练列表的构造和长度也成为数据分布. 部署候选来自不同召回器时, 训练列表应复现这类混合.
四候选相关等级 [3,0,2,1], 模型顺序 [A,C,D,B] 已把高等级放前; pointwise 仍逐项惩罚分数绝对值, pairwise 关心六个相对关系, listwise 会让前部错误交换得到更大代价. 选择目标前要确定线上真正关心二分类过滤、成对偏好还是 top-k 质量.
cross-encoder 或 LLM 可以给大量候选产生软标签, 双编码器学习教师分数或相对顺序. 蒸馏降低在线成本, 学生受独立编码容量限制, 无法完整复现细粒度交互. 教师若使用答案泄漏或与部署不同的长上下文, 学生离线分数会虚高.
hard negative 来自当前召回器的高排名错误, 如同实体旧版本、数字接近但单位不同、主题相同而条件不符. 它们比随机负例提供更强梯度. 假负例风险也更高: 未标注的替代证据可能真正支持问题. 采样前用证据组、规则和人工抽查清洗, 并保存负例来源.
一批中正例分数 2.0, hard negative 1.8, 两个随机负例 0.1、-0.5. softmax 对比损失主要由 1.8 决定. 若把 batch 扩大却只增加简单随机负例, 计算增加而决策边界改善有限. 持续挖掘要在新模型上重新运行, 防止负例集合停留在旧错误.
7.5. 次模近似与线上错位
覆盖函数 单调且次模时, 在基数约束下贪心有经典的 近似保证. 加入不同长度后可按边际收益/成本选择, 保证条件更复杂. 互补证据必须成组才产生价值时函数可能非次模, 需要分组槽位或束搜索.
离线选择器常使用人工完整候选, 线上却接收召回器产生的偏置候选. 离线 nDCG 提升不代表线上证据覆盖提升. 评测分为 oracle 候选、冻结线上候选和完整实时链路三层, 分别回答选择能力、当前可用收益和最终系统收益.
另一个错位来自 token 估算. 离线按字符或原文 token 计成本, 线上还加入标题、来源 ID、分隔符和转义, 实际预算可能超限并截断末尾证据. 选择器使用最终序列化后的 tokenizer 计数, trace 保存截断前后上下文, 才能复算预算损失.
查询要求比较产品 A、B 的续航与保修. 五个候选的 cross-encoder 分数、长度和槽位分别为: A1 (0.92,180,A续航), A2 (0.88,170,A续航重复), B1 (0.84,190,B续航), W1 (0.76,120,A保修), W2 (0.72,130,B保修). 上下文预算 600 token.
直接按分数选 A1+A2+B1, 长度 540, 只覆盖续航且重复 A. 设每个新槽位收益 2, 相关性直接相加, 与已选片段相似度乘惩罚 0.8. A1 先选; A2 与 A1 相似 0.95, 边际约 ; B1 新增槽位, 边际 ; W1、W2 各新增槽位. 贪心会选 A1、B1、W1, 已用 490, 剩余 110 放不下 W2. 若按边际收益/长度, W2 可能早于 B1, 仍需槽位最低配额保证两产品都完整.
更合适的约束是每个对象至少覆盖续航与保修, 预算不足时不生成完整比较. 当前四个必要片段 A1、B1、W1、W2 共 620, 超出 20. 选择器可以抽取式压缩 A1 与 B1 各减少 20, 验证数值和单位仍在后得到 580. 如果压缩失败, 正确动作是请求更大预算或返回部分比较, 不能静默删除 B 的保修.
在线实验比较 top-score、MMR、槽位约束三种策略. 排名指标可能偏好 top-score, 证据组覆盖偏好槽位约束. 最终指标同时报告比较问题完整率、引用支持、平均 token 与 P95 重排延迟. 只报告 nDCG 会忽略集合是否完成任务.
7.7. 离线标签与线上反馈的反例
离线标注者看到完整文档, 把长章节标为高度相关; 线上系统切成片段后, 任一片段都不含完整条件. cross-encoder 学到标题与主题, 排名指标很好, 上下文仍不充分. 标签单位必须与在线候选单位一致, 或显式标注父子证据组.
点击数据也会偏向排在前面的结果. 未点击的低位文档不一定不相关, 直接当负例会强化原排序. 训练 pairwise 数据时用随机交换、探索流量或位置倾向校正, 并把“未展示”与“展示未点击”分开.
LLM rerank 的输出解析失败同样影响在线分布. 离线只统计成功解析样本会高估质量. 评测把超时、漏项、重复 ID 和非法输出都算入端到端失败, 降级排序也进入最终指标. 线上价值等于质量乘可用率, 不能把可用率放在报告之外.
完整成本表还包含缓存命中. 一千次请求中 40% 命中重排缓存, 未命中请求平均 180 ms, 命中为 8 ms, 平均约 111 ms; P95 仍接近未命中路径. 若发布只报平均延迟, 会掩盖冷查询体验. 缓存键绑定查询规范化结果、候选内容哈希、重排器与策略版本, 否则命中旧排序会破坏离线对账.
证据选择的回归样本保存候选全集和最终序列. 当重排模型升级时, 可以分别重放旧选择器与新选择器, 判断变化来自分数还是集合逻辑. 对预算边界样本, 只把某片段长度增加一个 token, 检查算法是否发生不合理的大幅跳变; 若发生, 需要稳定的并列规则或为必要槽位预留预算.
发布报告把模型质量、解析成功率、降级质量和预算边界放在一起. 只有理想路径提升而超时降级明显退化时, 线上尾部请求可能比旧系统更差, 需要先改善可用率或保持旧排序兜底.