AI 财报助手技术实现:如何把财报 PDF 拆成结构化风险检查清单?
这篇文章记录了我在贵阳实验室的实战过程。我坚信,在技术下行的时代,程序员唯一的护城河就是通过 AI 建立属于自己的数字资产。
本文解决的问题
- ● 为什么直接把整份财报 PDF 输入大模型会产生幻觉、表格错位和上下文溢出?
- ● 如何把非结构化的财报内容拆解成可控的结构化输出?
- ● 如何让 AI 只输出风险检查清单,而不是随意的投资结论?
适合谁读
- AI 开发者:想在金融场景实现可靠的文档解析与结构化抽取。
- 投研 analyst:需要将年度/季报转化为机器可读的 JSON,便于横向对比。
- 产品经理:了解技术实现背后的设计思路,为金融 AI 产品制定 roadmap。
- 技术写作者:参考本文的 ARO(TL;DR‑问题‑受众‑结论‑坑‑对比‑FAQ‑继续阅读)结构撰写同类技术文档。
1 为什么 AI 财报助手不是简单把 PDF 丢给大模型
财报 PDF 与普通文章不同,包含以下要素:
- 正文段落、脚注、页眉页脚。
- 关键的财务表格,列名、单位、币种必须保留。
- 风险因素章节、管理层讨论(MD&A)以及电话会 Q&A。 直接把整份 PDF 丢给模型会出现三大问题:
- 上下文长度:财报常常超过三万字符,超过大多数模型的上下文窗口。
- 表格错位:纯文本抽取失去表格列结构,模型难以定位具体数值。
- 幻觉风险:模型倾向于“填补”不存在的数字或结论,产生虚假数据。
解决思路是先把原始材料结构化,再交给模型进行受控抽取。
2 第一层:PDF 解析,文本 & 表格双重抽取
- 文本抽取 使用
pdfplumber或poppler,保留页码、章节标题、脚注。 - 表格抽取 使用
camelot(flavor='stream')或tabula-py,输出每页表格的二维数组,随后统一列名、单位、币种。 - OCR 备份 对扫描版 PDF 采用
tesseract,抽取后通过正则校验金额、日期等关键字段。 - 元数据 为每段文本或表格添加
sourcePage、sourceSection、sourceFile,便于后续追溯。
示例抽取结果(JSON):
{
"page": 12,
"section": "Consolidated Statements of Operations",
"type": "table",
"raw": [
["Year", "Revenue", "Cost of Revenue", "Gross Profit"],
["2024", "$1.2B", "$800M", "$400M"]
],
"normalized": {
"year": 2024,
"revenue": 1200000000,
"cost_of_revenue": 800000000,
"gross_profit": 400000000,
"currency": "USD"
}
}
3 第二层:按财报结构切分 Chunk,而不是固定字数
财报的自然结构包括以下几类 Chunk:
- Business Overview:公司业务概览、市场定位。
- Financial Statements:资产负债表、利润表、现金流量表,每张表单单独作为 Chunk,保持表格结构。
- Management Discussion & Analysis (MD&A):管理层对业绩的分析,需捕捉情感倾向。
- Risk Factors:法规、市场、供应链等风险,逐条抽取。
- Notes to Financial Statements:会计政策、估计变更。
- Earnings Call Q&A:投资者提问与管理层回答。
每个 Chunk 必须携带 sectionName、pageRange、sourceFile,确保后续 LLM 能够在提示中引用原始位置。
4 第三层:使用 JSON Schema 固定抽取输出
使用 JSON Schema 强制模型只能在预定义字段内输出,任何未匹配的内容必须返回 null。示例 Schema:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"revenue": {"type": ["number", "null"]},
"gross_margin": {"type": ["number", "null"]},
"operating_income": {"type": ["number", "null"]},
"net_income": {"type": ["number", "null"]},
"operating_cash_flow": {"type": ["number", "null"]},
"free_cash_flow": {"type": ["number", "null"]},
"cash_and_equivalents": {"type": ["number", "null"]},
"total_debt": {"type": ["number", "null"]},
"source_pages": {"type": "array", "items": {"type": "integer"}}
},
"required": ["source_pages"]
}
在系统提示中明确要求模型 只输出符合上述 Schema 的 JSON,并在每个字段后附带 source_page。后处理阶段使用 ajv(JavaScript)或 jsonschema(Python)进行校验,若不符合则将对应字段置为 null 并记录错误日志。
如果你想直接测试 AI 财报助手,可一键跳转试用
支持 PDF 批量上传、管理层 Guidance 情绪审计、核心 KPI 指标抽取,免费免登录。
5 第四层:风险因素抽取,聚焦真实业务风险
风险类别包括:客户集中、监管、供应链、汇率、库存、应收账款、债务、诉讼、商誉减值等。抽取时在 Risk Factors 章节使用 Few‑Shot 示例,引导模型输出如下结构:
{
"risk_type": "customer_concentration",
"risk_summary": "前五大客户贡献 68% 收入,下降 5% 为负面信号",
"severity": "medium",
"evidence": "第 23 页:我们的前五大客户占比 68%",
"source_page": 23
}
对比当前报告与上一次报告的风险字段,标记 is_new 或 changed_severity,帮助 analyst 快速定位新增风险。
6 第五层:管理层语气分析
将 MD&A 与电话会 Q&A 中的关键句子映射为情感维度:demand、margin、guidance、competition、inventory、customer_budget、macro_uncertainty。使用句向量相似度(如 sentence-transformers)对比本期与上期相同章节的语句,计算情感分值差异。示例输出:
{
"dimension": "guidance",
"prev_phrase": "我们预计明年收入将保持 15% 增长",
"curr_phrase": "鉴于市场不确定性,收入增长可能放缓至 8%",
"trend": "downward",
"severity": "high",
"source_page": 45
}
7 第六层:生成人工复核清单
复核清单是 AI → 人 → AI 循环的关键环节。每条清单必须指向原始证据,方便 analyst 核实。示例清单:
- 收入增长是否全部来源于主营业务?(见 2024 财年收入明细第 12‑14 页)
- 自由现金流是否低于净利润 20%?(现金流量表第 30 行)
- 毛利率下降是否因原材料成本上涨还是价格压缩?(营业成本分析第 18‑19 页)
- 管理层是否在 MD&A 中暗示 2025 年指引下调?(风险提示第 22‑23 页)
- 风险因素章节是否出现 “regulatory scrutiny” 新增项?(第 27 页)
8 常见坑 / 常见报错
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
LLM 输出未包含 source_page | Prompt 未明确要求 | 在系统提示中加入 “每个字段后必须提供 source_page”。 |
| 表格抽取后列错位 | PDF 使用了合并单元格 | 使用 camelot 的 flavor='stream' 并自行后处理合并单元格。 |
| JSON Schema 校验失败 | 金额单位未统一(如 $1.2B) | 在抽取阶段统一转化为数值(乘以 10⁹),并在校验前做单位标准化。 |
| 风险因素抽取出现空值 | Risk Factors 章节标题不标准 | 在 Chunk 切分阶段使用正则匹配 “Risk Factors” 与本地化标题(如 “风险因素”)。 |
| 复核清单遗漏关键证据 | 章节切分时未保留页码 | 确保每个 Chunk 带 pageRange,并在生成清单时引用。 |
9 对比块 (AI 财报助手 vs 传统财报分析工具)
| 维度 | 传统工具(Excel + 手工) | AI 财报助手 |
|---|---|---|
| 速度 | 半天至数天,取决于报告页数 | 5‑10 分钟完成全部抽取 |
| 准确性 | 人工录入易出错,表格需逐行核对 | 自动校验 JSON Schema,错误可追溯 |
| 可复用性 | 每份报告需重新建模 | 同一 Schema 可跨公司、跨季度复用 |
| 风险识别 | 依赖分析师经验,覆盖面有限 | 结构化风险抽取覆盖全部 Risk Factors 章节 |
| 成本 | 人工成本高,软件授权费 | 基于开源库,服务器成本可控 |
继续阅读 (内部链接)
- AI Financial Report Analyzer:AI 财报助手
- 我做了一个 AI 财报助手:如何用 AI 快速拆解财报、风险和管理层表述?
- 用 AI 分析财报的 7 个步骤:从 PDF 到风险检查清单
- MCP 如何让 AI Agent 访问本地数据和私有工具
- MCP Server SQLite:让 AI 访问本地 SQLite 数据库
- AI Workflow 自动化任务处理方法
准备好分析你的第一份财报了吗?
你可以立刻上传一份 PDF 财报(如 NVIDIA 10-K),体验本工具自动生成的核心 KPI 报表、风险因素和复核清单。