Kleister-NDA 实测:公开基准上的诚实抽取数字

核心结论: 在公开的 Kleister-NDA 基准(arXiv 2105.05796——真实 SEC EDGAR 保密协议,确定性构建的 40 文档集)上,我们的无凭据规则抽取器开箱即得字段 F1 0.523,经一轮针对性规则改进后达到 0.697,两轮的来源归因准确率均为 1.0——每个抽取值都是其引用块中的原文片段。另一项独立测量:将结构化 LLM 输出从客户端 TOOLS 模式函数调用切换到服务端 Schema 约束解码,在完全相同的环境下把 Schema 校验失败从 12/40(30%) 降到 0/40。本文所有数字均为定点实测(2026-07-06),以数据文件形式提交在仓库的 content/kleister_results.toml 中并在构建时注入——不是每次站点构建时重新计算——文末给出可复现的命令。

我们先攻击了自己的合成数字

我们的 NDA 垂直领域最初随一套作者自写的合成黄金集发布,字段 F1 0.981。这个数字是真实的,但证明的是另一件事:它验证了流水线正确性——抽取、归因、指标在新领域端到端全部工作——而不是真实世界的准确率,因为规则正是在被评分的那些文档上调出来的。

于是我们用一个第三方公开基准来攻击它。Kleister-NDA 是一组真实提交给 SEC 的保密协议,标注来自基准作者而非我们。同一个在合成文档上得分 0.981 的抽取器,在真实文档上只得 0.523。这个差距——0.981 对 0.523——才是诚实的全貌,也正是不应轻信厂商在自制数据上做的抽取演示的原因,包括我们自己的。

分字段结果:两轮对比

Kleister-NDA 只标注四个字段。以下是有标注文档上的字段 F1("初始" = 在合成集上调好的规则;"改进后" = 针对性修复之后;40 文档集由 train + dev-0 确定性构建——隐藏的 test-A 标注从未使用):

字段 有标注文档数 初始 F1 改进后 F1
party(缔约方) 40 0.025 0.550
effective_date(生效日期) 29 0.345 0.759
term(期限) 14 0.286 0.714
governing_law(管辖法律) 40 0.925 0.925(未变)

综合字段 F1:0.523 → 0.697。来源归因准确率:两轮均为 1.0

改进具体做了什么

三项针对实测失败模式的定向修复,每项都做了双侧规范化(同一个辅助函数同时规范化标注和抽取结果,格式差异永远不会被算作错误),且均有单元测试:

governing_law 原本已达 0.925,未作改动。全程有两道回归防线:合成 NDA 评测保持在 0.981,通用 CUAD 合同基线字节级不变——NDA 规则只复用共享辅助函数,没有分叉核心引擎。

来源归因准确率 1.0——源于构造,不是运气

每个抽取字段都携带 source_block_id,指标会校验抽取值确实出现在被引用块的文本中(对多值的 party 字段,每一个抽取实体都必须出现在引用块中)。规则查找器只会输出其匹配到的那个块中的片段,因此归因在构造上成立——即使字段 F1 还是 0.523 时,归因准确率也保持 1.0。值错但引用诚实是可恢复的失败模式;引用错误的证据则不可恢复。

结构化解码:瓶颈是可靠性,不是模型能力

一项独立测量,在 40 文档的 CUAD 合同集(不是 Kleister)上,两次运行环境完全相同——Lambda A100-40GB、Ollama、qwen2.5:32b-instruct @ 32K 上下文:

相同模型、相同提示词、相同文档。那 30% 的失败类别是传输层问题,语法约束解码在传输层将其消除。剩余的归因准确率缺口是 wrong_span——值正确但引用了错误的块——任何输出格式约束都无法修复它。

诚实的局限

自己复现一下

Kleister-NDA 仓库未声明明确许可证,因此其文件从不提交到本仓库——请将 KLEISTER_DIR 指向你自己的检出:

git clone https://github.com/applicaai/kleister-nda
git clone <repo> && cd contract-rag && uv sync --extra dev
KLEISTER_DIR=../kleister-nda uv run python -m contract_rag.verticals.nda.kleister         # 构建确定性 40 文档集
KLEISTER_DIR=../kleister-nda uv run python -m contract_rag.verticals.nda.kleister --eval  # 字段 F1 + 来源归因准确率

数据集构建是确定性的(train + dev-0,带种子的选取),因此在 PDF 解析器的环境差异范围内,你应能复现字段 F1 0.697 / 来源归因准确率 1.0。如果你的数字有实质差异,欢迎提 issue——公开测量的意义正在于此。