LORE — LLM OCR Robustness Evaluation
收藏LORE — LLM OCR 鲁棒性评估基准
数据集概述
LORE 是一个用于评估大型语言模型从受损OCR文本中提取和规范化结构化数据能力的基准。它测试模型在三个文档领域、四个难度层级和五个评估维度上的表现,且无需第三方机器学习依赖。
核心评估目标
该基准旨在评估:给定受损的OCR文本,LLM能否重建原始的结构化记录?其设计使得精确匹配率和平均归一化编辑距离是主要评估指标,而非字段F1值。
数据集构成
文档领域
| 领域 | 文档类型 | 字段 |
|---|---|---|
receipts |
零售/餐饮收据 | vendor, date, total, tax, payment method, line items |
insurance |
保险单文件 | policyholder details, policy number, premium, agent |
hospital |
医院就诊记录 | patient details, vitals, visit reason, physician, insurance |
难度层级
每个样本被分配四个难度层级之一,由应用的噪声函数数量和类型控制:
| 层级 | 应用的噪声 | 破坏内容 |
|---|---|---|
easy |
0–1个字符级错误 | 轻微替换(O→0, l→1) |
medium |
2–3个字符级 + 结构级错误 | 合并行、缺失冒号、日期格式变化 |
hard |
4–5个字符级 + 结构级 + 数字级错误 | 小数点移位、部分日期、值截断 |
extreme |
7–9个所有层级错误 + 语义陷阱 | 字段间值交换、部分擦除、幽灵值、冲突重复项 |
评估指标
| 指标 | 衡量内容 | 是否主要指标 |
|---|---|---|
exact_match_rate |
值完全正确的字段比例 | ✓ 主要 |
mean_ned |
字符串字段的归一化编辑距离 | ✓ 主要 |
field_f1 |
字段存在性F1(精确率 × 召回率) | 次要 |
hallucination_rate |
无法从OCR推导出的虚构字段比例 | 次要 |
schema_valid |
具有正确嵌套结构的输出比例 | 次要 |
correction_gain |
相对于原始OCR文本的改进(负值表示退化) | 次要 |
parse_success |
可解析为有效JSON的输出比例 | 次要 |
ID类型字段(如policy_number、receipt_number、attending_physician.id、agent.agent_id)要求区分大小写的完全匹配,模型无法通过返回看似合理的标识符获得部分分数。
数据集生成与规模
- 数据性质:合成数据。采用合成生成可以精确控制难度、保证真实值,并随时重新生成数据集。
- 种子可复现性:每个样本都是从
base_seed + sample_index生成的。使用相同种子运行sample_builder.py两次会产生完全相同的数据集。 - 数据规模:总计1,200个样本(3个领域 × 4个难度 × 100个样本),按60/20/20的比例划分为训练集/开发集/测试集。
- 数据上下文:数据池(姓名、城市、保险公司、医院连锁店、UPI支付)反映了噪声函数设计所围绕的文档类型,具有印度背景特色。
项目结构与使用
主要目录与文件
config/:包含领域字段模式、评估设置、生成设置和噪声权重的配置文件。prompts/:包含领域特定提示模板和任务指令变体。dataset/:包含生成真实记录、序列化、应用噪声、组装样本和加载数据集的脚本。runners/:包含提示格式化、LLM API调用和多运行编排器的脚本。parsers/:包含JSON解析和各类数据规范化器的脚本。evaluator/:包含字段指标、规范化指标、校正指标、幻觉检测和模式验证的评估脚本。stats/:包含聚合统计、引导置信区间和可视化图表的脚本。report/:包含生成自包含HTML报告的脚本。data/:由sample_builder.py生成的JSONL文件存放目录(未提交至版本库)。runs/:由multi_run.py生成的运行结果存放目录(未提交至版本库)。
环境与依赖
-
要求:Python 3.10+。无需机器学习库,整个流水线在标准库上运行。
-
安装: bash git clone https://github.com/ashwin549/lore-benchmark cd llm-ocr-benchmark pip install -r requirements.txt
-
生成数据集: bash python dataset/sample_builder.py
这将在
data/目录下生成36个JSONL文件。
运行基准测试
-
使用本地模型(通过Ollama): bash ollama pull llama3.2 python -c "from runners.multi_run import run; run(run_id=R06, split=dev)" python report/generator.py
-
使用付费API(OpenAI或Anthropic): bash export OPENAI_API_KEY="sk-..." export ANTHROPIC_API_KEY="sk-ant-..." python -c "from runners.multi_run import run; run(run_id=R03, split=test)"
-
比较两个模型: bash python report/generator.py runs/llama3.2_20260301_104150 runs/gpt4o_20260301_120000
报告包含带有95%引导置信区间和Wilcoxon符号秩检验p值的统计比较部分。
添加新模型
在config/eval_config.json文件的supported_models下添加条目。支持的后端包括:openai、anthropic、ollama、llama_cpp。对于Groq(免费层级,OpenAI兼容),可配置base_url为https://api.groq.com/openai/v1。
噪声函数
- 层级1 — 字符级:
char_O0、char_l1I、char_B8、char_S5、char_sub、char_del、char_transpose。 - 层级2 — 结构级:
missing_colon、merged_lines、split_line、key_abbrev、value_truncated、delimiter_swap。 - 层级3 — 数字/日期级:
num_comma_drop、num_decimal_shift、date_format_vary、date_partial。 - 层级4 — 语义陷阱(仅极端难度):
extraneous_field、ghost_value、conflicting_field、ambiguous_key、value_swap、section_erase。
示例结果(Llama 3.2,2B参数,本地运行,开发集)
| 难度 | 精确匹配率 | 平均NED |
|---|---|---|
| easy | 0.731 | 0.208 |
| medium | 0.518 | 0.294 |
| hard | 0.333 | 0.377 |
| extreme | 0.243 | 0.428 |
| 总体:精确匹配率 0.456 · NED 0.327 · 幻觉率 0.143 |
引用
@misc{lore2026, title = {LORE: LLM OCR Robustness Evaluation}, year = {2026}, url = {https://github.com/ashwin549/lore-benchmark} }
许可证
MIT




