返回 AIPA 笔记
AIPA Day 72

SAR 叙述 LLM 化 I — 引用锚点与闭世界幻觉防护

SAR 叙述 LLM 化 I — 引用锚点与闭世界幻觉防护

2026-08-25
sar-llmcitation-anchorclosed-worldgrounded-generation

日期: 2026-08-25 阶段: Phase 3 - AML 调查 Copilot 标签: #sar-llm #citation-anchor #closed-world #grounded-generation

核心问题

Day 71 把规则模板钉死成确定性基线——它笨、但永不幻觉。今天上 LLM 写 SAR 叙述,要回答的核心问题是:LLM 能不能在「写得比模板流畅」的同时,保住模板那条「每个数字都可溯源、零幻觉」的合规红线?

SAR 是要提交 FinCEN 的法律文书。LLM SAR 里只要出现一笔案件里不存在的交易、一个对不上的金额、一个编造的对手方,就不是"写得不好"——是合规事故,可能导致 SAR 失效、机构被处罚。所以今天的设计不是"怎么让 LLM 写得好",而是"怎么从结构上让 LLM 不可能编造事实"。

三件事讲透:

  1. 草稿 prompt 的结构化设计:证据逐条引用、资金流叙述、类型学命中说明三块各有 schema 约束,把"自由发挥"的空间压到只剩"措辞流畅度"。
  2. 每段落带证据引用锚点:每个事实断言(claim)必须挂一个 (txId, field) 锚点,指向案件里真实存在的交易字段。无锚点的断言一律拒绝。
  3. 闭世界幻觉防护(closed-world):LLM 只能引用"证据表里存在的交易",任何证据表外的引用直接判为幻觉、触发重试或降级回模板。

关键内容

A. 草稿 prompt 设计:把自由发挥压到只剩"措辞"

LLM 幻觉的根因是"信息缺口处的概率填空"——当 prompt 要求一个值、而上下文没提供时,模型会编一个似真的(ServiceNow Béchard & Marquez Ayala, 2024-04:required 字段缺信息时模型"hallucinate values")。SAR 防幻觉的第一原则因此是:让 LLM 没有"需要编"的缺口。做法是把证据预先结构化喂进 prompt(RAG-for-structured-output 思路),LLM 只做"重组+润色",不做"检索+推断"。

prompt 分三段,每段都给 LLM"现成的料",并约束输出 schema:

[系统段 — 角色与铁律]
你是 AML 调查员的 SAR 起草助手。铁律(违反即作废):
 1. 只能使用 <evidence> 中提供的交易与得分,禁止引入任何外部知识。
 2. 每个涉及金额/日期/对手/账户的句子,必须在句末附 ⟦txId:field⟧ 锚点。
 3. 不确定或证据未覆盖的内容,写"证据未涵盖",禁止推测。
 4. 输出严格符合给定 JSON schema;缺信息的字段填 null,禁止编值。

[证据段 — 闭世界事实表]
<evidence case="C037" label-hidden="true">
  transactions: [{id:T0012, dayOffset:2, channel:cash, amountCents:920000,
                  direction:credit, counterparty:"现金存款"}, ...]   ← 仅 cited 子集
  typology_hits: [{ruleId:STRUCT-01, typology:structuring,
                   score:0.6, evidenceTxIds:[T0012,T0013,T0014],
                   description:"3 笔现金存款均低于 $10,000 阈值"}]
  scores: {structuring:0.85, layering:0.0, mule_network:0.1}
  threshold: 0.5
</evidence>

[任务段 — 结构化输出契约]
生成 SAR 草稿 JSON:
 { who:{text, anchors[]}, what_when_where:{text, anchors[]},
   why:{text, anchors[]}, how:{text, anchors[]},
   summary:{text, anchors[]} }
 anchors[] 元素形如 {txId, field, claim},claim 为该锚点支撑的原子断言。

三块对应 SAR 的法定结构,但每块的"事实自由度"被锁死:

prompt 块LLM 被允许做什么被禁止做什么(schema/铁律拦截)
证据逐条引用(what/when/where)<evidence> 交易组织成流畅时序叙述引入证据表外的交易/金额/日期
资金流叙述(how)用自然语言描述 fan-in/fan-out、链式过账推断证据未显示的资金路径
类型学命中说明(why)ruleId+description+score 翻译成人话编造未命中的类型学 / 改动得分

