# 财务风险分析系统详细设计与实施方案

> 依据 0924 需求文档编制的多智能体财务风险分析 PoC 详细设计与实施方案：总体架构、分析流水线、数据层、规则库与判定引擎、议题聚合与评分、图表体系、四类 LLM Agent 协作、前端页面、样本数据与里程碑验收，含三张交互式图表。

---

LLMS 索引： [llms.txt](/llms.txt)

---

依据《财务风险分析系统需求文档（0924）》编制。本页是**多智能体财务分析系统 PoC 的详细设计与实施方案**——先跑通"数据层归集 → 规则判定 → 议题聚合 → 评分分档 → 图表与判读生成 → 结论文案生成 → 质量检查"七环节全链路，为行内落地探路。需求口径详见[10 财务风险分析](../xinshen-requirements/10-fin-risk-analysis/)章。

## 一、定位与范围 {#position}

**目标**：交付一个可运行的 PoC——样本公司数据 + 种子规则集 + 真实 LLM 调用，验证多智能体协作架构、判定可复算性、五条硬约束的可行性。不受行内技术栈约束，但选型与行内《综合智慧信贷 AI 架构方案》同构，验证结论可直接迁移。

**PoC 要验证的四个核心命题**：

1. 判定、聚合、评分全部由代码计算，每条结论可追溯到实测数值、阈值档位与规则编号；
2. LLM 只承担叙述与判读（判读三段、六项结论文案、核查清单），在五条硬约束下输出稳定 JSON；
3. 人工改判 → 档位即时刷新 →「大模型重算」→ 文案重写，这条核心交互链闭环；
4. 八条一票否决触发时评级被覆盖为「不建议准入」，且不停止其余规则执行。

**明确不做**（落地阶段再补）：信贷系统 SSO 与带参跳转、结论回写审批单（0924 待对齐点⑨在 PoC 中搁置，改为页面展示 + markdown/JSON 导出）、企查查接口、影像平台 OCR。外部工商舆情在数据层保留命名空间、以 mock 数据注入，**未接入时如实显示「未接入」，不得显示为「未触发」**。

## 二、总体架构 {#architecture}

四层：评审前端（Vue3）、FastAPI 确定性服务层、LangGraph 多智能体层、数据与模型接入层。核心原则一句话：**确定性计算走代码、Agent 不承担口径决策、LLM 只做叙述与判读并受硬约束**。

> [!NOTE]
> 图内支持缩放、语义视图、关系追踪与 PNG/SVG 导出。

<iframe src="/ai/arch/18-fin-poc-architecture.html" title="财务风险分析多智能体 PoC 总体架构图" loading="lazy" style="width:100%;height:560px;border:1px solid #e5e7eb;border-radius:8px;"></iframe>

<a href="/ai/arch/18-fin-poc-architecture.html" target="_blank">全屏打开 ↗</a>

**关键设计决策**（逐项经评审确认）：

| 决策点 | 结论 | 理由 |
|---|---|---|
| 交付形态 | 可运行 PoC，跑通七环节全链路 | 为落地探路，验证核心命题后再投入生产工程 |
| 规则库 | 自造种子规则集（80–150 条起步） | 969 条无机器可读版本；17 字段结构全量落地，数据驱动可增量扩充 |
| 多智能体形态 | 流水线为骨 + 四类专项 Agent | 判定可复算是审计底线；Agent 只出现在编排、判读、结论、质检四个位置 |
| 技术栈 | Python 3.12+ / FastAPI / SQLModel / SQLite；LangGraph 编排 | 与行内 AI 架构方案选型同构；SQLite 零运维适配 PoC |
| LLM 接入 | OpenAI 兼容网关，配置化 base_url/key/model；录制回放模式 | 开发接商用 API，落地换行内 Qwen 网关只改配置；回归测试不烧 token |
| 样本数据 | 两家虚构制造业公司 × 5 年年报 | 健康厂验证通过路径，藏雷集团验证一票否决与图多议题多路径 |
| UI 范围 | 全页面骨架 + 总览页十版块完整 | 验证「人工改判 → 重算 → 图表重渲染」核心交互链 |
| 计数口径 | 页面显示真实条数，不硬编码 969 | 969 是目标态口径；「阅读路径移出清单」「不适用不计分母」等比例关系在种子集上同构复现 |

## 三、分析流水线与重算回路 {#pipeline}

