用于比较大模型从文本中抽取结构化信息的表现。项目将模型调用、回答保存和离线评分拆成独立环节,统一检查字段内容、输出结构、原文依据、运行状态和重复运行的一致性。
- 使用 JSON 定义字段名称、类型、缺失值和原文依据要求
- 使用纯文本文件管理多套提示词
- 运行 OpenAI-compatible chat completions 接口
- 运行从 stdin 接收提示、向 stdout 返回回答的命令行程序
- 导入已有回答并离线评分
- 解析普通 JSON、代码块内 JSON 和带简短前言的 JSON 对象
- 检查字段结构、状态值和原文逐字依据
- 计算字段准确率、无参考信息时的补写率、JSON 可读取率、结构通过率、耗时和输出长度
- 比较同一设置多次运行的字段一致率
- 区分调用失败、回答读取失败和模型回答质量
- 检查提示示例与测试文本的完全重复和近似重复
git clone https://github.com/ykkai-w/Structured-Extraction-Eval.git
cd Structured-Extraction-Eval
python -m venv .venv
source .venv/bin/activate
python -m pip install -e .项目要求 Python 3.10 及以上版本,运行代码只使用 Python 标准库。
structeval import-results \
--input examples/import_answers.jsonl \
--output outputs/imported
structeval evaluate \
--dataset examples/dataset.jsonl \
--fields examples/fields.json \
--results outputs/imported \
--output outputs/reportsummary.md 提供汇总结果,summary.json 保存指标及其分母,units.csv 和 fields.csv 保存逐条记录。
命令行适配器将完整提示写入 stdin。进程正常结束后,stdout 内容保存为该次回答。
{
"command": ["python", "examples/mock_model.py"],
"model": "local-demo",
"timeout_s": 30
}structeval run \
--dataset examples/dataset.jsonl \
--prompts examples/prompts \
--fields examples/fields.json \
--adapter command \
--adapter-config examples/command_config.json \
--output outputs/command任何符合 stdin 与 stdout 约定的本地程序均可通过修改 command 接入。
复制配置并填写服务地址、模型名和密钥环境变量名:
cp examples/openai_config.example.json private_config.json
export MODEL_API_KEY="..."
structeval run \
--dataset examples/dataset.jsonl \
--prompts examples/prompts \
--fields examples/fields.json \
--adapter openai \
--adapter-config private_config.json \
--output outputs/api配置文件只保存环境变量名,密钥通过环境变量读取。
测试数据使用 JSONL,每行一条:
{
"id": "S001",
"text": "待抽取的原始文本",
"reference": {
"subject": "示例主体",
"amount": 1200,
"technologies": ["机器视觉"]
}
}reference 需要包含字段规范中的全部字段。原文未提及的字段使用 not_stated。
模型回答采用以下结构:
{
"fields": {
"subject": {
"value": "示例主体",
"status": "stated",
"evidence": ["示例主体"]
},
"amount": {
"value": "not_stated",
"status": "not_stated",
"evidence": []
}
}
}状态为 stated 时,evidence 保存原文中的连续片段;状态为 not_stated 时,字段值使用 not_stated,依据使用空数组。
网络中断、超时和非成功 HTTP 状态可以按设定次数重试。模型返回回答后,程序立即保存该次结果;JSON 解析、字段结构和原文依据问题进入评分,不触发重新作答。
再次运行相同命令时,已有回答的运行单元会被跳过,未取得回答的单元继续尝试。独立复跑应使用新的输出目录,并通过 --repeats 记录重复次数。
- JSON 可读取率:回答能否解析为非空 JSON 对象
- 字段结构通过率:字段及
value、status、evidence是否符合规范 - 原文依据通过率:
evidence是否逐字出现在输入文本中 - 可读取回答的字段准确率:可解析回答中的字段匹配结果
- 端到端字段准确率:将不可解析回答对应的字段计为错误
- 无参考信息时的补写率:参考值为空时仍输出具体值的比例
- 重复运行字段一致率:相同设置多次运行的字段值一致程度
各项指标使用不同分母。完整定义见 docs/metrics.md。
structeval scan-overlap \
--examples examples/example_snippets.jsonl \
--tests examples/dataset.jsonl \
--threshold 0.92 \
--output outputs/overlap.json结果区分完全相同文本和近似文本。近似结果需要结合原文判断。
字段定义明确、参考答案可复核的文本抽取任务均可使用这套流程,例如:
- 上市公司公告与年度报告
- 合同、招投标文件和制度文件
- 新闻与研究摘要
- 招聘信息与岗位说明
- 客服记录和业务工单
- 字符串使用规范化后的精确匹配
- 字符串数组忽略顺序并去重
- 原文依据检查验证引文是否存在,不判断引文能否支持进一步推断
- OpenAI-compatible 适配器记录服务返回的 token 用量
- 命令行适配器要求 stdout 只输出最终回答
python -m unittest discover -s tests -v实现说明见 docs/design.md,指标定义见 docs/metrics.md,数据处理建议见 docs/data-and-privacy.md。