LiteParse 评测工具集实战:基于 LLM-as-a-Judge 的 PDF 解析质量评估与基准测试
2026/9/15 16:37:14 网站建设 项目流程

LiteParse 评测工具集实战:基于 LLM-as-a-Judge 的 PDF 解析质量评估与基准测试

【免费下载链接】liteparseA fast, helpful, and open-source document parser项目地址: https://gitcode.com/GitHub_Trending/li/liteparse

本指南围绕仓库中的 dataset_eval_utils 评测工具集展开,讲解如何为 PDF 解析任务生成结构化 QA 数据集(ground truth)、利用 LLM 裁判(LLM-as-a-Judge)跨解析器评估文本提取质量,并对各解析器做延迟与性能基准测试。读完本文,你将掌握lp-processlp-evaluatelp-benchmark三个 CLI 工具的完整用法、底层实现原理与评测结果解读方法,可直接用于构建自己的文档解析评测流水线。

工具集定位:为什么需要专门的 PDF 解析评测框架

PDF 解析的质量很难用单一的字符级指标(如 Levenshtein 距离)衡量:文本顺序颠倒、表格结构丢失、多栏排版错位等问题,都可能导致"提取出来了但内容不可用"。LiteParse 评测工具集(liteparse-eval)采用的思路是LLM-based QA evaluation:先用 Claude 的视觉能力从文档页面生成"问题-答案"对作为 ground truth,再让目标解析器提取文本、让 LLM 基于提取文本回答问题,最后由独立的 LLM 裁判判断预测答案与标准答案是否语义等价,从而把"解析质量"转化为可量化的通过率(pass rate)。

该工具集在仓库中的位置为 dataset_eval_utils/ ,核心实现分布在src/liteparse_eval/目录下,通过 pyproject.toml 声明包信息并注册了三个 CLI 入口:lp-processlp-evaluatelp-benchmark

环境准备与安装

工具集要求Python 3.12+。从dataset_eval_utils目录执行:

pip install -e .

安装前建议先查看 pyproject.toml 中声明的依赖,主要包括:

  • anthropic>=0.104.1:LLM 问答与裁判能力
  • liteparse>=2.0.0:LiteParse 解析器(本仓库主项目的 Python 封装)
  • pymupdf>=1.27.2pymupdf4llm>=1.27.2pypdf>=6.13.3pdftotext>=3.0.0markitdown[all]>=0.1.5opendataloader-pdf>=2.4.1:对比评测的解析器后端
  • pillow>=12.2.0:报告生成时的图像处理
  • rapidfuzz>=3.14.5:文本相似度辅助

由于 LLM 评测与数据集生成都依赖 Anthropic 的 Claude,还需要设置环境变量:

export ANTHROPIC_API_KEY=sk-ant-...

ANTHROPIC_API_KEY可以通过环境变量提供,也可以用各命令的--api-key参数显式传入。所有依赖官方说明见 pyproject.toml,三个 CLI 入口注册于 pyproject.toml。

第一步:用 lp-process 生成 Ground Truth 数据集

lp-process利用 Claude 的视觉能力(vision)处理 PDF 和图片文件,逐页生成结构化的 QA 数据,作为后续评测的"标准答案"。

基本用法

lp-process /path/to/documents --output-dir ./ground_truth

参数说明(与 processing.py 中的 argparse 定义一致):

参数默认值说明
input_dir(位置参数)存放 PDF / 图片的输入目录
--output-dir./output输出 JSON 文件的保存目录
--modelclaude-sonnet-4-5-20250929用于分析的 Claude 模型
--api-keyAnthropic API Key(未提供时读取ANTHROPIC_API_KEY环境变量)

底层处理流水线

从 processing.py 的process_file可以看到完整流程:

  1. 发现文档find_documents递归扫描输入目录,支持.pdf.jpg.jpeg.png.gif.webp六种格式,并同时匹配小写与大写扩展名;每批最多随机采样 50 个文档(见 processing.py 与 L267);
  2. PDF 转图片:对 PDF 调用 LiteParse 的parser.screenshot(pdf_path, dpi=dpi)按页渲染,默认 DPI 为 150(processing.py);若当前 LiteParse 版本未实现该能力,会捕获NotImplementedError并跳过该文件;
  3. 图片编码:将页面图片 base64 编码,并根据扩展名推断媒体类型(jpeg/png/gif/webp)(processing.py);
  4. Claude 结构化分析:调用client.beta.messages.parse,使用structured-outputs-2025-11-13beta 能力,直接以 Pydantic 模型作为输出 schema(processing.py)。