核心设计哲学:LLM 的增值口子只开在"措辞流畅度"和"模式可读性",事实层全部预填。这正是 Day 71 划出的边界——模板的弱项(干瘪)交给 LLM,模板的强项(事实准确)用结构约束保住。

反直觉洞察①(给 LLM "填 null 的权利"反而降幻觉):直觉会把所有字段设为 required,逼 LLM 写满。但 ServiceNow(2024-04)和 AWS Bedrock schema 实践(2026-02)一致发现:required 字段在信息缺失时是幻觉的最大来源——模型"必须填"就只能编。把可缺字段设为 nullable,给模型一个"诚实说不知道"的安全出口,幻觉率显著下降。SAR 场景的落地:anchors 找不到支撑时,对应段落 text 允许写"证据未涵盖该项",anchors:[]——宁可叙述不完整,绝不叙述不真实。完整性靠模板基线兜底(Day 71),真实性靠"允许留白"保住。

B. 引用锚点 schema:每个断言挂一个可验证的钩子

光在 prompt 里要求"附锚点"不够——锚点必须是机器可验证的结构,否则 LLM 可以挂一个格式对、但 txId 是编的锚点。借鉴闭世界引用策略(closed-world citation policy,2026:最终答案只能引用 session evidence 表里存在的 (doc_id, span_id);每个原子 claim 映射到带 offset 的支撑 span)。SAR 版把 (doc_id, span_id) 具体化为 (txId, field)

CitationAnchor schema:
  {
    txId:  string,        // 必须 ∈ case.transactions[].id(闭世界约束)
    field: 'amountCents' | 'dayOffset' | 'channel'
         | 'counterpartyName' | 'direction',   // 受控枚举,非自由文本
    claim: string         // 该锚点支撑的原子断言(用于事实核对)
  }

SarParagraph schema:
  { text: string, anchors: CitationAnchor[] }

锚点的"原子 claim"设计借鉴长文本事实性度量(atomic / faithful / verifiable / declarative,2026):把段落拆成最小可核查的陈述句,每句挂一个锚点。这样事实核对(Day 73 的对照评测)可以逐 claim 验证:取 anchor.txIdanchor.field 真值,检查 claim 里的数值/对手是否与真值一致。

锚点验证算法(确定性,亚毫秒,无需 LLM):

function verifyAnchors(draft, case) → {grounded, violations[]}:
    txIndex ← Map(case.transactions, t => t.id → t)
    violations ← []
    for para in draft.paragraphs:
        for a in para.anchors:
            # 闭世界约束①:txId 必须真实存在
            if a.txId ∉ txIndex:
                violations.push({type:'phantom_tx', anchor:a}); continue
            tx ← txIndex[a.txId]
            # 闭世界约束②:claim 里的值必须与该交易字段一致
            if not claimMatchesField(a.claim, tx[a.field]):
                violations.push({type:'value_mismatch', anchor:a, actual:tx[a.field]})
    grounded ← (violations.length == 0)
    return {grounded, violations}

claimMatchesField 对金额做整数分精确比对(继承全仓"金额用整数分、禁 float"纪律)、对日期/渠道做枚举比对。这套验证对模板基线恒为 grounded=true(Day 71 已证),对 LLM 则是真实的考验——它把"引用一致性"从 Day 71 的天花板=地板=1.0 变成 LLM 必须挣到的指标。

C. 闭世界幻觉防护:phantom 引用即拒绝/重试/降级

锚点验证只是检测。检测到幻觉后的处置状态机才是合规防线:

        ┌──────────────────────────────────────┐
        │  LLM 生成 SAR 草稿 JSON               │
        └──────────────────┬───────────────────┘
                           ▼
        ┌──────────────────────────────────────┐
        │  schema 校验(JSON 结构 + 字段枚举)   │
        └──────────┬───────────────┬───────────┘
              schema 失败       schema 通过
                   │                ▼
                   │   ┌──────────────────────────┐
                   │   │ verifyAnchors(闭世界)   │
                   │   └──────┬─────────────┬─────┘
                   │     有 violation     全 grounded
                   │          │               ▼
                   ▼          ▼          ┌─────────────┐
        ┌──────────────────────┐         │ 进 HITL 复核 │
        │ 重试(≤2 次):把     │         │(调查员终审)│
        │ violations 回灌 prompt│         └─────────────┘
        │ "T0099 不存在,重写"  │
        └──────────┬───────────┘
              重试仍失败
                   ▼
        ┌──────────────────────────────────┐
        │ 降级:回退 Day 71 规则模板基线    │  ← 安全网
        │ 标注 generatedBy:'rule-template'  │
        │ 案件不卡死,合规底线由模板保住    │
        └──────────────────────────────────┘

