金融Agent如何证明这份报告用了哪版数据?

金融 Agent 最难的问题之一,不是“能不能生成报告”。

而是:

这份报告里的数字
到底来自哪一版数据?

Google Cloud 8 月 25 日发布 Gemini Enterprise for Financial Services 时,把几个能力摆在了模型之外:

50+ foundational skills
MCP连接金融数据源
Existing Entitlements
Confidence Scores
Explicit Methodology
Data Snapshots
Precise Source Citations

其中最值得企业数据团队关注的,不是“50+ Skills”,而是:

Data Snapshot + Citation + Methodology

因为金融研究、KYC、组合监控和信用分析最终都需要回答:

当时查了什么?
用的是哪一版?
为什么得出这个结论?

为什么“当前数据”不能解释历史报告

假设 Agent 8 月 25 日 10:00 生成:

某债券收益率:4.21%

8 月 26 日重新打开数据源:

4.18%

如果系统只保存:

source = market-data

已经没法证明昨天报告里的 4.21% 来自哪里。

所以引用不能只保存:

Provider
Symbol

还要保存:

Snapshot Time
Dataset Version
Query
Entitlement Context

一个最小Data Snapshot

public record DataSnapshot(
        String snapshotId,
        String provider,
        String dataset,
        String datasetVersion,
        Instant asOf,
        String queryHash,
        String payloadHash,
        String entitlementSnapshotId) {
}

这样一条数字可以回到:

哪一个数据快照

而不是“现在再查一次”。

Financial Citation也应该结构化

public record FinancialCitation(
        String snapshotId,
        String sourceId,
        String field,
        String entity,
        String unit,
        Instant asOf,
        String excerptHash) {
}

例如:

{
  "snapshot_id": "snap-9182",
  "source_id": "market-feed-a",
  "field": "yield_to_maturity",
  "entity": "bond/ABC2029",
  "unit": "percent",
  "as_of": "2026-08-25T10:00:00Z"
}

报告里一个数字对应一条可追踪证据。

为什么Entitlement必须一起保存

Google 这次特别强调:

licensed data stays licensed
permissioned data stays permissioned

也就是说,Agent 通过 MCP 访问 Bloomberg 类、市场数据类、内部模型类数据时,权限不能因为 Agent 连接而被拍平。

但审计还要继续回答:

当时这个用户为什么有权看到?

所以 Snapshot 最好绑定:

entitlement_snapshot_id

Entitlement Snapshot

public record EntitlementSnapshot(
        String id,
        String subjectId,
        String provider,
        Set licensedDatasets,
        Set allowedScopes,
        Instant capturedAt) {
}

以后即使用户权限已经变化,也能证明:

报告生成时
权限是什么

Agent不能把“有权读”变成“有权分享”

金融数据授权通常区分:

查看
下载
再分发
外部分享

Agent 读取了 Licensed Data,不代表可以把原始数据复制进任何 Artifact。

所以 Capability 至少拆:

market.read
market.summarize
market.export
market.redistribute

不同动作不同 Policy。

一个典型Egress Policy

licensed_market_data:

  read:
    allowed: true

  internal_summary:
    allowed: true

  raw_export:
    approval: required

  external_share:
    allowed: false

这比只有一个:

market_data_access=true

强很多。

50+ Skills真正需要的是版本治理

Google 公开描述里,Financial Research Agent 自带超过 50 个基础 Skill。

企业自己再叠加:

credit-risk
KYC
portfolio-monitoring
deal-memo

很快就会出现:

Skill版本差异

所以报告必须记录:

skill_id
skill_version

一个Research Methodology Manifest

public record ResearchMethodology(
        String methodologyId,
        String skillId,
        String skillVersion,
        List requiredSources,
        List requiredChecks,
        List forbiddenShortcuts) {
}

例如信用分析:

required_sources:
  - financial_statements
  - debt_schedule
  - market_data

required_checks:
  - liquidity
  - leverage
  - covenant

forbidden_shortcuts:
  - use_unverified_web_source

这才叫“可解释方法论”。

Confidence Score不能变成一个神秘数字

如果 Agent 输出:

Confidence = 0.87

但没人知道怎么算,这个字段基本没有治理价值。

至少拆成:

