把"留痕"当一等公民:金融智能体的审计设计为什么比模型能力更烧钱
【免费下载链接】financial-services可将 Claude 转变为金融服务专家,适用于投资银行、股票研究等领域。提供核心及专项插件,支持端到端工作流,集成多数据源,含技能、命令和连接器,可定制适配企业需求。项目地址: https://gitcode.com/GitHub_Trending/fi/financial-services
模型选型在金融智能体项目里往往只占预算的零头。真正吃掉工程预算的,是那些模型能力之外的"不性感"部分:谁能碰哪些数据、每一步留下了什么证据、出错之后谁来负责。Anthropic 开源仓库 financial-services 给出了一个罕见的完整样本——它一次性打包了投资银行、股票研究、私募股权、基金会计与 KYC 反洗钱五大场景的 10 个端到端智能体,且每套都同时以 Cowork 插件和 Managed Agents API 模板两种形态交付。拆开它的源码会发现一个反直觉的事实:系统提示词里的模型指令只占很小篇幅,真正的大头是围绕"留痕、权限、兜底"三件事堆出来的工程约束。这篇文章以仓库源码为证据,拆解金融级智能体的审计设计到底"烧"在哪、为什么烧、以及这些约束如何反过来塑造了整套模板架构。
金融级要求的三个刚性约束:留痕、权限、兜底
仓库 README.md 顶部有一条醒目的 IMPORTANT 声明,几乎是一份法律意见书式的免责声明:
Nothing in this repository constitutes investment, legal, tax, or accounting advice. These agents draft analyst work product — models, memos, research notes, reconciliations — for review by a qualified professional. They do not make investment recommendations, execute transactions, bind risk, post to a ledger, or approve onboarding; every output is staged for human sign-off.
这段话翻译成工程语言就是三条红线:不执行交易、不写总账、不做最终批准。它们不是宣传语,而是被硬编码进了每一个智能体的 Guardrails 章节。逐一核对 10 个 agent 的源码:
- GL Reconciler(总账对账):gl-reconciler.md 明确写着 "No ledger posting. This agent produces a report; ledger adjustments require human approval outside the agent";
- Month-End Closer(月末关账):month-end-closer.md 写着 "No GL posting. This agent drafts JEs; posting requires controller approval outside the agent"——它只起草日记账分录草稿(JE draft),过账必须由财务控制器在系统外完成;
- Statement Auditor(报表审计):statement-auditor.md 写着 "No distribution. This agent recommends pass/hold; IR distributes after human sign-off"——它只给出 pass/hold 建议,向 LP 分发必须等投资人关系团队人工签字;
- KYC Screener(客户尽调):kyc-screener.md 写着 "No risk-rating decision. This agent recommends; the compliance officer decides";
- Valuation Reviewer:LP 报告 "require IR and CCO sign-off outside this agent";
- Earnings Reviewer:研究分发 "requires senior analyst sign-off outside this agent";
- Model Builder:model-builder.md 的约束是 "Stop and surface after build and again after audit. The user approves before sensitivities"。
这套"智能体负责起草与审计、人类负责批准与执行"的边界设计,本质上是把金融行业早已成熟的职责分离(Segregation of Duties)原则平移到了 Agent 架构里。智能体被定位成"永远在签名线之前的那个员工",它所有的产出都是"staged for human sign-off"。这也直接回答了"为什么审计设计比模型能力更烧钱":模型幻觉可以通过提示词约束降低概率,但金融监管要求的是确定性——每一步都必须可回答"谁、在什么时候、基于什么证据、做了什么",这只能靠工程结构来保证,模型能力替代不了。
审计日志结构化留存怎么做才达标
"留痕"在金融语境下不只是"记日志",而是让每一个结论都能沿证据链回溯到源头。仓库里对此的工程实现有三层,层层递进。
第一层:结构化输出契约,把留痕做进数据格式里。
托管智能体模式下,负责读取不可信文档的叶子 worker(reader)被要求"只返回 schema 限定的 JSON,不得输出自由文本"。以 GL Reconciler 的 reader.yaml 为例,它的output_schema规定了每个 break 必须携带account、gl_balance、sub_balance、variance四个字段,外加可选的suspected_cause和evidence_refs——且所有字符串字段都有长度上限和字符类白名单(如^[A-Za-z0-9._:-]+$)。这个设计的精妙之处在于:它同时服务于两个目的——保证下游可解析,以及让注入的提示词指令无法在 JSON 字段里存活(恶意文本会被字符白名单直接过滤掉)。
值得注意的一个细节是 validate.py 文件头的注释:"The CMA API does not enforce structured output today, so the deploy harness runs this between a reader subagent and the orchestrator."——即托管智能体 API 目前并不强制结构化输出,所以仓库专门写了一个 harness 侧校验器,部署时由 deploy-managed-agent.sh 把每个 worker 的output_schema提取出来,在 reader 输出进入 orchestrator 之前用 jsonschema 做一次硬校验。这就是"审计设计烧钱"的典型体现:平台不提供的能力,自己用工程补上。
第二层:逐字段的证据引用,让每个数字可溯源。
留痕的最终形态不是"有日志",而是"每个数字都能被追到来源"。三个例子最有说服力:
- GL 对账的根因追踪:GL Reconciler 的 break-trace skill 要求对每个 break 沿"审计轨迹"追回两侧的原始分录——GL 侧要取到 entry id、posting date、source system、batch id、preparer;子账侧要取到 trade id、结算日、counterparty、source feed、FX rate。产出必须是固定句式
"⟨side⟩ ⟨did what⟩ because ⟨reason⟩",例如 "GL posted on settle date (T+2) while subledger posted on trade date — timing break"。这种强制句式把"结论"和"证据"焊死在一条句子里,审计复核时可以直接检验因果链; - KYC 规则引擎:kyc-rules 明确要求 "Cite the rule — no outcome without a rule reference",每条规则的判定结果都必须带上
rule_id和evidence字段,且它只做打分与路由(score and routes),"this skill never approves"; - 投研模型更新:Earnings Reviewer 的约束是 "Cite every number. If a figure cannot be sourced from FactSet, Daloopa, or a filing, mark it
[UNSOURCED]";dcf-model skill 更把来源标注下沉到了 Excel 单元格注释:"ALL hardcoded values must have cell comments documenting the source. Format:Source: [System/Document], [Date], [Reference], [URL if applicable]"。
第三层:产物即留痕,把审计证据做成交付物。
仓库把"留痕"做到了产出文件的层面:GL Reconciler 交付"Exception report for controller sign-off",Statement Auditor 交付 "Sign-off sheet — pass/hold recommendation per statement"(见 statement-auditor.md),Month-End Closer 交付完整的 "Close package"(accrual 计算 + 支持引用 + JE 草稿)。audit-xls skill 则定义了 Excel 模型的审计规范:BS 平账、CF 与现金科目勾稽、RE 滚动、硬编码检测、颜色约定(蓝=输入、黑=公式、绿=链接),并且明确 "Don't change anything without asking — report first, fix on request"——审计只报告不擅改。再加上 xlsx-author 要求的 Checks 平账页(TRUE/FALSE 逐行暴露),审计证据被固化成了可归档、可复核的文件资产。
这些约束如何反过来塑造了模板架构
三条刚性约束不是贴上去的补丁,它们直接决定了仓库的整体架构形态。最典型的是四点。
第一,单源双形态(one source, two wrappers)。仓库的 CLAUDE.md 和 managed-agent-cookbooks/README.md 反复强调一个原则:每个 agent 只有一份规范系统提示词(存于plugins/agent-plugins/<slug>/agents/<slug>.md),Cowork 插件直接引用它,托管智能体的agent.yaml则通过system.file字段内联同一份文件。这样"留痕约束"只需维护一处,两套部署形态不会漂移。这正是监管审计最怕的"两套系统两套口径"问题的解药。
第二,信任边界分层——只有一处 Write。这是整个架构里最烧钱也最出彩的设计。每个托管智能体都是一个三分层结构:接触不可信文档的 reader(只读、无 MCP、无 bash、无 write)→ 不接触原始文档的 orchestrator(聚合与调度)→ 唯一持有 Write 的 resolver/poster/flagger。以 gl-reconciler/README.md 的安全表为例:
| Tier | Touches untrusted docs? | Tools | Connectors |
|---|---|---|---|
reader | Yes | Read,Greponly | None |
| Orchestrator | No | Read,Grep,Glob,Agent | Read-only GL + subledger MCPs |
resolver(Write-holder) | No | Read,Write,Edit | None |
reader.yaml 的注释直白地说明了设计意图:它读取的是不可信的对家/托管行对账单,文档里的任何指令都必须被当作数据而非指令。而 resolver.yaml 虽然持有 Write,却"Never read counterparty files; never run bash"——写权限与不可信内容在物理上不可能交汇。这份"最小权限"在工具层面由agent_toolset的声明式 enable/disable 配置落地,权限不是提示词里的"请礼貌一点",而是配置文件里的硬开关。
第三,留痕延伸到了智能体之间的协作。命名智能体之间不直接互相调用,而是通过输出handoff_request事件由外部编排层路由。orchestrate.py 是这个参考实现的样本,它的文件头注释本身就是一份威胁模型文档:handoff 请求出现在 orchestrator 的文本输出里,而该输出"downstream of untrusted-document readers",攻击者可以控制被处理的文档、在文档里嵌入伪造的 handoff_request 文本。因此脚本做了两件事:硬编码 allowlist(只允许转发给 10 个已部署的 agent slug)和payload schema 校验(事件文本最长 2000 字符、context_ref 只允许^[A-Za-z0-9 ._/:#-]+$字符集)。连智能体之间的握手都要防注入、要留痕、要校验,这就是"金融级"和"玩具级"的分水岭。
第四,部署管线本身就是审计控制点。deploy-managed-agent.sh 在把 YAML 清单转换成 API payload 时,对每个${ENV_VAR}引用都要过一遍^[A-Za-z0-9._/:@-]*$的安全正则,不匹配直接拒绝——连环境变量注入都堵上了。而 check.py 作为提交前的门禁,会校验所有 manifest、验证所有跨文件引用(system.file、skills.path、callable_agents.manifest)能解析、并强制 agent 打包的技能与 vertical 源文件零漂移。仓库的 CLAUDE.md 甚至规定.ps1脚本必须保持纯 ASCII,否则 Windows PowerShell 5.1 会用 ANSI 代码页解码导致整文件解析失败——"连编码都要审计"。
结语:审计设计是金融智能体的"第二预算"
回到标题的问题:为什么审计设计比模型能力更烧钱?因为模型能力解决的是"能不能做对",审计设计解决的是"凭什么证明做对了"——后者在金融业是不可讨价还价的监管要求,也是真正的工程复杂度所在。这个仓库用源码给出了一个可复用的答案:把留痕做进数据契约(schema 校验)、把留痕做进结论句式(because 证据链)、把留痕做进产物文件(sign-off 包)、把权限做进架构(唯一 Write 持有者)、把兜底做成边界(永不落账、永不发布、永不批准)。当一套模板架构把"人类始终在签名线上"作为第一性原理来设计时,审计成本就不再是负担,而是这套系统能在华尔街运行的最硬理由。
【免费下载链接】financial-services可将 Claude 转变为金融服务专家,适用于投资银行、股票研究等领域。提供核心及专项插件,支持端到端工作流,集成多数据源,含技能、命令和连接器,可定制适配企业需求。项目地址: https://gitcode.com/GitHub_Trending/fi/financial-services
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考