关键设计:闭世界违规不是"扣分",是"拒绝出文"。一个挂了 phantom 交易的 SAR 草稿绝不能流到调查员面前(哪怕只是草稿)——因为调查员可能被流畅叙述误导而漏看。处置优先级:能重试就重试(把 violation 作为反馈回灌,给 LLM 改正机会,类似 self-correction);重试耗尽就降级回模板——这就是 Day 71 把模板钉成确定性基线的兑现:模板永远是那个"接得住"的安全网。

ServiceNow(2024-04)的实测给了这套设计的量化信心——RAG 接地把 JSON 结构化输出的幻觉率从 13.7-21.4%(步骤)/ 19.2-21.4%(表)压到 1.9% / 4.2%,约 80-90% 降幅。但注意:

反直觉洞察②(接地能降 80-90% 幻觉,但 SAR 要的是 100%,剩下的靠"拒绝"而非"模型更强"):ServiceNow 把幻觉压到 1.9% 已是优秀工程。但 SAR 是法律文书——1.9% 的残余幻觉意味着每 50 份草稿就有 1 份带编造交易,这在合规上不可接受。关键认知:把残余幻觉降到合规可接受,不能靠"换更强的模型"(边际收益递减且不可证),只能靠"确定性验证 + 拒绝出文"。 verifyAnchors 是确定性的(不是另一个会幻觉的 LLM),它把"LLM 可能幻觉 1.9%"转化为"幻觉的那 1.9% 被 100% 拦截、重试或降级"。模型负责流畅,确定性闸门负责真实——这条分工是 SAR LLM 化能落地的唯一前提。

LLM SAR vs 模板基线的事实安全性对照:

维度模板基线(Day 71)LLM + 闭世界验证(今日)裸 LLM(反例)
引用一致性1.0(结构保证)验证后 1.0(违规即拒/降级)~0.96-0.98(残余幻觉)
流畅度/可读性
信息缺口处理兜底阴性叙述允许 null + "证据未涵盖"倾向编造填满
合规可审计每数字可溯源每 claim 挂锚点可溯源锚点缺失/伪造
故障处置不适用(本就是基线)重试→降级回模板无安全网

设计要点/决策表

要点决策理由
事实来源证据预填进 prompt,LLM 不检索消除"信息缺口处编值"的幻觉根因
自由度边界LLM 只动措辞,事实层 schema 锁死模板强项(准)用约束保住
缺信息处理字段 nullable,允许"证据未涵盖"required 是幻觉最大来源(ServiceNow 2024-04)
引用锚点每 claim 挂 (txId, field, claim)闭世界:只能引证据表内交易
幻觉处置验证非"扣分"而是"拒绝出文"SAR 是法律文书,1 份带编造即合规事故
残余幻觉确定性验证 + 重试 + 降级,非"换大模型"80-90% 降幅不够,要 100% 拦截
安全网重试耗尽降级回模板基线兑现 Day 71 模板的"接得住"定位

对本项目的落地

  • src/aml/sarDraft.ts 扩展为双生成器:现有 draftSar()(规则模板)保留为基线;新增 draftSarLlm(case, assessment, llm) 走 A 节三段 prompt,输出 SarDraftgeneratedBy:'llm'(同一接口便于 Day 73 A/B 对照)。SarDraft 接口(src/aml/types.ts)扩展 generatedBy: 'rule-template' | 'llm',并给 SarSectionanchors?: CitationAnchor[]
  • 新建 src/aml/sarCitation.ts:定义 CitationAnchor schema(B 节)、verifyAnchors(draft, case)(闭世界 + 字段值比对,确定性纯函数)、claimMatchesField(整数分精确比对金额、枚举比对渠道/日期)。这是 Day 73 对照评测"引用一致性"指标的实现底座。
  • 新建 src/aml/sarLlmPipeline.ts:实现 C 节处置状态机——schema 校验 → verifyAnchors → 重试(≤2,violations 回灌)→ 降级回 draftSar()。降级路径直接复用 Day 71 模板,标注来源。
  • 诚实标注:本日落 prompt 模板、CitationAnchor schema、verifyAnchors 确定性验证、处置状态机骨架;实际 LLM 调用(llm 参数)为接口占位——本仓库无生产 LLM key,draftSarLlm 以 fixture 形式提供"理想 LLM 输出 + 一个含 phantom 的坏输出"两个样例,用于单测 verifyAnchors 与降级路径。真实 LLM 接入、重试有效性、残余幻觉率实测为后续构建,不谎称已跑生产。模型 id 接入时用显式版本(如 claude-opus-4-8),不写裸 "Claude"。