七环节中前四环（归集、判定、聚合、评分）与图表数据全部是确定性代码；后三环（判读、结论、质检）由 LLM Agent 承担，编排 Agent 负责调度。人工改判从评审复核泳道回流：改判保存 → 确定性结果即时重算 → 点「大模型重算」→ 判读与文案重写（**只重写文案，不改档位**）。

<iframe src="/ai/arch/19-fin-poc-pipeline.html" title="财务分析流水线与重算回路图" loading="lazy" style="width:100%;height:560px;border:1px solid #e5e7eb;border-radius:8px;"></iframe>

<a href="/ai/arch/19-fin-poc-pipeline.html" target="_blank">全屏打开 ↗</a>

八条否决闸在评分后并行判定：触发即在结果上打覆盖位（结论变为「不建议准入」），但流水线继续走完——评审仍需要完整的判定明细；人工推翻必须填理由并留痕。

## 四、数据层设计 {#data}

七个命名空间落为独立取数接口，规则只能从这里取数、不允许写死数字：

| 命名空间 | 存储 | 说明 |
|---|---|---|
| 年报科目原值 | `facts` 表（公司 × 期间 × 科目 × 金额，统一万元） | 三表主体科目 + 附注明细 |
| 派生指标 | 派生定义表 + 现算 | 口径全系统唯一，如现金转换周期恒为「应收天数＋存货天数−应付天数」 |
| 分季度数据 | `quarterly` 表 | 识别年末利润塌陷等季度分布异常 |
| 母公司报表科目 | `parent_facts` 表 | 母子背离核对（F42） |
| 外部工商舆情 | `external_records` 表 | mock 注入；缺时显示「未接入」 |
| 行业均值 | `industry_avg` 表 | 22 行业小类 × 板块 × 14 指标，驱动 10 条行业比较规则 |
| 公司画像 | `companies` 表 | 客户性质（上市/集团，驱动适用对象层）、行业小类、增值税率 |

**两家样本公司**（5 年年度序列 + 附注 + 分季度 + 母公司报表 + 舆情 + 所在行业均值）：

- **健康厂**：数据干净、少数触发、图少议题少——验证通过路径、低风险分档、「未披露」中性显示；
- **藏雷集团**：预埋非标审计意见（一票否决）、存贷双高（F03 存贷利差）、应收与收入剪刀差（F21）、其他应收款长账龄占比（F09）、净现比持续低于 0.5（F38）、四季度利润塌陷（F19）——验证否决覆盖、图多议题多、退回重写路径。

## 五、规则库与判定引擎 {#rules}

**17 字段结构全量落地**（编号、风险域、检查项、计算口径、阈值、判定、实测依据、优先级、实测标题等），种子集构成策略：

1. **A.01–A.38 图规格反推**：38 张图点名的约 150 个 U-XXXX 规则优先编入，阈值直接取图规格（如现金短债比黄 1 / 红 0.5、有息负债率黄 40% / 红 60%、应收剪刀差黄 5pp / 红 20pp）；
2. **勾稽恒等式**：资产＝负债＋权益等（IDENT，1% 容差）；近似勾稽如「销售收现 ≈ 营业收入×(1+增值税率)」（偏离 10pp 判关注、20pp 判重点关注；跳变 15pp/30pp；仅两期数据只判偏离）；
3. **八条否决**：自动三条（货币资金五类反常、非标审计意见、现金流肖像排除型）+ 待确认三条（立待办）+ 未接入两条（如实显示）；
4. **行业比较 10 条**：5 条有兜底（无可比样本退自身近三年均值、至少三期），5 条无兜底缺数判「数据不足」。

覆盖约束：10 个风险域每域 ≥5 条、代表事实域每域 ≥2 条、RATIO/IDENT/STATE/COUNT/NOSCORE 五形态齐备、P0/P1/P2 三级齐备。

**判定引擎**：自建受限表达式语言——只允许白名单函数（`prev` 取上期、`yoy` 同比、`share` 占比、`ratio` 比值、`streak` 连续期数、`avg3y` 近三年均值、`industry` 行业均值等），编译为 AST 解释执行，不能调用任意代码。每条规则输出：判定（重点关注/关注/通过/数据不足/不适用）+ 实测依据（算式与科目金额，可对上计算口径）。四层筛选（适用对象、数据可得性、业务前置、规则类型）在执行前收窄规则集，不适用条目不计分母、不占清单。

## 六、议题聚合与评分 {#scoring}

