返回 AICAP-180
B13 · Day 127FATF typologies + BSA grader + 用户研究

规则 vs LLM 召回缺口分析

B13 到这里,三套预测已经齐了:Day 122-123 的规则混淆矩阵、Day 124-126 的 LLM 混淆矩阵(DeepSeek-V4 / Qwen3)。前面都在「各自把分数算出来」,今天做对比与归因:逐 typology 算 recall delta = recall(规则) − recall(LLM),看清楚「哪一类规则赢、哪一类 LLM 赢、为什么」。这是 B1→B18 能力曲线上「

阶段: B13 · FATF typologies + BSA grader + 用户研究(Day 121-130) 标签: #recall-delta #failure-taxonomy #rule-vs-llm #error-attribution

今日导引(由浅入深)

B13 到这里,三套预测已经齐了:Day 122-123 的规则混淆矩阵、Day 124-126 的 LLM 混淆矩阵(DeepSeek-V4 / Qwen3)。前面都在「各自把分数算出来」,今天做对比与归因:逐 typology 算 recall delta = recall(规则) − recall(LLM),看清楚「哪一类规则赢、哪一类 LLM 赢、为什么」。这是 B1→B18 能力曲线上「从测量到诊断」的一档——光有数字不值钱,能把数字归因到 prompt 缺陷 / 数据歧义 / 模型能力三类失败上,才是 Solutions Architect 的判断力。

为什么紧接昨天:Day 126 产出了规则与 LLM 两套独立的混淆矩阵 + 模型间 κ,今天正好把它们摆到一起做差并归因。为什么通向明天:Day 128-129 转向用户研究,而本日的「哪类规则赢、哪类 LLM 赢」结论,会直接进 Day 130 的收口报告,成为「规则 vs LLM 选型」的证据。今天的最小可判定产出:一张 5 行的 per-typology recall delta 表(committed),每行带 support 与归因。

1. 机理精读

为什么要做规则 vs LLM 对比,而不是直接选 LLM。 一个常见的错误直觉是「LLM 更聪明,全用 LLM 就好」。但 AML 是受监管场景:监管要求可解释、可审计。规则引擎(assessCase,typology.ts:321)的每条命中都带具体阈值与证据交易 id,能直接写进 SAR 草稿;LLM 的判定是黑盒。所以真正的工程问题不是「谁更准」,而是「哪类该用规则(可解释 + 召回够)、哪类必须上 LLM(规则召回不住)」。recall delta 表正是这个 build-vs-use 选型的量化依据——这才是 Solutions Architect 要交付的判断,而非「LLM 赢了」的简单结论。

recall delta 是什么、为什么是 recall 而非 accuracy。 AML 场景强偏 recall(Day 123 已立):漏报一笔洗钱的监管 / 声誉代价远高于一次误报的人工复核成本。所以对比规则与 LLM,第一刀切在 recall:

delta(t) = recall_rule(t) − recall_llm(t)

正值表示该类规则召回更高,负值表示 LLM 更高。逐类型学算(per-typology),而不是看宏平均,因为不同类型学的可观测签名结构完全不同——把它们平均成一个数,恰好抹掉「规则赢硬阈值类、LLM 赢语义类」这个最有价值的对比信号。

为什么不直接比 accuracy?因为类别极不平衡:normal 占多数,一个「全判 normal」的分类器 accuracy 可以很高却 recall 几乎为零(一笔洗钱都没抓到)。accuracy 在 AML 里是个会骗人的指标,必须看每个 typology 的 recall。delta 也要逐类报,不能合成一个全局 delta。

