THUNLP-MT/pverify
GitHub: THUNLP-MT/pverify
该项目是论文《开放性数学问题的悲观验证》的官方代码库,通过多并行验证器实现高效的数学证明正确性检验。
Stars: 6 | Forks: 1
# pverify
论文《开放性数学问题的悲观验证》官方代码库
在悲观验证中,我们对同一个证明构建多个并行的验证过程,如果其中任何一个报告错误,则判定该证明不正确。这种简单的技术在许多数学验证基准测试中显著提高了性能,且不会引入过多的额外预算。在测试时扩展中,其 token 效率甚至超过了扩展的 long-cot。


本仓库包含所有三种 pverify 方法的官方实现,以及一个完整的基线,用于复现我们论文中的所有结果。在 `cases` 文件夹下还包含了我们案例研究的完整详细信息列表。我们也鼓励社区对悲观验证进行更多实验,以更好地确定其真实性能。
## 用法
你可以通过以下步骤开始使用此仓库:
- 创建一个使用 Python 3.11 的环境并安装依赖项:`pip install -e .`(如果你使用 `uv`,则运行 `uv sync`)。
- 使用你的模型端点运行验证器,并选择一种 reviewer 风格。示例(在 QZ bench 上进行渐进式验证):
`python main.py --reviewer progressive --eval_dataset NP_dataset/qz_bench_eval.jsonl --proof_model gpt-5-mini --eval_model gpt-5 --prover_base_url --prover_api_key `
- 要跳过证明生成并仅验证现有样本,请传入 `--verifier_samples `(例如 `Salesforce/Hard2Verify`、`NP_dataset/gradingbench.csv`)。
- 日志文件(指标、样本和成本)将写入 `eval_logs//`;使用 `--log_dir` 进行调整。
- 我们实验的即用型命令模板位于 `scripts/` 中(gradingbench、Hard2Verify、QZ bench)。
请注意,如果你想评估 QZ bench 中的结果,你需要首先通过一个强大的验证器运行证明和评估。你需要先运行 `scripts/qz_bench_gpt_5_mini_gen.sh`,并将其日志目录作为 `scripts/qz_bench_gpt_5_mini_eval.sh` 中的 `verifier_samples` 传入。
## ArxivMathGradingBench
该仓库支持 35 篇论文的
`LukeBailey181Pub/ArxivMathGradingBench` 数据集。准备一次:
```
python scripts/prepare_arxiv_math_grading_bench.py
```
对于每篇论文确切标注的 arXiv 版本,这将创建:
- `pdfs/arXiv-.pdf`:完整渲染的论文;
- `source_archives/arXiv-.src`:原始的 arXiv 源响应;
- `sources//`:安全提取的完整源代码树;
- `proof_bundles/arXiv-.tex`:所有文本格式的 TeX/BibTeX/样式
源文件按原样拼接而不进行重写,并带有明确的文件边界;
- `manifest.jsonl`:元数据、路径、源文件列表和 SHA-256 哈希值。
下载是幂等的,并且会重试临时的网络故障。文件是
根据每篇论文自身记录的许可从 arXiv 获取的,因此
作为本地生成的数据保留,而不是提交到此仓库中。
直接在准备好的证明包上运行评估:
```
python main.py \
--eval_dataset LukeBailey181Pub/ArxivMathGradingBench \
--arxiv_data_dir NP_dataset/arxiv_math_grading_bench \
--reviewer pessimistic \
--reviews 4 \
--eval_model \
--eval_base_url \
--eval_api_key \
--location_judge_model
```
此数据集始终跳过证明构建和证明生成。它的
`problem` 字段被特意设为空字符串;完整、逐字的源
包被放置在 `proof` 中。空问题会激活整篇论文审查
模式。标准的悲观 rollouts 会在 `` 内接收整个证明一次。
渐进式悲观验证在其第一次迭代中使用相同的整篇论文
提示;随后的每个聚焦请求都包含
完整的 `` 和一个 ``。reviewer 被指示
将论文本身的研究问题、定理和证明作为目标。
每次悲观运行还会写入 `reviewer_input_audit.json`,记录
问题为空的标志、整篇论文的字符数以及论文
在每个请求中出现的次数。这使得意外遗漏或重复
论文输入的情况可以直接被审计,而无需在日志中复制源文件。
如果验证器报告错误,一个单独的 location-judge agent 会将
报告与标注的 `Location of Error` 进行比较。在论文层面上,一个真正的
负样本需要同时满足拒绝和匹配的错误位置。通过、错误的
位置或无法解析的位置判断均被视为假阳性。由此产生的
`tn`、`fp` 和 `tnr = tn / (tn + fp)` 将被写入 `verifier_eval.json` 中的
`location_aware` 下;每篇论文的判断结果将保留在
`verifier_samples.json` 和 `samples.json` 中。
对于渐进式运行,`verifier_eval.json["progressive_iteration_metrics"]` 中的每个条目还包含
带有累积 `tn`、`fp`、`accuracy`、`tnr` 和
`new_tn_this_iteration` 的 `location_aware_metrics`。因为所有 35 篇论文都是真实负样本,
位置感知准确率等于 TNR;`metrics_if_stopped["accuracy"]` 保持
在错误位置匹配之前的原始正确拒绝准确率。
**CLI 参数**
- `--eval_dataset, -ed`(字符串,默认为 `""`):用于评估的数据集路径或 HF 名称;参见 `NP_dataset/` 预设和 `Salesforce/Hard2Verify`。
- `--proof_model, -pm`(字符串,默认为 `""`):用于生成证明的模型 ID。
- `--eval_model, -em`(字符串,默认为 `""`):用于判断证明的模型 ID。
- `--log_dir`(字符串,默认为 `eval_logs`):写入带时间戳的运行文件夹的基础目录。
- `--reasoning_effort`(字符串,默认为 `medium`,可选范围 `minimal|low|medium|high`):发送给支持模型的推理深度。
- `--reviewer`(字符串,默认为 `standard`,可选范围 `standard|pessimistic|vpessimistic|progressive|ppruning`):验证策略。
- `--reviews`(整数,默认为 `3`):多审查验证器(`pessimistic`、`ppruning`)每个样本的最大审查次数。
- `--chunk_length`(整数,默认为 `7`):`vpessimistic` 每个 chunk 的行数。
- `--progressive_max_iters`(整数,默认为 `3`):`progressive` 的细化轮数。
- `--progressive_min_chunk_size`(整数,默认为 `6`):`progressive` 每个 chunk 的最小行数。
- `--prover_base_url`(字符串,默认为 `""`):prover 模型的端点基础 URL。
- `--eval_base_url`(字符串,默认为 `""`):evaluator 的端点基础 URL(为空时回退到 prover 基础 URL)。
- `--prover_api_key`(字符串,默认为 `""`):prover 端点的 API key。
- `--eval_api_key`(字符串,默认为 `""`):evaluator 端点的 API key(为空时回退到 prover 的 key)。
- `--enable_thinking` / `--no-enable_thinking`(标志,默认开启):切换特定于提供商的 `enable_thinking` 参数。
- `--verifier_samples`(字符串,默认为 `""`):预设计算问题/证明的路径或数据集名称(跳过新的证明生成,并在可用时使用存储的真实标签)。
- `--arxiv_data_dir`(字符串):准备好的 ArxivMathGradingBench 目录。
- `--location_judge_model`(字符串):独立的错误位置判断器;默认为 `--eval_model`。
- `--location_judge_base_url` / `--location_judge_api_key`:location judge 的可选端点覆盖。
标签:DLL 劫持, Python, 人工智能, 大模型评估, 大语言模型, 数学推理, 无后门, 用户模式Hook绕过, 答案验证, 逆向工具