参考资料

  1. Patrice Béchard & Orlando Marquez Ayala (ServiceNow) — Reducing Hallucination in Structured Outputs via Retrieval-Augmented Generation (arXiv:2404.08189):RAG 接地把 JSON 结构化输出幻觉从 13.7-21.4%/19.2-21.4% 压到 1.9%/4.2%(~80-90% 降);retrieve "JSON objects that could be part of the output" (2024-04)
  2. 闭世界引用策略(closed-world citation policy)/ Hallucination-Resistant Domain-Specific Research Assistant (arXiv:2510.02326):最终答案只能引 session evidence 内 (doc_id, span_id);每原子 claim 映射带 offset 的支撑 span;否则 abstain (2025-10)
  3. AWS Bedrock structured output / JSON schema design (n1n.ai):required 字段缺信息时模型 hallucinate value;nullable 类型给"安全出口"显著降 RAG 幻觉 (2026-02)
  4. FinCEN — Guidance on Preparing A Complete & Sufficient SAR Narrative:5W1H + method of operation;引言—主体—结论 (2003-11,监管基线)
  5. 长文本事实性度量(atomic / faithful / verifiable / declarative claim):原子 claim 须可核查、陈述句(用于逐 claim 事实核对)(2026)
  6. 本仓库 src/aml/sarDraft.ts(模板基线/降级目标)、src/aml/types.ts(SarDraft 接口)、docs/aipa/day71-sar-rule-baseline.md(确定性基线与引用一致性=1.0 的硬线)(2026-06)

SOTA 检查 (2026-06-11)

  • "结构化约束 + 闭世界引用 + 确定性验证"是 2026-06 受监管文本生成的主流防幻觉栈:ServiceNow(2024-04)的 RAG-for-structured-output、2025-2026 一系列闭世界引用/citation-grounding 论文(arXiv:2510.02326 / 2606.00898 法律引用图 / 2605.27700 CiteCheck)共同确立"接地降幻觉、确定性验证兜底"范式。本项目的 verifyAnchors 即此范式在 SAR 域的具体化。
  • 是否仍是 SOTA:✅ 是,且在金融合规场景被强化。AML 实务(Sumsub 2026、FIS+Anthropic Financial Crimes Agent 2026-05-04 的"证据汇集→SAR 叙述生成")均把"叙述须可溯源到证据"作为不可让的设计点;裸 LLM 生成 SAR 未见任何监管认可的部署。
  • 更新替代品监测:CiteCheck(2605.27700)等"引用幻觉检测器"在升温——可作 verifyAnchors 之上的第二层(检测 claim 与 field 语义错配,而非仅 txId 存在性);本项目 v1 用确定性字段比对足够,语义级检测留待 LLM judge(Day 17 已校准)补位,回填 Day 73。
  • 合规法规状态:EU AI Act Article 50 透明义务 2026-08-02 生效——LLM 生成的 SAR 草稿可能需机器可读标记(标注 AI 生成);但有"人工复核 + 编辑责任人"豁免空间(本项目 SAR 草稿强制进 HITL 调查员终审,落在豁免取向内)。Annex III 高风险义务经 Digital Omnibus 临时协议(2026-05-07)推迟至 2027-12-02。须在 generatedBy:'llm' 输出加 AI 生成标记,Day 74 审计轨迹一并记录。
  • 过时认知警示:"靠换更强模型把幻觉降到 0"是过时幻想——边际收益递减且不可证;2026 共识是"确定性验证 + 拒绝出文 + 降级"把残余幻觉 100% 拦截。本笔记反直觉洞察②即针对此。
  • 待跟踪:Day 73 拿到 LLM 实测后,量化重试的有效收敛率(重试能救回多少 violation)、降级触发频率;若 FIS/Fiserv 2026 H2 GA 的 SAR Agent 公布引用接地方法,对标其锚点粒度。