为什么预期 LLM 与规则各擅其类。 这是由签名的「可阈值化程度」决定的:

  • structuring(贴线小额密集)是硬阈值类checkStruct01(typology.ts:86)把它编码成「单笔 $8,000-$9,999(STRUCT_BAND_MIN_CENTS ~ CTR_THRESHOLD_CENTS)、10 天窗口内 ≥3 笔」的确定性规则,规则在这类上应该召回高、且无歧义。LLM 反而可能因为「过度推理」把正常的多笔现金存款也判成 structuring,或漏掉刚好贴线的边界 case。
  • layering / TBML(多跳过账图、贸易语义)是语义 / 图推断类。规则的 checkLayer01(typology.ts:150)虽然做了递归 follow 链式追踪,但它依赖固定的停留天数(LAYER_DWELL_DAYS=2)、转出比例(LAYER_FORWARD_RATIO=0.8)、最小链长(LAYER_MIN_CHAIN_ACCOUNTS=3)阈值,对「故意把停留拉到第 3 天、转出压到 75%」这种绕阈值变体脆弱;LLM 能从交易备注、对手名、金额模式里读出规则没编码的语义线索,预期在这类上召回更高。
  • mule_network 介于两者之间:checkMule01(typology.ts:253)用扇入对手数(≥5)+ 快进快出比例(≥60%)这种半图半阈值签名,delta 方向取决于具体 case 是否落在阈值附近。

所以 delta 在 structuring 上应为正(规则赢),在 layering / TBML 上应为负(LLM 赢)。这个预期本身就是一个可证伪的假设——如果实测 delta 与预期相反,那是个信号,要回去查 prompt 或规则,而不是默默接受。

失败归因映射到失败分类法(failure taxonomy)。 算出 delta 只是第一步,关键是把每个误判 case 归到一类失败原因上:

  1. prompt 缺陷:rubric 没说清边界、few-shot 例子有偏 → LLM 系统性错某类。可改 prompt 修复。
  2. 数据歧义:该 case 本身真值标签可疑(叠加洗钱、边界 case),两个模型都错且错法一致 → 不是模型的锅,是数据。
  3. 模型能力:prompt 清晰、数据无歧义,但模型就是推不出来 → 换模型或加推理步骤才能修。

这三类的处置动作完全不同:

失败类判别信号处置动作
prompt 缺陷LLM 系统性错某类、rubric 边界模糊改 prompt / 加 few-shot 例
数据歧义两模型一致错、真值标签可疑(叠加洗钱)复核真值 / 标为难例
模型能力prompt 清晰、数据无歧义,模型仍推不出换模型 / 加推理步骤

混在一起报「准确率低」就丧失了可操作性。Day 126 的模型间 κ 在这里直接派上用场:两模型一致地错 → 倾向数据歧义或 prompt 缺陷;两模型各自不同地错 → 倾向模型能力差异。这正是昨天引入第二裁判的回报——没有 Qwen3,无法把「数据/prompt 锅」与「模型锅」分开。

与相邻概念的边界,以及一个诚实标注。 计划里曾设想用 failureTaxonomy.ts 自动把误判 case 归类,但该文件在当前 repo 中尚未建(外部动作 / 待建)。所以本日的失败归因先以手工分类记录进行,不依赖该文件——不得在笔记里引用一个不存在的函数名。confusionMatrix.tsClassMetrics 提供 per-class recall,这是真实存在的、已 tested 的,delta 表就建在它之上。

这条边界本身也是一个 Solutions Architect 的纪律:区分「已建工具」与「计划中工具」。delta 计算用的是确定性纯函数(confusionMatrix),可复算、可进报告;失败归因暂为人工,是质性判断,要标清楚「手工、可能有主观」。把两者混为一谈、或假装归因已自动化,就是在给作品集注水。日后若真建了 failureTaxonomy.ts,应把手工归因迁成代码型可复算归因,并保留迁移前后的对照。

recall delta 与 Day 126 模型间 κ 的协同。 delta 告诉你「规则和 LLM 谁在哪类赢」,但不告诉你「LLM 输的那类是 prompt 锅还是模型锅」。模型间 κ 补上这块:同一类上若两 LLM 高度一致(高 κ)却都输给规则,问题大概率在 prompt 或数据(系统性);若两 LLM 彼此分歧(低 κ),问题在模型能力。两个信号叠起来才能给出可操作的归因。

2. 推导 / 手算 / 代码走读