- **议题聚合**：按 44 事实域（种子集覆盖约 15 个代表域）聚合，同域触发规则合并为一个议题，议题卡标明「本议题同时触发 N 条规则，已合并计为 1 项」。严重度取组内最重判定；**优先级取实际判了重点关注的那条规则的优先级**（不取全组最高，防止 P1 重判从 P0 轻判借权重）。
- **评分三轴取中位数**：重大问题数（必查项重点关注议题数）、问题密度（触发议题占已判定规则比例）、加权分（重点关注 P0=6/P1=3/P2=1；关注 P0=2/P1=1/P2=0.4）。三轴中位数映射极高/高/中/低四档。
- **否决覆盖**：八条否决独立判定位，优先级高于评分，触发即结论覆盖为「不建议准入」。

## 七、图表体系 {#charts}

38 条图表定义全部落为数据驱动 spec（事实域、图型、序列、序列取数口径、阈值带、读法文本），序列只允许引用数据层命名空间。渲染层：Vue3 + ECharts 封装，折线阈值带用 markArea（黄区/红区，双向阈值都渲染）、阈值线参与纵轴取值范围。

- **出图条件**（每次渲染重算）：该事实域至少一条规则判重点关注或关注（按人工复核后状态计）＋ 落在触发最多的维度页（触发数相同取规则数多的，再相同按导航顺序）＋ 至少一条序列取得到非空非零的数；
- **页内排序**：按 P0 触发数、重点关注数、关注数依次降序；
- **图下判读三行**由程序现算：最新读数与上期对比（有阈值带的加一句相对阈值线位置）、本域触发条数与最重规则（可点击跳转规则库）、规则库通用读法（标「读法」）；
- 8 个无数值序列的事实域（对外担保、关联交易等）不出图；渲染验证选 12–15 张代表图，其余 38 条定义 correctness 由 spec 单测保证。

## 八、多智能体设计 {#agents}

<iframe src="/ai/arch/20-fin-poc-agents.html" title="四类 Agent 协作时序图" loading="lazy" style="width:100%;height:560px;border:1px solid #e5e7eb;border-radius:8px;"></iframe>

<a href="/ai/arch/20-fin-poc-agents.html" target="_blank">全屏打开 ↗</a>

| Agent | 输入 | 输出 | 关键约束 |
|---|---|---|---|
| 编排 | 分析请求（custId, period）或重算请求 | 七环节调度、状态流转、退回重写驱动 | 不产出结论；LangGraph StateGraph + SQLite checkpointer |
| 判读 ×N | 单个议题：触发规则、实测、阈值、风险指向、处置动作 | 三段判读：归因 → 定性 → 处置 | 按议题并行 fan-out（并发上限可配）；归因首句三级回落：实测结论句 → 计算口径展开 → 不写首句 |
| 结论 | 3.10.2 九类事实：公司信息、评级与档位、否决状态、指标卡、主营构成、舆情摘要、人工判定记录、全部风险议题 | 固定 JSON：标题、行动建议、正文段落数组、总体判断、授信六项、核查清单 | 五条硬约束写入系统提示词 |
| 质检 | 结论 JSON + 输入事实集 | 通过 / 不合格（附违规项） | 三道校验以程序为主：档位与文案一致、文案数字必须可在输入事实集中溯源、JSON Schema 校验 |

**五条硬约束**：只用给出的事实和数字；人工判定优先于系统原判定；授信六维文案必须与系统档位一致；触发重点关注事项时结论必须是不建议准入；只输出固定字段的 JSON 对象。质检不过由编排退回重写（附违规项），最多三次；仍不过则降级为模板文案并标注「模型生成未通过质检」——**禁止带病发布**。

**LLM 网关**：OpenAI 兼容抽象层，`RECORD`/`REPLAY` 两种模式——录制模式把 (模型, 提示词哈希) → 响应存入 fixtures；回放模式直接命中缓存，回归测试零 token、结果可复现。温度取低值并使用结构化输出。

## 九、前端设计 {#frontend}

| 路由 | 页面 | PoC 范围 |
|---|---|---|
| `/` | 总览页 | 十版块全做：评级横幅（含否决覆盖提示）、核心结论正文、舆情摘要、授信建议表、放款前核查清单、核心指标卡（四类核心 15 张 + 大额科目）、主营概览、各域结论一览、重点关注项状态表、风险项清单（一二级卡片） |
| `/domain/:code` | 十个风险域页 | 共用模板：域头（规则数/必查数/判定计数）、结论两行、图表区、触发规则明细 |
| `/rules` | 规则库页 | 全功能：按域/类型/判定/关键词筛选、17 字段展开、人工改判表单（改判 + 实测值 + 核查说明，留痕）、顶部「大模型重算」按钮 |
| `/opinion` | 舆情核查页 | mock 数据：舆情时间线 + 外部信息族六条必查规则 |
| `/guide` | 阅读指引 + 场景筛选 | 轻量版：阅读动线清单 + 八场景过滤条（只过滤清单不改评级） |

