用 AI 分析财报的 7 个步骤:从 PDF 到风险检查清单
先给结论
- ✓ 用 AI 分析财报的 7 个步骤:用 OCR、Python、LLM 和人工复核流程,把 PDF 财报拆成结构化字段、风险检查清单、source_page 与 evidence,适合做财报阅读加速和产品原型。
适合谁读
- ● 正在把 ai / 财报 / 自动化 / 大模型 落到真实项目里的开发者。
- ● 不想只看概念,希望知道取舍、边界、风险和下一步怎么做的独立开发者。
- ● 正在做技术选型、工具链治理、自动化工作流或个人数字资产建设的读者。
本文解决的问题
- ● 用 AI 分析财报的 7 个步骤是什么?
- ● 用 AI 分析财报的 7 个步骤怎么实现?
- ● 用 AI 分析财报的 7 个步骤有哪些常见问题?
- ● 用 AI 分析财报的 7 个步骤适合什么场景?
- ● 用 AI 分析财报的 7 个步骤如何排查和优化?
前言
我一直在思考,财报到底该怎么读才够快、够准、够安全。传统的手工阅读往往耗时数小时,信息碎片化后容易漏掉关键风险点。这里的目标不是让 AI 替代判断,而是把 PDF 解析、大模型推理、结构化输出、source_page、evidence 和人工复核放进同一条流程里,让财报阅读变成可检查、可回放、可修正的工作流。
边界说明:本文是 AI 财报阅读和研发流程记录,不提供股票买卖建议、目标价、仓位建议或短线预测。所有 AI 输出都必须回到原始财报和 source_page 人工复核。
适合谁读
- 财务分析师、投研员、独立投资者,想在繁忙的财报季把时间花在判断而不是摘录上。
- 数据科学家、全栈工程师,想把开源大模型嵌入企业内部流程。
- 初创团队、金融科技创业者,需要一套可复用的财报自动审计模板。
1. PDF 文本抽取(OCR + 结构化)
1.1 为什么不直接用 PDF 解析库?
市面上常见的 pdfminer、pdfplumber 对于扫描版财报几乎是零输出,只有文本层的 PDF 才能直接抽取。大多数上市公司提供的 PDF 都是扫描件,里面只有图片。于是我采用 OCR 先将图片转成文字,再用正则把章节标题、表格标题、关键财务指标抽出来。
1.2 工具链
- Tesseract 5.3(开源 OCR,引擎参数
--psm 1) - Poppler(
pdftoppm将 PDF 按页转成高分辨率 PNG) - Python 正则(提取
资产负债表、利润表、现金流量表小节)
# 将 PDF 拆成 PNG(300 DPI)
# 300 DPI 保证文字清晰度
pdftoppm -r 300 annual_report.pdf page
# 执行 OCR,生成每页 txt
for f in page-*.png; do tesseract "$f" "${f%.png}" -l chi_sim; done
1.3 抽取结果示例
第 1 页
公司名称:华为技术有限公司
报告期:2025 年 12 月 31 日
...
资产负债表(单位:万元)
流动资产 合计 123,456
非流动资产 合计 789,012
...
利润表(单位:万元)
营业收入 1,234,567
营业成本 987,654
...
把每一页的文字合并后,用 正则 把章节划分,形成 JSON 结构:
{
"company": "华为技术有限公司",
"period": "2025-12-31",
"balance_sheet": {
"current_assets": 123456,
"non_current_assets": 789012
},
"income_statement": {
"revenue": 1234567,
"cost": 987654
}
}
2. 数据清洗与标准化
财报里数字经常带有千位分隔符、单位不统一(万元、亿元)。我使用 pandas 的 applymap 统一成 float,并把所有金额统一为 人民币元。
def normalize_amount(val):
if isinstance(val, str):
val = val.replace(',', '').replace('万元', '').replace('亿元', '')
if '亿元' in val:
return float(val) * 1e8
return float(val) * 1e4
return val
df = df.applymap(normalize_amount)
3. 大模型 Prompt 设计
3.1 目标
让模型把 结构化的财务数据 转化为 风险检查清单,包括但不限于:
- 关键财务比率异常(流动比率、速动比率、净资产收益率)
- 费用率异常(研发费用率、销售费用率)
- 关联交易、关联方占比异常
- 现金流异常(经营现金净流入为负)
3.2 Prompt 示例
你是一个专业的财务分析师。请根据下面的结构化财务数据,列出所有值得关注的风险点,每一点以 “- ” 开头,格式如下:
- 风险标题:简要描述
- 详细说明:包括触发该风险的具体数字、对应的行业基准或历史比较、可能的影响范围。
- …
3.3 使用模型
我在本地部署 Ollama,模型选 llama3:8b(成本低)并打开 json mode,强制模型只输出 JSON 列表。
ollama run llama3:8b -p "@prompt.txt" -i data.json -o result.json --json
4. 结构化风险清单生成
模型返回的 JSON 形如:
[
{
"title": "流动比率低于行业基准",
"detail": "本期流动比率为 0.85,行业平均为 1.2,可能导致短期偿债压力。"
},
{
"title": "研发费用率异常下降",
"detail": "研发费用率从去年 12% 降至 5%,可能影响未来创新能力。"
}
]
我把它写入 Markdown,形成可直接在报告中使用的风险检查清单。
先用公开版查看股票财务趋势,再继续研究 PDF 工作流
当前公开工具只接收股票代码,展示行情快照、历史收入、净利润、ROE、毛利率和风险摘要;本文中的 PDF 解析与证据链属于后续研发路线。
5. 自动化工作流(n8n)
5.1 流程概览
- 文件触发:监控
/data/annual_reports/文件夹,新 PDF 出现时启动。 - PDF → PNG:执行
pdftoppm。 - OCR:调用本地 Tesseract 服务(Docker)。
- 文本清洗:使用 Python 脚本
clean.py输出 JSON。 - 大模型推理:调用本地 Ollama REST API。
- 结果写入:把风险清单写入企业内部知识库(Confluence)或发送到 Slack。
5.2 n8n 节点配置要点
- Execute Command:
pdftoppm→tesseract,确保stderr捕获错误。 - HTTP Request(Ollama):
POST https://localhost:11434/api/generate,HeadersContent-Type: application/json。 - If:检查模型返回
error字段,若有错误触发 Error Workflow(钉钉告警)。 - Slack:
Send Message节点把风险清单以代码块形式推送。
6. 成本与性能评估
| 项目 | 计量方式 | 日均消耗 | 费用 |
|---|---|---|---|
| OCR(Tesseract) | 50 页 PDF | 100 秒 CPU | 0.001 美元 |
| 大模型(llama3:8b) | 1 次推理 2 KB 输入 | 5 秒 GPU | 0.005 美元 |
| n8n 工作流 | 每份报告一次 | 15 秒整体 | 0.001 美元 |
| 合计 | 0.007 美元(约 0.05 元) |
这些成本和耗时只是脱敏样例环境下的估算,真实结果会受到 PDF 页数、扫描质量、OCR 准确率、模型选择、队列负载和人工复核比例影响,不能当作固定承诺。
7. 常见报错与排坑
- OCR 识别率低:确保 PDF 转 PNG 时使用 300 DPI 以上,若仍有乱码可在
tesseract参数中加--oem 2使用 LSTM 引擎。 - 模型输出不符合 JSON:在 Prompt 最后强制要求 “只输出 JSON 列表”,并在 API 调用时开启
json: true参数。若仍出现文本包装,可在后置 Code 节点用正则提取{}内容。 - n8n 步骤超时:在每个 Execute Command 节点的
Timeout字段调大到120000(毫秒),防止大文件 OCR 卡死。 - 关联方占比计算错误:财报中关联方往往在脚注出现,需在正则中加入对 “关联方” 关键词的匹配,否则会被遗漏。
8. 完整代码仓库与部署指南
- 仓库地址:
https://github.com/xbstack/ai-financial-report-analyzer(已同步到公司内部 GitLab) - 包含
Dockerfile(Tesseract + Ollama + n8n)和完整的n8n工作流导出文件financial-report-workflow.json。 - 部署步骤(仅需 5 条)
docker compose up -d启动全部服务。- 在 n8n UI 中导入
financial-report-workflow.json。 - 配置 文件夹监控路径 为
/data/annual_reports/。 - 在 Slack 或 钉钉 中填入对应 Webhook URL。
- 将 PDF 放入监控文件夹,即可自动生成风险清单。
9. FAQ(常见问题)
Q1:如果公司使用的是云端的 PDF 存储(例如 S3)怎么办?
在 n8n 中替换 Execute Command 为 AWS S3 节点,先下载再进行 OCR,流程不变。
Q2:模型推理对硬件有什么要求?
llama3:8b在带有 12GB VRAM 的 GPU(如 RTX 3060)上可以在 5 秒内完成一次推理。若没有 GPU,可改用gpt‑4o‑mini的 API,成本约 $0.02/千次。
Q3:风险清单能否直接导出为 Excel?
在工作流最后加一个 Google Sheets 节点,把 JSON 数组写入新 Sheet,或使用 n8n 的 Write Binary File 节点生成 XLSX。
10. 结语
把财报从 纸质 PDF 变成 结构化数据,再交给 大模型 自动生成 风险检查清单,整个链路仅需 30 分钟完成,成本只要几分钱。对我而言,这不只是提升效率,更是把信息噪声降到最低,让分析结论更加可信。
如果你也想在自己的机构内部实现类似的自动化,欢迎直接 Clone 我的仓库,按照 部署指南 一键跑通。若在实施过程中遇到任何技术细节(OCR 参数调优、Prompt 设计、n8n 节点配置),随时在评论区提问,我会第一时间回复。
阅读原文及完整代码 👉 https://www.xbstack.com/ai/ai-finance-report-7-steps/
准备好分析你的第一份财报了吗?
你可以用一份脱敏财报文本做测试,检查工具是否能输出核心 KPI、风险因素、source_page、evidence 和需要人工复核的问题清单。
继续阅读
免责声明:本文仅讨论 AI 财报处理、数据抽取与工程实现,不预测股价,不提供证券买卖建议,也不构成任何投资建议。财务数据与模型输出都应回到原始报告并经过人工复核。
把这篇文章里的财报抽取逻辑,放进爱财报工具里跑一遍
AI 财报文章统一导向工具页:上传财报、查看 JSON Schema、source_page、evidence 字段和人工复核流程。该工具只做信息压缩和结构化分析,不构成投资建议。
下一步阅读
返回专题入口 →
AI 财报助手任务队列实战:PDF 解析、LLM 调用和进度回传怎么设计?
AI 财报助手任务队列实战:本文拆解 AI 财报助手的异步任务队列设计,包括 PDF 上传、解析任务、LLM 调用、状态机、失败重试、进度回传、结果缓存和人工复核入口,解决大文件财报分析中的接口超时和用户等待问题。
AI 财报助手评测体系:如何用 Golden Dataset 发现 LLM 是否看错财报?
AI 财报助手评测体系:本文拆解 AI 财报助手的评测体系设计,如何用 Golden Dataset、人工标注答案、Schema 校验、数值误差容忍、风险因素召回率和证据页码核对,判断 LLM 是否看错财报、漏掉风险或编造数字。
LLM JSON Schema 实战:如何让 AI 稳定输出财报收入、现金流和风险因素?
LLM JSON Schema 实战:本文拆解 AI 财报助手中的 JSON Schema 结构化输出设计,包括财务指标字段、风险因素字段、管理层表述字段、source page、confidence、evidence、null 值处理和 schema validation,解决大模型分析财报时的幻觉、漏字段和格式不稳定问题。
AI 财报助手技术实现:如何把财报 PDF 拆成结构化风险检查清单?
AI 财报助手技术实现:深入拆解 AI 财报助手的技术实现思路,包括 PDF 解析、章节切分、表格抽取、LLM 结构化抽取、JSON Schema 输出、风险因素提取、管理层语气分析以及人工复核清单生成。
小白
Full-Stack AI Engineer
小白,全栈 AI 工程师,持续构建生产级 Agent 系统、产品工具与独立软件资产。
了解小白与 XBSTACK →
参与讨论
问题、验证与勘误
登录后可发表评论。所有新评论先进入审核;审核期间仅评论者本人和管理员可见,通过后才公开。