src/aml/confusionMatrix.ts 已 BUILT,今天靠它的 ClassMetrics 出 delta 表。走读要点:

  • confusionMatrix(items) 返回的 perClass: ClassMetrics[](confusionMatrix.ts:38-49)里每个元素带 recall = tp/support(confusionMatrix.ts:44)。规则矩阵与 LLM 矩阵分别跑一次,同一 typology 的 support 必须相等(同一组真值),否则两个 recall 不在同一分母上,delta 无意义。
  • 取规则矩阵的 perClass.find(m => m.label === t).recall 减去 LLM 矩阵对应类的 recall,逐 t ∈ {structuring, layering, mule_network, ...} 得到 delta。labelsconfusionMatrix 自动从 items 去重排序(confusionMatrix.ts:29),两套矩阵的标签集应一致;若 LLM 幻觉出额外标签,会多出列,需在合表时对齐。
  • macroRecall(confusionMatrix.ts:59)是各类 recall 的简单平均,可用作「整体规则 vs LLM 谁更召回」的单一数字,但不能替代逐类 delta——宏平均会被某一类的大 delta 掩盖方向相反的另一类。
  • support(confusionMatrix.ts:40,行和)告诉你每类真值有多少条。delta 可信度直接受 support 限制:某 typology 真值只有十几条时(参考 GOLDEN_COUNTS:layering=15、mule_network=15),recall 的最小可分辨步长就是 1/15 ≈ 6.7pp,单条对错都会让 recall 跳一档,delta 自然抖。
  • 矩阵的非对角元素(matrix[truth][predicted],confusionMatrix.ts:35)告诉你误判方向:比如规则把多少 layering 误判成了 mule_network。归因时这比单看 recall 更有信息——方向集中说明两类签名混淆,方向分散说明随机噪声。

一个 delta 读法的小推演(占位数字,非实测):

  • 设规则在 structuring 上 recall=0.90、LLM=0.70 → delta=+0.20,规则赢,符合「硬阈值类规则强」预期;归因:LLM 把贴线存款的边界 case 当正常漏掉了(prompt 缺陷,可补 few-shot)。
  • 设规则在 layering 上 recall=0.60、LLM=0.80 → delta=−0.20,LLM 赢,符合「语义/图类 LLM 强」预期;归因:规则的 LAYER_DWELL_DAYS=2 阈值漏掉了停留 3 天的变体(规则脆弱,需放宽或交给 LLM)。
  • 若实测出现 structuring delta 为负(LLM 反而赢硬阈值类),那是反预期信号:要么规则阈值设错,要么真值标注有问题,必须回查,不能默默接受。

手算 delta 表的示例(数字为占位说明结构,非实测):

typologyrecall(规则)recall(LLM)delta=规则−LLM倾向
structuring假设 r_s1假设 r_s2r_s1−r_s2 (预期 >0)规则赢(硬阈值)
layering假设 r_l1假设 r_l2r_l1−r_l2 (预期 <0)LLM 赢(图/语义)
mule_network假设 r_m1假设 r_m2r_m1−r_m2视签名结构

真实数字 = 待跑(需 Day 123 + Day 126 两套矩阵落盘),此处只示意表结构与归因列。

为什么 delta 必须配 CI——一个量纲推演。 假设 layering 实测 delta = +15pp,看着 LLM 明显输。但 layering support 只有 ~15 条(GOLDEN_COUNTS.layering=15),两个 recall 各自的标准误就很大,delta 的置信区间很可能跨过 0。这与 B17 A/B 实验的 N=29 power 教训同构:Δ+10.3pp 95% CI[0,20.7] 在 N=29 上不显著——区间下界压到 0,说明「LLM 更好」这个结论统计上站不住。同理,在 200 抽样、单类 support 十几条的 delta 上,绝不能凭点估计下「LLM 在 layering 上更强」的结论,必须放大 N 或报 CI。这条纪律是 B13→B14 必须带过去的。

3. 今日实战

  1. 合并 Day 123 的规则版 5×5 矩阵与 Day 126 的 LLM 版(DeepSeek-V4,可并列 Qwen3)5×5 矩阵,两者跑在同一 200 抽样的真值上(核对每类 support 一致)。
  2. src/aml/confusionMatrix.tsClassMetrics.recall 逐 typology 算 delta = recall(规则) − recall(LLM),整理成 5 行表,committed;每行附该类 support 以提示 delta 可信度。
  3. 对 delta 绝对值大的类,手工抽 3-5 个误判 case,按 prompt 缺陷 / 数据歧义 / 模型能力三类做手工归因记录(不依赖未建的 failureTaxonomy.ts),并记下误判方向(从矩阵非对角元素读)。
  4. 结合 Day 126 的模型间 κ:两模型一致错的 case 优先归到数据 / prompt,分歧错的归到模型能力。
  5. 在表注里写明:本 delta 基于单次 200 抽样、单类 support 十几条,结论需配 CI 或放大 N(B14 接外部 ground-truth 后重算)。