Data Freshness
Source Coverage
Evidence Consistency
Model Confidence

例如:

{
  "overall": 0.87,
  "data_freshness": 0.95,
  "source_coverage": 0.90,
  "evidence_consistency": 0.82
}

这样 Reviewer 知道问题出在哪。

我会把置信度当Review Router

不是:

0.87 = 87%正确

而是:

是否需要人工

例如:

review:
  confidence_ge_0_90: normal
  confidence_0_75_0_90: analyst_review
  confidence_lt_0_75: block

置信度更像风险分流器。

KYC最需要的是Entity Resolution证据

Google 提到 KYC 工作流会处理:

PDF
Excel
SEC filings
Corporate Hierarchy
UBO

最大的风险不是摘要差,而是:

把两个同名公司合并了

所以每次 Entity Resolution 要保存:

Matching Keys
Conflict
Source
Confidence
Human Override

一个Entity Resolution记录

public record EntityMatch(
        String inputEntity,
        String resolvedEntityId,
        double score,
        List matchedOn,
        List conflicts,
        String evidenceSnapshotId) {
}

如果:

score  dataSnapshotIds,
        List citations,
        String modelVersion,
        String contentHash,
        Instant createdAt) {
}

Artifact 不是一段 Markdown。

它是:

正文
+
证据
+
方法
+
版本

数据更新后旧报告不能静默变化

如果 UI 每次打开报告都实时重新取数,历史报告会变。

金融场景应该区分:

Snapshot Report
Live View

Snapshot Report:

当时结论不可变

Live View:

明确显示当前数据

不要混。

可以做Staleness标记

例如:

Market Data:
2h

Financial Statement:
90d

Credit Rating:
30d

如果报告打开时超过阈值:

STALE

但不修改原值。

用户选择:

Refresh

再生成新版本。

Report Versioning

memo-v1
↓
refresh
↓
memo-v2

差异:

哪些数据变了
哪些结论变了

最好自动生成 Diff。

一个数字变化追踪

{
  "metric": "net_debt_ebitda",
  "v1": 3.8,
  "v2": 4.2,
  "reason": "new quarterly filing",
  "source": "filing-snap-91"
}

这类信息比重新生成一份整报告更有价值。

A2A调用也要保留来源链

Google 这次说 Financial Research Agent 可以通过 A2A API 接进其他 Agent Workflow。

一旦:

Agent A
→ Financial Research Agent
→ MCP
→ Market Data

上层报告必须继续保留底层 Citation。

不能只写:

source = financial-agent

否则证据链在 Agent-to-Agent 层断了。

A2A Response应该带Evidence Envelope

{
  "result": {...},
  "evidence": [
    {
      "snapshot_id": "snap-91",
      "citation_id": "cite-17"
    }
  ],
  "methodology": "credit-risk-v8"
}

上游 Agent 原样继承。

我会专门测“Citation完整率”

定义:

有外部事实支撑的Claim
中
有可追踪Citation的比例

例如:

98%

高风险金融报告:

目标100%

还要测“Citation正确率”

有引用不等于引用支持结论。

抽样验证:

Claim
→ Citation
→ Source

是否真正支持。

可以人审 + 自动 Rule 结合。

一个发布Gate

financial_agent_gate:

  licensed_data_violation:
    allowed: 0

  missing_snapshot:
    allowed: 0

  citation_coverage:
    min: 0.99

  unresolved_entity_match:
    max: 0

  stale_critical_data:
    allowed: 0

这比“报告Judge分数85”更贴近真实风险。


金融 Agent 真正进入生产以后,最难证明的不是:

模型会不会写一份漂亮报告

而是:

这份报告当时用了什么数据
用户当时有没有权限
数据是哪一版
方法是哪一版
每个结论能不能回到证据

Google 这次把 Data Snapshot、Methodology、Confidence 和 Source Citation 放进金融 Agent 基础设计里,是一个很重要的方向。

因为在金融场景里,可追溯性本身就是产品能力。

没有数据版本和证据链,再聪明的模型也只能算“生成器”;能把每个结论固定到当时的数据、权限和方法版本,Agent 才开始像真正可审计的研究系统。


更多企业级 AI 应用、Agent、RAG 与模型工程化内容,我会继续整理在 智元界

https://www.zyentor.com/