FATF 五大类型学签名
在 B1→B18 的能力曲线上,B12(D111-120)刚把「模型策略 memo」收口——回答「该不该换模型、补什么数据、用什么指标验收」。但那条线上一直有个隐患:眼下的 AML eval 用的是合成数据自己生成、自己当真值,外部效度薄弱。
阶段: B13 · FATF typologies + BSA grader + 用户研究(Day 121-130) 标签: #aml #fatf-typologies #synthetic-data #ground-truth
今日导引(由浅入深)
在 B1→B18 的能力曲线上,B12(D111-120)刚把「模型策略 memo」收口——回答「该不该换模型、补什么数据、用什么指标验收」。但那条线上一直有个隐患:眼下的 AML eval 用的是合成数据自己生成、自己当真值,外部效度薄弱。
B13 这十天就是来补这块的——把抽象的 FATF 洗钱类型学落成带真值标签的可标注数据,再用规则/LLM 两套分类器去打,最后用混淆矩阵+κ 度量。
今天是这条线的起点:先搞清楚「五大类型学各自长什么样(可观测签名)」,再把它落成每行带 Is_Laundering/typology 真值的数据集。这是 B14「外部 ground-truth AML eval」的数据前置——没有带真值的数据,外部评测无从谈起。
今天的最小可判定产出是:确认本仓 src/aml/generator.ts 的 typed/golden 生成路径在位,并规划出 5×200 行 labeled CSV 的导出方案。
1. 机理精读
FATF 五大类型学,每条都有「可观测签名」。 反洗钱不是凭感觉,每种洗钱手法在交易流水上都留下结构化痕迹:
- structuring(结构化拆分):把一笔大额现金拆成多笔,每笔刻意压在 $10,000 CTR 申报门槛之下(典型 $8,000–$9,900),并挤在短窗口内完成。可观测签名 = 临界阈值下的密集小额现金存款。
- layering(分层过账):资金在多个账户间链式转移以切断溯源,每跳停留极短、转出比例高、金额常被「整千化」。可观测签名 = 高扇出/链式的转账图,每跳快进快出。
- integration(并入合法经济):把洗白后的资金注入看似合法的经营(房产、商户营收)。签名最隐蔽——往往要结合外部资产/营收数据才看得出,纯流水层面接近正常。
- TBML(贸易型洗钱):借虚开发票、错配价格的国际贸易转移价值。签名 = 贸易单据与资金流的金额/品类错配,纯单笔阈值无法捕获。
- money mule(资金骡子):招募「骡子」账户做中转。签名 = 短停留、转入即转出的新户,扇入多个小额、随后一两笔大额转出。
五条签名按「检测难度」排序大致是:structuring(单账户阈值,最易)< mule(单账户图度量)< layering(多账户转账图)< TBML(跨单据关系)< integration(需外部资产数据,最难)。
难度递增的根本原因是所需观测范围越来越大——从单笔金额,到单账户图,到多账户图,再到交易流水之外的单据/资产。这条难度曲线直接决定了本批的取舍:先攻可纯流水观测的三类(structuring/layering/mule),把 integration/TBML 留到接入外部数据源之后。
为什么要把抽象类型学转成「带标签的数据」。 类型学本身是文字描述,机器学不会、eval 也没法算召回。关键的桥梁是合成集 + 真值标签:给每条流水(或每个案件)打上 Is_Laundering 与具体 typology 列,抽象签名就变成了可标注、可评测的监督信号。
IBM 的 AMLworld 合成集(Kaggle, 2024-04)正是这么做的——它用 8 种注入模式生成带 Is_Laundering 真值的交易,是「把 FATF 文字签名转成可标注数据」的范式样本。本仓的合成生成器是它的轻量自建对应物:用 seeded PRNG 确定性注入模式,每个 case 的 label 字段就是 ground truth。
关键权衡:单笔阈值 vs 图级特征。 五大类型学里,structuring/CTR 这类是单笔/单账户阈值可捕获的(金额低于 $10k、窗口内笔数);但 layering 和 TBML 的本质是图结构/跨单据关系——layering 的「链式过账」必须看账户间的转账图,TBML 必须看单据与资金的配对。
若把所有检测都退化成「单笔金额阈值」,就会系统性漏掉这两类。这是今天的核心边界:保留图级特征,不要把类型学检测压扁成阈值规则。
把五类签名与「可观测特征 / 检测层级 / 本仓覆盖」对齐成一张表,便于后续 Day 122 规则分类器选层级:
| 类型学 | 可观测签名 | 检测层级 | 本仓覆盖 |
|---|---|---|---|
| structuring | 临界阈值下密集小额现金存款 | 单账户 + 窗口阈值 | ✅ genStructuringCase |
| layering | 链式高扇出、每跳快进快出、整千化 | 账户转账图 | ✅ genLayeringCase |
| integration | 资金并入合法经营,流水近正常 | 需外部资产/营收数据 | ⬜ 规划态留白 |
| TBML | 单据与资金的金额/品类错配 | 跨单据关系 | ⬜ 规划态留白 |
| money mule | 新户短停留、扇入多小额→扇出大额 | 单账户图度量 | ✅ genMuleCase |
表里两个「⬜」(integration/TBML)不是疏漏,而是诚实的能力边界——它们依赖纯交易流水之外的数据(资产登记、贸易单据),本批用图级/单据级特征占位,待后续接入外部数据源才能真正注入。
为什么真值标签是整条 B13 链的地基。 没有 ground-truth typology 列,后面每一步都塌:
- Day 123 的混淆矩阵需要
{label, predicted}对——label就是真值,缺它无法算 recall/precision。 - Day 125 的 Cohen's κ 需要「真值 vs LLM 标签」两列——真值是其中一列的来源。
- B14 的外部 ground-truth eval 直接以真值为锚——这正是要替换「规则评规则」循环的根据。
- 所以今天的真值标签必须与生成时注入的模式严格对齐(直接取
case.label),不能事后重打标,否则引入标注噪声、污染整条度量链。
与相邻概念的边界。 今天 ≠ 写分类器(那是 Day 122 的 BSA 规则分类器);今天 ≠ 算召回(那是 Day 123 的混淆矩阵);今天只回答「五大类型学各自的可观测签名是什么、怎样把它落成带真值标签的数据」。
本仓的合成生成器已经实现了 structuring/layering/mule_network/normal 四类的确定性注入,今天把它对齐到 FATF 五大签名的语言上——把工程里的 case label 翻译回 FATF 报告里的类型学术语。
2. 代码走读:本仓的 typed/golden 生成器
Read 了 src/aml/generator.ts,确认 typed 模式生成路径与真值标签机制真实存在:
generateDataset(config: GeneratorConfig): AmlDataset— 按LABEL_ORDER = ['structuring','layering','mule_network','normal']顺序,对每个 label 调用对应的genXxxCase生成器,用 seeded PRNG(createPrng(config.seed))确定性产出。每个 case 的label字段就是 ground-truth typology——这是「带真值标签」的落点。genStructuringCase(ctx)— 注入 4–8 笔 $8,000–$9,900 现金存款、全部落在 ≤10 天窗口内(windowStart + r.range(0,10),跨度 ≤9)。这就是 structuring「临界阈值下密集小额」签名的代码化。genLayeringCase(ctx)— 链头外部电汇流入($15k–$40k 整千),随后经 3–5 个内部账户链式过账,每跳停留 ≤2 天、转出 ≥80%(amountK -= r.range(1,3),整千化),链尾对外转出。- 内部过账记为一条
channel:'internal'的 debit(带counterpartyAccountId指向下一跳账户)——这正是 layering 的图结构特征,不是单笔阈值。要把这条特征导出到 CSV 时,必须保留账户对而非只保金额,否则规则/LLM 都无法重建链路。 genMuleCase(ctx)— 新户(openedDaysAgo18–29 <30 天),≤14 天内收 6–9 个不同外部对手的小额($300–$2,000)fan-in,随后 1–2 笔大额转出(约流入 85%–95%)。对应 money mule 的「短停留、扇入扇出」签名。getGoldenDataset()— 模块级 memoize,按GOLDEN_COUNTS = { structuring:18, layering:15, mule_network:15, normal:18 }生成 66 案件的金标集(seed'aipa-golden-v1'),同进程内返回同一引用。getGoldenDatasetV11()— 在金标 v1 的 66 案之上补 14 个难例(边界 $9,900 贴线、长链 layering 5+ 跳、混合 struct+layer 干扰)至 80 案,独立 seed'aipa-golden-v11',getHardCaseMeta()暴露每个难例的类别与金标 label。这些难例专门压在判定边界上,让 eval 非平凡。
走读结论:getGoldenDataset/GOLDEN_COUNTS 真实存在且 built+tested;本仓覆盖了五大类型学中可纯交易流水观测的三类(structuring/layering/mule)+ normal 阴性,integration/TBML 因依赖外部资产/单据数据本仓暂以规划态留白。
今天要做的导出,是把 typed 生成路径的 case label 拍平成每行带真值 typology 列的 CSV——生成器内部已经知道每个 case 是什么类型学(case.label),导出只是把这个真值显式落到 CSV 列上,供后续规则/LLM 分类器对照。
3. 今日实战
- 在
src/aml/generator.ts已有getGoldenDataset()/GOLDEN_COUNTS的基础上,确认 typed 模式生成路径(generateDataset→genStructuringCase/genLayeringCase/genMuleCase/genNormalCase)确定性可复现。 - 按计划从 AMLSim 配置导出 5 类各 200 笔 = 1000 行 labeled CSV 到
agent-evals/amlsim/typed.csv,每行带真值 typology 列(与 case.label 对齐)。 - 把五类对齐到 FATF 签名语言:structuring(临界阈值密集小额)、layering(链式高扇出)、mule(扇入扇出短停留),并明确 integration/TBML 因需外部数据本批留作图级/单据级特征的占位。
- 确认导出保留图级字段(账户对、
counterpartyAccountId、跳数),不要把 layering 拍成单笔金额——否则 Day 123 的 per-typology 召回会系统性低估 layering。 - 记录每类真值计数(structuring/layering/mule/normal 各多少),供 Day 123 算 support 与判断类别平衡度——若导出比例与金标
GOLDEN_COUNTS差异大,要在 eval 报告里标注,避免 macro 指标被某类样本量过少(如某类只有几条)带来的高方差误导。
4. 今日实测 / 产出
- 已完成:
src/aml/generator.ts的 typed/golden 生成器已 BUILT+tested(getGoldenDataset真实存在,getGoldenDatasetV11补难例至 80 案)。 - 待跑:
agent-evals/amlsim/typed.csv1000 行导出 = 待跑(需 AMLSim 配置落盘),将产出 5×200 行带真值 typology 标签的 CSV。 - 状态诚实:导出未落盘前不得宣称 1000 行已就绪;金标集(66/80 案)是已有产物,AMLSim 1000 行是本批计划新增物,两者不要混淆。
- 可立即验证的中间产物:
getGoldenDataset()返回的 66 案 +getGoldenDatasetV11()的 80 案确定性可复现(同 seed 同输出),可先在这套小金标上跑通 Day 122-123 的规则→矩阵管线,待 AMLSim 1000 行落盘后再扩到大集。这样即使大集待跑,整条 B13 管线已能端到端走通一遍。
5. 常见误区 / 陷阱
- 把单纯阈值规则当成「类型学检测」:layering/TBML 的图结构特征无法用单笔阈值捕获——只看「金额 <$10k」会漏掉所有链式过账。必须保留图级特征(账户对、跳数、扇入扇出)。
- 把合成数据当真实数据宣传:本仓与 AMLworld 都是合成(synthetic)集,所有人名/商户/交易由确定性 PRNG 生成,不含真实客户信息——任何对外叙事都要诚实标注「合成」。
- 类别比例失衡不自知:金标集 normal 占 18/66、洗钱类各 15–18,若导出时不记录每类真值计数,Day 123 算 per-typology recall 时会被多数类淹没。
- typology 列与 case.label 不一致:导出 CSV 的真值列必须直接取
case.label,自己重新打标会引入标注噪声,破坏「真值」语义。 - 把 1000 行导出说成已就绪:
agent-evals/amlsim/typed.csv是待跑(需 AMLSim 配置落盘),金标 66/80 案才是已有产物。两者不要混淆——待跑的就写待跑,这是这套笔记的诚信底线。
6. 学习资源(每条带 YYYY-MM)
- IBM AMLworld dataset(Kaggle, 2024-04):带
Is_Laundering真值的合成 AML 交易集,8 种注入模式,五大类型学转可标注数据的范式。 - FATF — Money Laundering Typologies 系列报告(FATF 官网,持续更新,执行当周复查最新版):structuring/layering/integration/TBML/mule 的权威定义。
- Anthropic — Demystifying evals(2026-01):「带真值标签的评测集」是可信 eval 的前提。
- 本仓代码:
src/aml/generator.ts(getGoldenDataset/GOLDEN_COUNTS/getGoldenDatasetV11,已 built+tested)。
SOTA检查 (2026-06 更新)
- 现役主线:AMLworld(2024-04)仍是当前主流公开 AML 合成集,语义稳定可用,是 2026 年学界/工程做 AML 检测 eval 的常用 ground-truth 来源。本仓自建合成生成器(确定性 PRNG + 真值 label)是对它的轻量自建对应物。
- 避免/禁用:避免把单笔阈值规则当「类型学检测」——layering/TBML 的图/单据结构特征不能用单笔阈值捕获;避免把合成数据当真实数据宣传。
- 下次复查点:执行当周 WebSearch 「AMLworld dataset 2026 update」与「FATF typologies 2026」,确认 AMLworld 是否有新版、FATF 类型学定义有无修订;复查本仓金标集计数是否仍为 66(v1)/80(v1.1)。
自测问答(讲得出才算掌握)
- Q:为什么 structuring 能用阈值规则抓,layering 不能? A:structuring 的签名是单账户/窗口内的金额阈值(贴 $10k 下沿的密集小额),单笔/单账户可量化;layering 的签名是账户间的链式转账图——必须看跳数、停留、转出比例的拓扑关系,单笔金额阈值会漏掉全部多跳过账。
- Q:本仓为什么只覆盖 5 类里的 3 类(+normal)?
A:structuring/layering/mule 可纯交易流水观测,本仓
genXxxCase已确定性注入;integration(并入合法经营)与 TBML(贸易单据错配)依赖交易流水之外的资产/单据数据,本批留作图级/单据级占位,待接外部数据源。 - Q:合成数据的真值标签从哪来?为什么不能事后重打标?
A:真值直接取生成时注入的
case.label(生成器知道自己注入了什么模式)。事后重打标等于再跑一遍分类器,会引入标注噪声,破坏「真值」语义,污染 Day 123 召回与 Day 125 的 κ。 - Q:合成集和真实交易集做 AML eval,本质差别在哪? A:合成集真值确定、可复现、零隐私风险,适合把管线端到端跑通和回归测试;但它的模式是「我注入了什么就能抓什么」,外部效度有限。真实集(或 AMLworld 这类公开合成集)模式更杂、更接近生产分布,是 B14 要补的外部 ground-truth——两者互补,先用本仓合成集打通管线,再用外部集验证泛化。
衔接
- 昨天:Day 120 — 模型策略 memo(把 base/tuned Δ、能力 gap、数据构造串成一页决策 memo,B12 收口)。
- 今天:把 FATF 五大洗钱类型学的可观测签名落成带真值标签的数据,确认本仓 typed/golden 生成路径在位。
- 明天:Day 122 — BSA 报告机制与阈值(CTR/SAR/OFAC/PEP,写 5 条确定性规则分类器跑 typed.csv)。