4. 今日实测 / 产出

  • src/aml/confusionMatrix.tsBUILT
  • recall delta 表(5 行数字)= 待跑(需 Day 123 + Day 126 两矩阵)
  • failureTaxonomy.ts 在当前 repo 中尚未建(外部动作 / 待建);失败归因本日先以手工分类记录进行,不依赖该文件。
  • 模型 id:DeepSeek 侧 deepseek-v4-pro / deepseek-v4-flash,Qwen3 经 OpenRouter——两套 LLM 矩阵均待 key 跑(继承 Day 124-126 的 gated 状态),delta 表随之待跑。

5. 常见误区 / 陷阱

  • 据单次 200 抽样的 delta 下结论:样本量小,delta 需配 CI 或更大 N。参照 B17 A/B 的 N=29 power 教训——Δ+10.3pp 95% CI[0,20.7] 在 N=29 不显著;同理一个看着 +15pp 的 delta,N 小就可能跨过 0。
  • 引用不存在的 failureTaxonomy.ts:该文件未建,编造其函数名即作废;用手工归因。
  • 两套矩阵真值不一致:规则与 LLM 必须跑同一组 case_id 的同一真值,否则 recall 不可减。
  • 只看宏平均 delta:会掩盖「structuring 规则赢、layering LLM 赢」这种方向相反、相互抵消的关键信号。
  • 不看误判方向:只看 recall 不看矩阵非对角,会漏掉「layering 被系统性误判成 mule」这种可定位的混淆。
  • 把手工归因当自动归因failureTaxonomy.ts 未建,归因是质性手工判断,结论要标主观,不能伪装成代码可复算。

6. 学习资源(每条带 YYYY-MM)

  • Anthropic《Demystifying evals》(2026-01) — 失败归因(failure attribution)与 rubric 缺陷 vs 数据歧义 vs 模型能力的区分,本日归因框架来源。
  • IBM AMLworld dataset card (Kaggle, 2024-04) — typology 真值标签来源,delta 的真值底座。
  • FinCEN, "FFIEC BSA/AML Examination Manual" (2021-08,执行日查最新修订) — structuring / layering / mule 的监管定义,校准规则签名与真值类别的依据。
  • "The Confusion Matrix and per-class metrics" — recall / precision / F1 经典定义(打底,无版本依赖)。

SOTA检查 (2026-06 更新)

  • 当前主流:per-class recall delta 分析法 + 失败分类法归因仍是 2026 评测工程的稳定做法,无替代。
  • 是否仍 SOTA:是。「先算逐类指标、再做误判归因」是 model-vs-rule 选型的标准流程。
  • 过时黑名单:避免只报单一 accuracy(类别极不平衡时被 normal 多数类淹没);避免据小样本 delta 下结论而不配 CI(B17 N=29 教训:Δ+10.3pp CI[0,20.7] 不显著);避免引用未建的 failureTaxonomy.ts 自动归因;避免把「LLM 在 layering 上更强」这类单次小样本结论当定论。
  • 方法演进提示:2025-2026 出现的 LLM-as-judge + 失败聚类(clustering of failures)可半自动化归因,但仍需人工核对聚类语义,不取代本日的手工三分类框架。
  • 下次复查点:执行跑批当周(需 key)重验 DeepSeek-V4 / Qwen3 模型 id(legacy deepseek-chat / deepseek-reasoner 2026-07-24 退役);B14 接外部 ground-truth(AMLworld / Elliptic)后用更大 N 重算 delta;若日后真建了 failureTaxonomy.ts,把手工归因迁到代码型可复算归因。

衔接

  • 昨天:Day 126 — Qwen3 对照与模型间一致性(第二套 LLM 矩阵 + 模型间 κ)。
  • 今天:合并规则矩阵与 LLM 矩阵,逐 typology 算 recall delta 并手工归因失败(prompt / 数据 / 模型三分类)。
  • 明天:Day 128 — M6 用户研究:survey 设计(从定量 eval 转向定性用户研究的工具搭建,补「数字回答不了的需求」短板)。