Ground Truth 的数据结构

每页输出一个 JSON 文件,内容遵循PageAnnotationschema(processing.py):

{ "has_text": true, "document_type": "academic_paper", "layout_complexity": "multi_column", "qa_pairs": [ {"question": "论文中提出的方法叫什么?", "answer": "LiteParse"}, {"question": "实验在多少个数据集上验证?", "answer": "3 个"} ] }

字段含义:

  • has_text:文档页是否包含可读文本;
  • document_type:文档类型,枚举值为academic_paperforminvoicenewspaperother
  • layout_complexity:版面复杂度,枚举值为simplemulti_columncomplex
  • qa_pairs:3~5 个"问题-答案"对。分析提示词要求生成"有趣、多样、有时具有挑战性"的问题,因为这些数据将被用于文档解析基准(LLM-as-a-judge 评判 QA 回答),见 processing.py。

输出文件命名规则

多页 PDF 按页输出为{文件名}_page_{页码:03d}.json(如report_page_001.json),单张图片输出为{文件名}.json(processing.py)。该命名规则直接决定了后续lp-evaluate的匹配方式。

官方预生成数据集

README 提到一个已经用该框架生成并评测过的公开数据集,可用 Hugging Face CLI 下载:

hf download run-llama/liteparse-eval-dataset --repo-type dataset --local-dir ./liteparse-eval-dataset

下载后可直接配合lp-evaluate使用,也可以作为参考示例理解 ground truth JSON 的组织方式。

第二步:用 lp-evaluate 运行 QA 评测

lp-evaluate是评测的核心:它让 LLM 基于解析器提取出的文本来回答 ground truth 中的问题,再用独立的 LLM 裁判判断答案正确性,最终汇总为通过率。

基本用法

lp-evaluate \ --data-dir ./documents \ --ground-truth-dir ./ground_truth \ --parse-provider liteparse \ --output ./results/run1

参数说明(与 evaluation.py 一致):

参数默认值说明
--data-dir必填存放源 PDF 文档的目录
--ground-truth-dir必填存放 ground truth JSON 文件的目录
--output结果保存路径(生成 JSON + HTML 报告)
--parse-providerliteparse待评测解析器,可选pymupdfpypdfmarkitdownliteparsepdftotextpymupdf4llm-textpymupdf4llm-mdopendataloader
--llm-provideranthropic回答问题的 LLM,当前仅支持anthropic

文档与 Ground Truth 的匹配规则

评测前,程序会用ground_truth_dir.glob("*.json")找到所有 ground truth 文件,然后在数据目录中查找同名(不含扩展名)的 PDF 源文件进行配对(evaluation.py)。因此使用lp-process生成数据后,务必保持源文档与 ground truth 的文件名基准一致。找不到源文件的 ground truth 会被跳过并打印警告。

双模型设计:回答者与裁判分离

从 evaluation.py 可以看到默认配置:

  • 回答问题的 LLMclaude-sonnet-4-5-20250929(与lp-process默认模型一致),负责阅读提取文本并回答问题;
  • 裁判 LLMclaude-haiku-4-5-20251001,独立实例,负责评判答案是否语义等价。把"回答"与"裁判"分离,可以有效避免同一模型既当运动员又当裁判带来的偏差。

AnthropicProvider初始化时设置了max_retries=100timeout=10000的重试与超时策略(anthropic.py),在大批量评测时提升稳定性。

三份输出文件

运行后生成三个结果文件(evaluation.py):

  1. <output>.json— 聚合结果:总文档数、总问题数、整体 LLM 裁判通过率(overall_llm_judge_pass_rate)、逐文档通过率、解析延迟与 LLM 延迟的统计指标(count、total、average、min、max、stddev);
  2. <output>_detailed.json— 逐文档详细结果,包含提取出的完整文本与每个 QA 对的 question/expected_answer/predicted_answer/llm_judge_pass,方便排查失败原因(evaluation.py);
  3. <output>_report.html— 交互式 HTML 报告,基于 report.py 生成,使用 PyMuPDF 渲染 PDF 页面预览,逐文档展示 QA 明细与通过率,适合分享给团队审阅。

