招标文件解析(tender-parse)
概述
把一份(可能由多个 PDF 分册组成的)招标文件解析为结构化结果:项目关键信息 + 评审项清单(含定性/定量、主观/客观、单家/横向、分值、评审维度、业务本体),存入 SQLite,并用本地 Web 页面展示,支持点击条目定位回 PDF 原文。
工作分两个阶段,按顺序执行:
阶段一 解析入库:read_pdf.py 逐分册读取 → 通读并提取 → 组装 parse_result.json → save_to_db.py 校验入库
阶段二 结果展示:display_http_server.py 启动本地服务 → 浏览器/present_files 打开页面
目录结构
tender-parse/
├── SKILL.md 本文件
├── requirements.txt Python 依赖(阶段一、二共用)
├── scripts/
│ ├── read_pdf.py 读取 PDF 文本/图片块与坐标 → .txt + .blocks.json
│ ├── model.py 数据结构权威定义(pydantic)
│ ├── create_tables.sql SQLite 建表语句(save_to_db.py 自动执行)
│ ├── save_to_db.py 校验 parse_result.json 并入库
│ └── display_http_server.py 本地展示服务
├── references/
│ ├── data-model.md 数据结构与 DB Schema 详解(字段、类型、JSON 映射)
│ ├── analyze-guide.md 阶段一操作指南(关键信息清单、判定规则、多分册注意事项)
│ └── display-guide.md 阶段二展示服务用法与排错
└── assets/
└── static/ 展示前端(index.html/result.js/result.css + pdf.js 及其字体、cmap、wasm 资源)
环境准备
在虚拟环境中安装依赖(不要污染全局环境):
python -m venv .venv
.venv/Scripts/pip install -r <skill_dir>/requirements.txt # Windows
# .venv/bin/pip install -r <skill_dir>/requirements.txt # macOS/Linux
阶段一:解析入库
开始前先完整阅读 references/analyze-guide.md 与 references/data-model.md,前者给出操作步骤与判定规则,后者是数据结构的权威定义。
-
建立项目工作目录(如
<项目名>/),PDF 分册放入pdfs/,中间产物放blocks/。 -
对每个分册运行读取脚本(可多次、可并行):
python <skill_dir>/scripts/read_pdf.py "pdfs/招标文件第1册.pdf" "blocks/vol1" -
通读
.txt(每块一行#B序号 | p页码 | y0:坐标 | 内容),定位招标公告、投标人须知、评标办法中的评审表及被引用的正文条款。 -
按模型结构组装
parse_result.json:key_information:项目名称、招标编号、招标人、招标代理机构、采购方式、预估采购金额、最高投标限价、开标时间等(清单见 analyze-guide.md §3),每条必须带来源段落定位;eva_items:逐条评审项,含 listed_text(评审表原文单元格)、link_paragraphs(表外引用)、qua_quan/sub_ob/is_all_org 判定、分值、dimension/substance(判定规则见 analyze-guide.md §4);SematicParagraph由.blocks.json中的连续块合并而成,abs_file_path必须指向真实所属分册,page_num是分册内页码。
-
入库(自动建表 + pydantic 校验,失败会打印错误详情):
python <skill_dir>/scripts/save_to_db.py --db zbjx.db --input parse_result.json -
按 analyze-guide.md §6 的自检清单核对,修正后重新入库(默认全量替换两张表)。
阶段二:结果展示
-
启动服务(
--pdf-dir指向招标 PDF 所在目录,前端按文件名匹配分册):python <skill_dir>/scripts/display_http_server.py --db zbjx.db --pdf-dir "pdfs/" --port 8000 -
用 present_files 打开
http://127.0.0.1:8000/。 -
页面功能:关键信息 Tab(点击行 → PDF 红框标注原文出处)、评审项 Tab(左列表/中原文与引用段落/右评审维度卡片,均支持定位)、PDF 翻页缩放。
-
参数、端点、排错详见
references/display-guide.md。
硬性约束
- 所有定位数据(SematicParagraph)的
abs_file_path、page_num、bbox必须真实可回溯,前端依赖它们在 PDF 上画框;坐标错误 = 定位失效。 listed_text只放评审表原文,link_paragraphs只放评审表之外的引用,不得混放。- 定量项必填分值区间,横向评审维度必填 sort_point/sort_rule;定性项分值为 null 属正常。
- 一个 SQLite 库对应一个招标项目;换项目新建库,不要混存。
- 纯扫描件(无文本层)PDF 无法用 read_pdf.py 提取,先告知用户需 OCR,不在本技能范围内。
典型触发语
- "帮我解析这份招标文件 / 提取评审项 / 整理关键信息"(附一个或多个 PDF)
- "分析评审表,标出哪些是定量、主观、横向评审"
- "把解析结果入库并用网页展示给业务人员看"
微信扫一扫