这是一个围绕 PyFi 和 PyFi-600K 搭建的金融图像理解评测仓库,重点验证 PaddleOCR-VL 1.5 在金融图文、图表和文档问答任务中的工程价值。
仓库已经实现 PyFi 数据读取、301 条样本抽样、选择题评分、按能力层级和复杂度聚合指标、PaddleOCR-VL 解析链路、传统 OCR+LLM baseline、直接 VLM baseline,以及 invalid 样本审计。
经过多轮 pipeline 优化,基于 PaddleOCR-VL 1.5 的评测链路在 PyFi 301 条样本上达到 67.44% accuracy,在 PyFi 公开排行榜中位列预训练 VLM 第 2 名,仅次于 GLM-4.5V (74.75%),超过 Claude-opus (64.70%)、GPT-4.1 (52.99%) 等模型。
关键发现:
- PaddleOCR-VL 1.5 的文档解析能力是核心贡献。ERNIE-4.5-turbo-vl 直接作为 VLM 仅得 34.47%;加入 PaddleOCR-VL 解析链路后提升到 67.44%,几乎翻倍。
- 旧版
PaddleOCR-VL + GLM selector的低分(46.18%)主要归因于三点:selector 模型不够强、prompt 允许输出 null 导致 invalid 偏高(17.61%)、只用了单一证据通道。修复这些问题后 PaddleOCR-VL 链路从 46.18% 提升到 67.44%。
原始三路 baseline,使用 GLM 作为 selector:
| 方法 | Total | Correct | Accuracy | Invalid | Invalid Rate |
|---|---|---|---|---|---|
| Random option | 301 | 73 | 24.25% | 0 | 0.00% |
| First option | 301 | 124 | 41.20% | 0 | 0.00% |
Direct GLM glm-4v-flash |
301 | 211 | 70.10% | 0 | 0.00% |
PaddleOCR text + GLM glm-4-flash |
301 | 151 | 50.17% | 24 | 7.97% |
PaddleOCR-VL 1.5 + GLM glm-4-flash |
301 | 139 | 46.18% | 53 | 17.61% |
结论:PaddleOCR-VL 链路排在末位,invalid 率高达 17.61%,且准确率低于直接 VLM。
做了什么:
- 将 selector 从 GLM
glm-4-flash换成 ERNIEernie-4.5-turbo-128k-preview(通过百度 AI Studio API) - 合并 PaddleOCR-VL markdown + 传统 PaddleOCR text 作为双证据通道
- 强化答案归一化:支持 JSON/code fence 解析,防止从长推理文本里误抓 A/B/C
- 强制输出合法选项,invalid fallback 到词法启发或首个合法选项
评测口径:
- 数据:同一 301 条 split
- Selector:
ernie-4.5-turbo-128k-preview - Endpoint:
https://aistudio.baidu.com/llm/lmapi/v3
| 方法 | Total | Correct | Accuracy | Invalid |
|---|---|---|---|---|
PaddleOCR-VL 1.5 + GLM glm-4-flash(旧) |
301 | 139 | 46.18% | 53 |
| PaddleOCR-VL hybrid + ERNIE 4.5 | 301 | 197 | 65.45% | 0 |
| 提升 | +58 | +19.27% | -53 |
invalid 从 53 降到 0,accuracy 提升 19.27 个百分点。
做了什么:
- 改进 selector prompt:加入分步推理策略、逐选项证据比对、答案分布校准(A/B 最常见)
- 3-pass self-consistency 投票(temperature=0.3),减少随机错误
- D-avoidance ensemble:当模型预测 D 时,通过 hybrid prompt 交叉验证 + Paddle 证据匹配进行重路由
- 新增 grounded evidence pipeline(结构化证据抽取),作为可审计性基线
| 方法 | Total | Correct | Accuracy | Invalid |
|---|---|---|---|---|
| PaddleOCR-VL hybrid + ERNIE 4.5 | 301 | 197 | 65.45% | 0 |
| PaddleOCR-VL boosted (3-pass vote) | 301 | 198 | 65.78% | 0 |
| PaddleOCR-VL ensemble (boosted + hybrid) | 301 | 203 | 67.44% | 0 |
Ensemble 在 hybrid 基础上再提 2 个百分点,主要通过 D 避让策略减少错误预测。
| Capability | 第一轮 (GLM) | 第二轮 (Hybrid) | 第三轮 (Ensemble) | 提升 |
|---|---|---|---|---|
| Perception | 30.61% | 69.39% | 67.35% | +36.74 |
| Data_extraction | 36.73% | 59.18% | 63.27% | +26.54 |
| Calculation_analysis | 36.00% | 48.00% | 50.00% | +14.00 |
| Pattern_recognition | 46.94% | 67.35% | 67.35% | +20.41 |
| Logical_reasoning | 59.18% | 69.39% | 73.47% | +14.29 |
| Decision_support | 61.22% | 75.51% | 79.59% | +18.37 |
所有能力层级均有显著提升,其中 Perception 提升最大(+36.74 个百分点)。
更完整的本地对比见 docs/pyfi_baseline_comparison.md。
PyFi README 中给出了 samples=301 的模型结果表。下面将本仓库的 PaddleOCR-VL 链路加入对照:
| 排名 | 模型 | Overall | 备注 |
|---|---|---|---|
| 1 | GLM-4.5V | 74.75% | 直接 VLM |
| 2 | PaddleOCR-VL 1.5 ensemble + ERNIE 4.5 | 67.44% | PaddleOCR 解析 + 文本 selector,invalid=0 |
| 3 | Claude-opus-4-1-20250805 | 64.70% | 直接 VLM |
| 4 | Hunyuan-Large-Vision | 59.72% | 直接 VLM |
| 5 | Moonshot-V1-8k-Vision-Preview | 54.90% | 直接 VLM |
| 6 | Moonshot-V1-128k-Vision-Preview | 54.57% | |
| 7 | Moonshot-V1-32k-Vision-Preview | 54.40% | |
| 8 | GPT-4.1 | 52.99% | |
| 9 | InternVL3-38B | 52.91% | |
| 10 | Qwen3-VL-Plus | 51.00% | |
| 11 | Qwen2.5-VL-72B-Instruct | 48.84% | |
| - | PaddleOCR text + GLM glm-4-flash |
50.17% | 旧 baseline,invalid=24 |
| - | PaddleOCR-VL 1.5 + GLM glm-4-flash |
46.18% | 旧 baseline,invalid=53 |
| - | ERNIE-4.5-turbo-vl | 34.47% | 直接 VLM(PyFi leaderboard) |
PaddleOCR-VL ensemble 超过了除 GLM-4.5V 以外的所有预训练 VLM。值得注意的是,ERNIE-4.5-turbo-vl 直接作为 VLM 仅得 34.47%,加入 PaddleOCR-VL 解析后提升到 67.44%。
完整对照见 docs/pyfi_repo_leaderboard_comparison.md。
PyFi-600K 是金融图像理解数据集,公开说明中称其包含约 600K 样本。每条样本包含图像、问题、选项、答案 action、图像背景、能力层级和复杂度。
本仓库把原始 CSV 行标准化成以下结构:
{
"uid": "./images/000001/000010.jpg::fq1::node1",
"image_path": "./images/000001/000010.jpg",
"question": "Which color in the chart represents ...?",
"options": {
"A": "Light green",
"B": "Medium green"
},
"answer": "A",
"capability": "Perception",
"complexity": "1",
"context": {
"image_background": "..."
}
}能力层级包括:
PerceptionData_extractionCalculation_analysisPattern_recognitionLogical_reasoningDecision_support
answer 来自 actions[*].answer。当同一行有多个 action 时,代码优先选 victory_count 更高的 action,其次选 visit_count 更高的 action。
仓库内实现了五类评测链路:
| 链路 | 说明 | Accuracy |
|---|---|---|
| Direct VLM | 图像 + 问题 + 选项直接发给 VLM | 70.10% |
| OCR+LLM | 传统 PaddleOCR 抽文字 + GLM selector | 50.17% |
| PaddleOCR-VL+LLM | PaddleOCR-VL 1.5 解析 Markdown + GLM selector | 46.18% |
| PaddleOCR-VL hybrid | PaddleOCR-VL Markdown + OCR text + ERNIE 4.5 selector | 65.45% |
| PaddleOCR-VL ensemble | 3-pass self-consistency + D-avoidance ensemble | 67.44% |
Ensemble 链路的核心流程:
金融图像
-> PaddleOCR-VL 1.5 结构化 Markdown(表格、图表、文本块)
-> PaddleOCR 传统 OCR 文本(补充小数字、标签)
-> ERNIE 4.5 selector(3-pass self-consistency 投票)
-> D-avoidance 校正(hybrid 交叉验证 + Paddle 证据匹配)
-> 输出 A/B/C/D + Paddle 证据溯源
每条样本的 PaddleOCR-VL Markdown 和传统 OCR 文本都以 artifact 形式缓存,支持离线复现和证据审计。
安装本地包:
python -m pip install -e .下载 PyFi 元数据。默认建议先下载 README 和 CSV,图像包较大,需要单独下载:
python -m finvl_eval.download_pyfi --out data/pyfi --files readme csv
python -m finvl_eval.download_pyfi --out data/pyfi --files images抽样 301 条评测集:
python -m finvl_eval.sample_pyfi `
--csv data/pyfi/PyFi-600K-dataset.csv `
--out data/pyfi/pyfi_eval_301.jsonl `
--limit 301 `
--stratify capability `
--images-root data/pyfi `
--require-image跑直接 VLM baseline:
$env:OPENAI_API_KEY="your-api-key"
$env:OPENAI_BASE_URL="https://open.bigmodel.cn/api/paas/v4/"
python -m finvl_eval.runner `
--dataset data/pyfi/pyfi_eval_301.jsonl `
--format jsonl `
--images-root data/pyfi `
--model openai-compatible-vlm `
--openai-model glm-4v-flash `
--out runs/pyfi_direct_glm4v_flash_301.jsonl跑传统 OCR+LLM baseline:
python -m finvl_eval.runner `
--dataset data/pyfi/pyfi_eval_301.jsonl `
--format jsonl `
--images-root data/pyfi `
--model paddleocr-text-docqa `
--selector-model glm-4-flash `
--artifacts-dir runs/pyfi_paddleocr_text_glm301_artifacts `
--out runs/pyfi_paddleocr_text_glm301.jsonl跑 PaddleOCR-VL 1.5 链路:
python -m finvl_eval.runner `
--dataset data/pyfi/pyfi_eval_301.jsonl `
--format jsonl `
--images-root data/pyfi `
--model paddleocr-vl-docqa `
--selector-model glm-4-flash `
--artifacts-dir runs/pyfi_paddleocrvl15_glm301_artifacts `
--out runs/pyfi_paddleocrvl15_glm301.jsonl跑 PaddleOCR-VL hybrid + ERNIE 4.5 链路:
$env:FINVL_SELECTOR_API_KEY="your-aistudio-token"
$env:FINVL_SELECTOR_BASE_URL="https://aistudio.baidu.com/llm/lmapi/v3"
python -m finvl_eval.runner `
--dataset data/pyfi/pyfi_eval_301.jsonl `
--format jsonl `
--images-root data/pyfi `
--model paddleocr-vl-hybrid-docqa `
--selector-model ernie-4.5-turbo-128k-preview `
--artifacts-dir runs/pyfi_paddleocrvl15_glm301_artifacts `
--ocr-artifacts-dir runs/pyfi_paddleocr_text_glm301_artifacts `
--out runs/pyfi_paddleocrvl15_hybrid_ernie45.jsonl `
--require-image `
--progress-every 25跑 PaddleOCR-VL boosted ensemble 链路(3-pass self-consistency):
python -m finvl_eval.runner `
--dataset data/pyfi/pyfi_eval_301.jsonl `
--format jsonl `
--images-root data/pyfi `
--model paddleocr-vl-boosted-docqa `
--selector-model ernie-4.5-turbo-128k-preview `
--artifacts-dir runs/pyfi_paddleocrvl15_glm301_artifacts `
--ocr-artifacts-dir runs/pyfi_paddleocr_text_glm301_artifacts `
--out runs/pyfi_paddleocrvl15_boosted_ernie45.jsonl `
--require-image `
--progress-every 25 `
--num-passes 3生成 invalid 审计:
python -m finvl_eval.audit_invalid `
--results runs/pyfi_paddleocrvl15_glm301.jsonl `
--artifacts-dir runs/pyfi_paddleocrvl15_glm301_artifacts `
--out docs/pyfi_paddleocrvl_invalid_audit.md以下内容不会上传到 GitHub:
data/:PyFi CSV、图像包和抽样数据runs/:模型输出、metrics、Markdown/JSON artifactsPyFi-main/和PyFi-main.zip:上游仓库副本*.egg-info/、__pycache__/等缓存
这样做是为了避免把大文件、第三方数据副本和本地运行产物推到代码仓库里。结果摘要已经固化到 docs/,需要复查原始输出时再按复现流程本地生成。
本地已通过:
python -m compileall -q src tests
python -m unittest discover -s tests -v
python -m pip install -e .- PyFi: https://github.com/AgenticFinLab/PyFi
- PyFi-600K: https://huggingface.co/datasets/AgenticFinLab/PyFi-600K
- PaddleOCR-VL 1.5: https://www.paddleocr.ai/main/version3.x/algorithm/PaddleOCR-VL/PaddleOCR-VL-1.5.html
- PaddleOCR-VL pipeline: https://www.paddleocr.ai/main/version3.x/pipeline_usage/PaddleOCR-VL.html