第三步:用 lp-benchmark 做性能基准测试

lp-benchmark与 QA 评测互补:它只测量解析延迟与文本产出,不涉及 LLM,用于对比各解析器的速度。

lp-benchmark ./documents --providers pymupdf liteparse --output ./bench.json

以当前仓库源码为准,实际参数为(benchmark.py):

参数默认值说明
input_dir(位置参数)存放 PDF 的目录(注意:源码为目录而非单文件)
--providers全部本地解析器待评测解析器列表,可选liteparsepymupdfpypdfmarkitdownpdftotextpymupdf4llm-textpymupdf4llm-mdopendataloaderpdf-inspector
--warmup-runs5每个解析器计时前的预热轮数
--outputJSON 结果保存路径

需要说明:README 中记录的示例lp-benchmark document.pdf --providers pymupdf liteparse --runs 20与当前源码存在差异——源码中位置参数是目录而非单文件,且参数名为--warmup-runs(无--runs),预热默认值为 5。若你的安装版本命令行为与此不符,请以lp-benchmark --help实际输出为准。

评测流程与输出

从 benchmark.py 的实现看,流程为:

  1. 扫描目录下所有.pdf(非递归),用pypdf统计每份文档页数;
  2. 对每个解析器执行预热运行(默认 5 轮),规避冷启动与 JIT/加载开销;
  3. 对每份文档计时提取(time.perf_counter),记录耗时与提取字符数;
  4. 终端打印对齐表格,包含每文档耗时、TOTAL 行、AVG/doc 行以及按页均摊的MS/PAGE行(提取失败标记为ERROR,聚合行带*提示);
  5. 输出 JSON 包含per_document(seconds、text_length、ms_per_page)、total_secondsavg_secondsms_per_pagenum_successnum_error等字段。

解析器 Providers 全览

评测框架通过统一的ParserProvider抽象接口(providers/parsers/base.py)屏蔽差异,每个解析器只需实现extract_text(file_path) -> str。各实现位于 providers/parsers/:

Provider底层库实现要点
liteparseLiteParse空间感知文本提取,支持 OCR;封装在 liteparse.py,默认output_format="markdown"
pymupdfPyMuPDFfitz打开文档后逐页get_text(),页间以空行连接(pymupdf.py)
pypdfpypdf纯 Python 实现,PdfReader逐页extract_text()(pypdf.py)
markitdownMarkItDown微软文档转 Markdown 工具,返回text_content(markitdown.py)
pdftotextpdftotextpoppler 命令行工具封装
pymupdf4llm-text/pymupdf4llm-mdPyMuPDF4LLM分别输出纯文本与 Markdown 两种格式
opendataloaderOpenDataLoader PDF数据加载生态的 PDF 提取

其中liteparse作为默认提供者,其封装类支持丰富的初始化参数(liteparse.py):ocr_enabled(扫描件 OCR 开关)、ocr_server_url(HTTP OCR 服务地址,缺省回退 Tesseract)、ocr_language(OCR 语言,默认en)、max_pages(最大解析页数,默认 1000)、dpi(渲染 DPI,默认 150,影响 OCR 质量)、preserve_very_small_text(是否保留极小字号文本)。

如需接入新解析器,只需继承ParserProvider并实现extract_text;默认的extract_text_batch提供顺序批处理实现,支持原生批处理的提供者可覆写该方法(base.py)。

裁判机制原理:提示词与判定逻辑

理解评测结果前,需要了解两个关键提示词,它们定义在 providers/llm/base.py:

回答提示词(QA_PROMPT)——要求 LLM 只依据<document>标签内文本回答问题,简洁准确、尽量引用原文;若文档不含答案,必须回答not found

<document>{ocr_text}</document> Answer the following question about the document. Be as concise and accurate and possible, pulling from the exact text. If the document does not contain the answer, response with 'not found'. Question: {question}

裁判提示词(JUDGE_PROMPT)——判定两个答案是否语义等价,明确给出四条标准:措辞不同但语义相同算通过;答案可依赖问题上下文;预测答案说 "not found" 时仅在标准答案同样表示信息缺失时才通过。输出格式为<pass>简短理由</pass><fail>简短理由</fail>

裁判的通过判定逻辑在 anthropic.py:将响应文本小写化后,包含<pass且不包含<fail即判定通过;若裁判调用异常或返回空内容,则宽容地视为通过(return True),避免单次裁判故障拖垮整轮评测。

