证据汇集 — RRF 多源检索与召回优先
证据汇集 — RRF 多源检索与召回优先
日期: 2026-08-18 阶段: Phase 3 - AML 调查 Copilot 标签: #rrf #multi-source-retrieval #recall-first
核心问题
Day 64 定了五段管道,①段「证据汇集」是整条流水线的进水口——后面所有段(类型学比对、SAR 起草)都只能在①段捞上来的证据上工作。Co-Investigator (arXiv 2509, 2025-09) 的 reranker 消融揭示了一条铁律:「with only 20 candidates, reranking is ineffective... as relevant documents are often not in the candidate pool」——第一阶段没召回的证据,下游任何精排都救不回来。
今天回答三个问题:
- 怎么融合多源证据? 一个 AML 案件的证据散在三个源:交易流水(结构化)、KYC 档案(半结构化)、历史告警(文本)。每个源各自检索得到一条 ranked list,怎么融成一条统一证据列表?答案是复用 P2 的
rrfFuse,但要想清楚「每个源当一条 list」的语义。 - 为什么金融证据检索要召回优先? 跟普通 RAG 不同,AML 的代价结构是非对称的——漏一笔关键流水可能导致漏报 SAR(违反 31 C.F.R. 失报责任),多召回几笔无关流水只是让调查员多看两眼。
- 怎么度量检索质量? Recall@K 是第一阶段的核心指标,但 AML 还要叠加「类型学覆盖率」——证据集是否覆盖了触发告警的那条 typology 所需的全部交易。
关键内容
A. 多源证据的 RRF 融合
src/agent/rag/hybridSearch.ts 的 rrfFuse(lists, k) 把若干 ranked list 融成一条。P2 用它融「BM25 列表 + 向量列表」两条。P3 证据汇集的 insight 是:把每个数据源当成一条独立的 ranked list——交易流水检索一条、KYC 检索一条、历史告警检索一条,三条喂进同一个 rrfFuse:
// 证据汇集:三源各自检索 → RRF 融合(复用 rrfFuse 多列表语义)
function gatherEvidence(caseId, query, budget): EvidenceSet {
const txnList = retrieveTxns(caseId, query) // 结构化:账户/时间/金额过滤 + BM25(memo)
const kycList = retrieveKyc(caseId, query) // 半结构化:风险标记/PEP/地理
const alertList = retrievePriorAlerts(caseId, query) // 文本:历史告警叙述 hybrid 检索
// 每源是一条 ranked list;rrfFuse 对空列表自动退化(与 P2 向量缺失同机制)
const fused = rrfFuse([txnList, kycList, alertList], k = LARGE_K)
return { items: fused, source: anyVectorUsed ? 'hybrid' : 'bm25',
recall: estimateRecall(fused, caseId) }
}
RRF 公式(复用 P2,RRF_K = 60):
$$\text{score}(d) = \sum_{\text{list} \in L} \frac{1}{\text{RRF_K} + \text{rank}_{\text{list}}(d)}$$
为什么 RRF 适合多源而非简单拼接?因为三个源的评分量纲不可比——交易流水的 BM25 分、KYC 的风险标记布尔分、历史告警的向量余弦分,数值范围天差地别。RRF 只用名次(rank) 不用原始分,天然消除量纲问题;某个源对该案无关时(如纯结构化案件无历史告警),那条 list 为空,rrfFuse 自动退化为其余两源融合——与 P2「向量缺失即退化为 BM25」是同一机制,无需特判。
T2-RAGBench(金融 QA 检索基准,EACL 2026, arXiv 2604.01733)给了硬证据:在 7,318 份金融文档上,Hybrid RRF (k=60) 的 Recall@10 = 0.801,碾压 BM25 单源 0.735 和 Dense 单源 0.703。融合的增益「largest on challenging subsets... lexical precision capturing exact financial terminology while semantic understanding captures paraphrased context」——金融场景恰恰兼有「精确术语(账号/金额)」和「语义改写(告警叙述)」,这是 RRF 多源的甜区。
| 检索方法 | Recall@5 | Recall@10 | 量纲问题 | 适配 AML 多源 |
|---|---|---|---|---|
| BM25 单源 | 0.644 | 0.735 | 无 | 漏语义改写证据 |
| Dense 单源 | 0.587 | 0.703 | 无 | 漏精确账号/金额 |
| Hybrid RRF (k=60) | 0.695 | 0.801 | 名次免疫 | 兼顾术语+语义 |
| Convex Combo (α=0.5) | 0.716 | — | 需归一化分数 | 多源分数难归一 |
注:Convex Combination 在 Recall@5 上略胜 RRF(0.726 vs 0.716, k=10 口径),但它需要把各源分数归一化到可加——对量纲完全不可比的三源(流水/KYC/告警)反而是负担。RRF 用名次,零归一化成本,故 P3 多源仍选 RRF。
B. 为什么金融证据检索要召回优先
普通 RAG 调 precision(少而准,省 token、防幻觉)。AML 证据检索必须召回优先,根因是代价结构非对称:
- 漏证据(false negative)的代价:漏一笔关键流水 → 类型学比对漏判 → 该报的 SAR 没报 → 违反 31 C.F.R. § 1021.320 失报责任(监管,civil money penalty)。这是机构级合规风险。
- 多召回无关证据(false positive)的代价:调查员多看两笔无关流水 → 多花几十秒。这是个人级时间成本。
两者差了好几个数量级。这决定了①段的 LARGE_K 要设得比普通 RAG 大(over-retrieve),把召回拉满,再靠下游类型学规则引擎(确定性、可解释)做精排——而不是在检索阶段就用 precision 砍掉候选。
T2-RAGBench 的 reranker 消融印证这个分工:「with only 20 candidates, reranking is ineffective... relevant documents are often not in the candidate pool」——精排救不回第一阶段漏掉的证据。hybridSearch.ts 已有 over-retrieve 设计(pool = max(k*4, 20)),P3 证据汇集要把这个倍数调更大。
反直觉洞察(金融调查里,"漏证据"比"多证据"代价大得多——与省 token 的 RAG 直觉相反):通用 RAG 教科书教你「检索越精越好,少喂无关上下文给 LLM」。但 AML 反过来——宁可多召回 30 笔让调查员扫一眼,也不能漏 1 笔触发漏报。原因不是 LLM 怕噪声,而是代价不对称:漏报是机构级监管责任(31 C.F.R. 失报),多召回只是个人级时间。所以①段刻意 over-retrieve、把 precision 推到下游确定性规则引擎(typology.ts)去做——规则引擎漏判可审计、可回归测试,而检索阶段的漏召回是静默的、不可观测的。注意 FinCEN 2025-10 FAQ 澄清「near $10,000 CTR 门槛本身不强制报 SAR,需有 reason to suspect」——召回优先不等于无脑全报,证据要召全,但是否成 SAR 由②③段判,这是召回与判定的职责分离。
C. 检索质量度量
第一阶段检索质量用两个指标,缺一不可:
- Recall@K:召回的证据里,覆盖了多少真正相关的交易。AML 合成数据集(P1 的 66 案金标)每个案件的 ground-truth 触发交易已知,可直接算 Recall@K。
- 类型学覆盖率(typology coverage):AML 特有——证据集是否覆盖了触发告警的那条 typology 规则所需的全部交易。例如 STRUCT-01 需要「≤10 天窗口内 ≥3 笔贴线现金存款」,若①段只召回了 2 笔,②段类型学就判不出 structuring。
// 类型学覆盖率:证据集能否支撑 typology 规则判定
function typologyCoverage(evidence, caseId): number {
const goldTxIds = goldTriggerTxns(caseId) // 金标触发交易
const recalled = new Set(evidence.items.map(e => e.txId))
const hit = goldTxIds.filter(id => recalled.has(id)).length
return hit / goldTxIds.length // 1.0 = 类型学所需证据全召回
}
度量目标设计:Recall@K 是通用召回,typology coverage 是「能否支撑判定」的下游真值。两者关系——高 Recall 不蕴含高 typology coverage:可能召回了一堆相关但非触发的流水,却漏了关键那笔。所以 CI gate 用 typology coverage 而非裸 Recall 当主指标,对齐 B 节「漏触发证据=漏报」的真正代价。
| 指标 | 度量什么 | AML 含义 | CI 用途 |
|---|---|---|---|
| Recall@K | 召回/全部相关 | 证据召得全不全 | 监控 |
| typology coverage | 触发交易召回率 | 能否支撑②段判定 | gate 主指标 |
| source 标记 | hybrid / bm25 | 检索是否降级 | 审计(recall↓留痕) |
设计要点/决策表
| 要点 | 决策 | 理由 |
|---|---|---|
| 多源融合 | 每源一条 list 喂 rrfFuse | 名次免疫量纲,空源自动退化 |
| 融合算法 | RRF(非 Convex Combo) | 三源分数不可比,RRF 零归一化成本 |
| 检索取向 | 召回优先,over-retrieve | 漏报=机构监管责任 ≫ 多召回=个人时间 |
| 精排位置 | 推到下游确定性规则引擎 | 检索漏召回静默不可观测,规则漏判可审计 |
| 质量主指标 | typology coverage(非裸 Recall) | 触发证据召全才能支撑判定 |
| 降级留痕 | source='bm25' 写入审计 | 检索降级=recall 风险,合规要可见 |
对本项目的落地
- 新建
src/aml/evidenceRetrieval.ts:导出gatherEvidence(caseId, query, budget) → EvidenceSet,内部三源各自检索后调rrfFuse(直接 importsrc/agent/rag/hybridSearch.ts的rrfFuse,不重写)。EvidenceSet带source: 'hybrid'|'bm25'与recall字段,喂给 Day 64 的CaseDossier.evidence。 - 复用
rrfFuse:三源(txn/kyc/alert)当三条HybridHit[]喂rrfFuse([...], LARGE_K)。over-retrieve 的LARGE_K设得比 P2 检索大(召回优先),具体值 W2 用 66 案金标调。 - 新建
src/aml/__tests__/evidenceRecall.ts:内嵌 66 案的 ground-truth 触发交易(与retrievalGolden.ts内嵌 golden 同模式),实现 C 节typologyCoverage,CI 断言 typology coverage ≥ 阈值才放行——主指标是 coverage 非裸 Recall。 - 与②段衔接:
gatherEvidence输出的证据集转成AmlCase喂 P1assessCase(src/aml/typology.ts)。召回优先保证 STRUCT-01 等规则所需的「≥3 笔贴线存款」不被检索阶段砍掉。 - 诚实标注:W2 的
LARGE_K倍数与 coverage 阈值用真实 66 案测算后回填,本日只落多源融合接线 + coverage 度量函数 + 单测骨架,不谎称已调优。
参考资料
- Wang et al. — From BM25 to Corrective RAG: Benchmarking Retrieval Strategies for Text-and-Table Documents, arXiv:2604.01733(T2-RAGBench, EACL 2026):7,318 金融文档;Hybrid RRF(k=60) Recall@10=0.801 vs BM25 0.735 vs Dense 0.703;Convex Combo(α=0.5) Recall@5=0.726 略胜 RRF;reranker 在 20 候选下失效(漏召回不可下游恢复)(2026)
- FinCEN — 31 C.F.R. § 1021.320 / SAR FAQs:失报 SAR 属 BSA 报告违规可处 civil money penalty;2025-10 FAQ 澄清「near $10,000 CTR 门槛本身不强制报 SAR,需 reason to suspect」(监管,配 2025-10 近期来源)(2025-10)
- Facctum — AML False Positive Rates 2026 Report:行业 FP 率 85-95%、单告警 20-60 分钟、仅 1-5% 成 SAR(漏报与误报的代价结构)(2026-03)
- RapidAML — False Negative in AML/CFT:漏报使机构暴露于监管/财务/声誉风险;告警疲劳增加漏掉真实可疑活动概率 (2025)
- 本仓库
src/agent/rag/hybridSearch.ts(rrfFuse 多列表融合 + over-retrieve pool)、src/aml/typology.ts(STRUCT/LAYER/MULE 规则的证据需求)、src/agent/eval/retrievalGolden.ts(内嵌 golden 模式)(2026-06)
SOTA 检查 (2026-06-11)
- RRF 仍是 2026-06 多源混合检索的默认融合算法:T2-RAGBench (2026) 证实 Hybrid RRF 在金融文档上稳定优于单源;Convex Combination 在某些 Recall@5 口径略胜,但需分数归一化——对量纲不可比的多源证据反成负担。本项目多源选 RRF 的「零归一化」理由在 2026-06 仍成立。
- 「召回优先 + 下游确定性精排」是 AML 检索的合规共识:漏报的监管代价(31 C.F.R. 失报)远大于多召回的时间代价,这一非对称在 2026 未变;FinCEN 2025-10 FAQ 的「门槛≠强制报 SAR」进一步明确召回与判定职责分离。
- 待跟踪:neural rank fusion(学习式融合,替代固定 RRF_K=60)在 2025-2026 升温(rohan-paul 2025),若证据源增多(>3)且各源质量差异大,固定 RRF 可能不如学习权重——W2 调
LARGE_K时评估是否需要按源加权(但会牺牲 RRF 的可解释性,合规场景慎用)。 - 过时警示:把 AML 证据检索当普通「precision-first RAG」调(少召回省 token)是错配代价结构的踩坑——B 节反直觉洞察是 live 的,2026 通用 RAG 教程仍默认 precision 优先,AML 必须显式反转。