分析任务为长任务（规则数百条 + 多次 LLM 调用），API 以任务 id + SSE 推送进度；前端按环节显示流水线状态。

## 十、工程结构与实施方案 {#implementation}

```
finrisk/
├── backend/app/
│   ├── models/       # SQLModel：公司/事实/派生/分季/母公司/外部/行业均值/规则/判定/议题/留痕
│   ├── datalayer/    # 七命名空间取数接口（唯一取数通道）
│   ├── rules/        # 规则库加载、四层筛选
│   ├── engine/       # 表达式语言（白名单函数 + AST）、五形态判定、双容差
│   ├── aggregate/    # 议题聚合、三轴评分、八条否决
│   ├── charts/       # 38 图 spec、出图条件、图下判读三行
│   ├── agents/       # orchestrator / readers / writer / qc（LangGraph）
│   ├── llm/          # OpenAI 兼容网关、录制回放
│   └── api/          # FastAPI 路由 + SSE
├── backend/data/     # 种子规则库（YAML，数据驱动可增量）
├── backend/fixtures/ # LLM 录制回放
├── backend/tests/    # 判定引擎与聚合的黄金用例
├── frontend/         # Vue3 + Vite + TS + ECharts
└── samples/          # 两家样本公司数据（健康厂 / 藏雷集团）
```

**里程碑**：

| 阶段 | 内容 | 出口标准 |
|---|---|---|
| M1 | 数据层 + 两家样本数据 | 七命名空间齐备；派生指标口径单测通过 |
| M2 | 种子规则库 + 判定引擎 | 五形态齐备；每条判定可复算（实测依据回放口径一致）；双容差用例通过 |
| M3 | 聚合评分否决 + 图表服务 | 三轴分档正确；藏雷集团触发否决覆盖；38 图 spec 单测 + 代表图渲染验证 |
| M4 | 四类 Agent + 前端全页面 | 判读/结论/质检真实 LLM 跑通；改判 → 重算闭环；质检退回与降级路径可演示 |

**验收标准**（对应四个核心命题）：①任一条判定点开可见实测数值、阈值档位、规则编号；②结论 JSON 通过 Schema 与质检三道校验，六项文案与档位一致率 100%；③人工改判保存后档位与评级即时刷新，「大模型重算」只改文案不改档位；④藏雷集团评级被否决覆盖为「不建议准入」且判定明细完整。

**风险与对策**：LLM 输出 JSON 不稳定 → 结构化输出 + 三次重试 + 模板降级；图规格反推的规则口径与行内真实规则库有偏差 → 种子集逐条标注来源（图规格/需求原文），真实规则库到位后按 17 字段导入替换；两家样本覆盖不了中间态分档 → 数据 schema 支持随时增补第三家公司。

## 十一、术语表 {#glossary}

| 术语 | 定义 |
|---|---|
| 风险域 | 规则库的第一级组织，十个（A 盈利能力与质量 … H 关联交易与内部转移），决定维度页 |
| 事实域 | 规则映射的最小事实单元，44 个（F01 现金对有息负债覆盖 … F44 费用结构），议题聚合与图表的分组依据 |
| 议题 | 同一事实域内全部触发规则合并成的单项，风险项清单的一张卡 |
| 议题簇 | 图表去重的依据（全库 868 簇），同一簇只画一张图 |
| 判定 | 规则执行结果五态：重点关注 / 关注 / 通过 / 数据不足 / 不适用（不适用不计分母） |
| 档位 | 系统算出的等级（评级极高/高/中/低；授信六维各自档位），模型只把档位写成话 |
| 重点关注事项 | 八条一票否决，独立于评分，触发即覆盖结论为「不建议准入」 |
| 种子规则集 | PoC 阶段自造的 80–150 条规则，17 字段结构与 969 条目标态同构 |
| 录制回放 | LLM 网关模式：录制真实响应为 fixtures，回归测试零 token 可复现 |

---

反链：

- [综合智慧信贷](/docs/ai/comprehensive-credit/)