端到端评测管线实操

将三步串起来即构成完整的评测工作流:

# 1. 准备环境 export ANTHROPIC_API_KEY=sk-ant-... pip install -e ./dataset_eval_utils # 2. 生成 ground truth(每页一个 JSON) lp-process ./documents --output-dir ./ground_truth # 3. 评测 liteparse 的提取质量 lp-evaluate \ --data-dir ./documents \ --ground-truth-dir ./ground_truth \ --parse-provider liteparse \ --output ./results/liteparse # 4. 换 pymupdf 做对比 lp-evaluate \ --data-dir ./documents \ --ground-truth-dir ./ground_truth \ --parse-provider pymupdf \ --output ./results/pymupdf # 5. 性能基准对比 lp-benchmark ./documents --providers pymupdf liteparse --output ./bench.json

评测的四个阶段(对应 evaluation.py 的run_qa_eval):

  1. 提取文本:用所选 parser provider 从 PDF 提取文本,同时记录解析耗时;
  2. 回答问题:LLM 读取提取文本,逐题回答 ground truth 中的问题,逐题记录延迟;
  3. 裁判判定:独立的 LLM 裁判判断预测答案与标准答案是否语义等价;
  4. 汇总:按文档与整体计算通过率(通过题数 / 总题数)。

运行lp-evaluate时,终端会实时打印每份文档的通过率与平均 LLM 延迟,例如QA: LLM judge pass: 82.5% [avg LLM: 3.21s],最后汇总整体通过率与总问题数(evaluation.py)。

结果解读与报告使用

聚合 JSON(<output>.json)中最关键的指标是overall_llm_judge_pass_rate——它衡量"解析器提取出的文本能否支撑 LLM 正确回答问题"的比例,间接反映提取内容的语义完整性。详细 JSON 中的qa_evaluation.qa_pairs记录了每个问题的标准答案、预测答案与判定结果,是定位解析缺陷的最佳入口:

  • 预测答案与标准答案语义接近但被判 fail:多为文本顺序错乱导致 LLM 引用出错,或裁判判定过严,可对照extracted_text字段核实;
  • 大量问题回答 "not found":说明文本提取严重缺失(如扫描件未开 OCR、表格内容丢失);
  • 多栏版面通过率显著偏低:可尝试切换为liteparse(空间感知提取)或开启 OCR。

HTML 报告(<output>_report.html)由 report.py 生成,内嵌 PDF 页面预览(通过 PyMuPDF 渲染),逐文档展示通过率与 QA 明细,适合在评审会上直接打开讨论。

常见问题与注意事项

  • API Key 缺失:所有 LLM 相关命令都需要ANTHROPIC_API_KEY;未设置时会直接报错,可改用--api-key传入;
  • ground truth 与源文档命名不一致lp-evaluate按同名 stem 匹配,务必保持report.pdfreport.json(或report_page_001.json)的命名约定;
  • 扫描版 PDFlp-process依赖 LiteParse 的截图能力渲染页面,若当前版本未实现会打印Skipping PDF (conversion not implemented)并跳过;lp-evaluate侧如需处理扫描件,请使用带 OCR 的解析器配置;
  • provider 依赖未安装:每个解析器后端是独立依赖,未安装对应库时lp-benchmark会在初始化阶段捕获异常并将该 provider 标记为ERROR,不影响其他 provider 的评测;
  • README 与源码的命令差异lp-benchmark请以源码 argparse 定义的参数(目录入参、--warmup-runs)为准,命令前可先执行lp-benchmark --help确认。

总结

LiteParse 评测工具集提供了一条从"数据准备 → 质量评测 → 性能基准"的完整评测闭环:lp-process用 Claude 视觉能力生成带文档类型、版面复杂度标注的 QA ground truth;lp-evaluate通过"回答 + 独立裁判"的双 LLM 机制把解析质量量化为通过率;lp-benchmark补充延迟维度的对比数据。三者共享统一的ParserProvider抽象,新增解析器只需实现一个extract_text方法即可纳入评测。这套框架既可用于 LiteParse 与其他解析器的横向对比,也可作为团队内部文档解析回归测试的基础设施。

【免费下载链接】liteparseA fast, helpful, and open-source document parser项目地址: https://gitcode.com/GitHub_Trending/li/liteparse

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询