你在做一个“长视频问答/会议检索”服务。每个请求是一条自然语言任务,底层索引里有百万级 5~10 秒视频片段、ASR 文本、片段摘要,以及少量人工标注的主张级证据。系统要求 p95 延迟不超过 300ms,且单请求最多只能做 1 次 GPU 重批处理;完整视频特征提取一次约 12ms,摘要召回约 1ms,主张级文本检索约 3ms,但如果一次拉太多候选,后续多模态推理会明显涨显存并拖慢尾延迟。
请设计一个在线路由与采样方法:输入 query 后,系统如何在“只看摘要/ASR、检索主张、拉取完整视频特征、提前停止或继续扩展”之间做决策?要求说明你的打分建模、预算控制、停止条件、如何处理证据分散在多个片段中的情况、如何避免选到相邻冗余片段,以及如何保证离线评估和线上效果尽量一致。
我会把它建模成一个“预算约束下的自适应证据选择”任务,而不是一次性 top-k 检索。核心目标不是单纯最大化相似度,而是在时延预算内最大化“答案正确率/证据召回”的期望收益。
第一步是做粗召回。对 query 先用轻量编码器分别检索视频摘要、ASR 文本和主张库,得到候选集合 C。对每个候选 i 计算一个便宜的置信分数 s_i 和不确定性 u_i;如果能估计到候选的边际增益,最好再估一个 g_i = P(该候选能新增有效证据 | q, cheap features)。这里不要直接相信 raw score,必须做校准,比如 temperature scaling / isotonic regression,否则阈值会在不同领域漂。
第二步是做分层路由。把候选按时间轴或场景切成 bucket,先在每个 bucket 里取 1 个代表,避免相邻冗余。然后用一个带预算的贪心/优先队列策略,反复选择单位成本边际收益最高的候选: - 优先级可以写成 `priority_i = (g_i + λ * u_i) / cost_i`; - 若候选之间有重叠语义,就加一个冗余惩罚项,比如和已选集合的最大相似度或 coverage overlap。 这个形式本质上接近预算约束的子模优化,工程上很适合做“贪心 + 截断”。如果要更稳,可以把每个候选视为一条“证据臂”,用上界分数 `upper_i = s_i + βu_i` 做 best-first 扩展,直到预算耗尽或 top1 与 next-best 的 margin 足够大。
第三步是自适应停止。不要固定拿 K 个候选。更合理的是设置三个停止条件: 1. 证据置信度足够高:top1 分数高且 top1-top2 gap 足够大; 2. 覆盖足够好:已选片段覆盖了 query 的不同子任务/时间范围; 3. 边际收益低于成本:下一次扩展的上界收益低于继续推理的时延代价。 如果三者都不满足,再升级到更贵的完整视频特征或更强重排器。若仍然低置信,则进入 abstain 或澄清任务分支,避免硬答。
训练上我会分两层: - 轻量 router 用监督学习做候选排序,正样本是答案链路中的真证据,负样本用 hard negative 和邻近时间负样本; - 路由阈值和停止策略用离线日志做反事实评估,再在线做小流量校准。 如果有教师模型,可以把“看全量证据后的决策”蒸馏给 router,让 cheap scorer 学到更接近最终答案收益的分布,而不是只学相似度。
复杂度上,粗召回如果用 ANN,大致是 `O(log N + m)`;后续贪心扩展是 `O(M log M)`,M 是实际展开的候选数,远小于全量扫描。显存上,只把被选中的少量候选送入重模型,因此峰值显存和尾延迟都可控。
工程上最关键的取舍有三个: - 召回 vs 延迟:阈值低会涨召回但拖尾延迟; - 冗余 vs 覆盖:只取最高分会错过跨片段证据; - 稳定性 vs 激进:在线分布漂移时要保守路由,必要时降级到文本证据。 最后要监控的不是单一 accuracy,而是 evidence recall、calibration error、p95/p99 latency、以及 abstain 率。这样系统才能在真实流量下稳定工作。
强答应该把任务抽象成“预算约束的自适应证据选择/级联路由”,而不是停留在“先召回再重排”的泛泛说法。最重要的是讲清: 1. 如何定义目标函数:答案正确率、证据召回、冗余惩罚、成本约束; 2. 如何做分层决策:粗召回、候选分桶、边际收益驱动扩展、提前停止; 3. 为什么要做校准:否则阈值和 stop policy 在跨域场景会失效; 4. 如何处理分散证据和相邻冗余:时间分桶、coverage、MMR/子模贪心; 5. 如何落地:ANN、批处理、显存上限、尾延迟、abstain 降级、日志反事实评估。
常见错误包括: - 只说 top-k 检索,没有预算控制和停止条件; - 忽略冗余,导致一堆相邻片段占满预算; - 只谈离线指标,不谈在线尾延迟和分布漂移; - 没有校准,阈值只能靠拍脑袋; - 没有说明当证据不足时如何安全失败。
出练习者可能继续追问:如果证据分布极度长尾怎么办、如何证明贪心近似合理、如何做线上 A/B 但不伤主链路、如何在多模态和纯文本候选之间统一打分。
- 如果 query 同时涉及多个时间段,你如何把“覆盖率”形式化并加入打分?
- 如何在不增加太多延迟的情况下做 score calibration 和阈值更新?
- 线上 A/B 时,如果新路由提升召回但拉高 p99,你会怎么做分流与降级?