AI 驱动的投标书智能生成系统
根据招标文件,自动分析需求、生成目录、填充公司信息、输出完整的投标文件 DOCX。
┌─────────────────────────────────────────────────────────────────┐
│ 输 入 层 │
├───────────────────────────┬─────────────────────────────────────┤
│ ① 新招标文件 PDF │ ② 历史数据(N组) │
│ (本次要投的项目) │ 每组包含: │
│ │ ├─ 历史招标文件.pdf │
│ │ └─ 对应投标文件.pdf │
│ │ (相似度越高,影响越大) │
└─────────────┬─────────────┴──────────────┬──────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 1 : 新招标解析 + 历史比对 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ 新招标处理 ───────────────────────────────────┐ │
│ │ ① PDF文本提取 → 章节/需求/概况 │ │
│ │ ② PDF表格提取 → 保留合并单元格、跨页合并 │ │
│ │ ③ 提取项目特征(类型、预算、地域、采购人) │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌─ 历史数据处理 ───────────────────────────────────┐ │
│ │ ④ 逐组提取 招标文本 + 投标文本 + 目录结构 │ │
│ │ ⑤ 计算每组 历史招标 ↔ 新招标 的相似度 │ │
│ │ (关键词匹配 + LLM 语义评分) │ │
│ │ ⑥ 按相似度排序,输出归一化权重 │ │
│ │ 高相似度 → 其投标结构参考价值更大 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ★ 中间产物: output/phase1_new_tender.json (新招标解析) │
│ output/phase1_tender_tables/ (新招标表格) │
│ output/phase1_historical_summary.json (N组+相似度) │
│ output/phase1_raw/ (各文件原文) │
│ │
└──────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 2 : 投标大纲构建(相似度加权) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 新招标需求 + 加权后的历史参考 ──→ ① 优先参考高相似度的投标结构 │
│ ──→ ② 生成投标文件目录大纲 │
│ ──→ ③ 标注每节内容的参考来源 │
│ ──→ ④ 识别待补充信息节点 │
│ │
│ ★ 中间产物: output/phase2_bid_outline.json │
│ │
└──────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 3 : 公司信息收集 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ info_gap_analysis.json ──→ ① 生成 company_info_template.json │
│ (84个字段的信息收集表) │
│ ──→ ② 投标公司填写/上传 │
│ ├── 文本信息 (公司名、地址、人员等) │
│ ├── 图片材料 (营业执照、证书、 │
│ │ 身份证、合同扫描件等) │
│ └── 盖章文件 (授权委托书、声明函等) │
│ │
│ ★ 中间产物: company_info_filled.json (已填写的公司信息) │
│ │
└──────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 4 : 内容填充 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ 商务部分 │ │ 技术方案部分 │ │ 报价部分 │ │
│ │ (资格证明、 │ │ (服务方案、 │ │ (报价明细、 │ │
│ │ 声明函等) │ │ 管理制度等) │ │ 价格构成等) │ │
│ └──────────┘ └──────────────┘ └───────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ① LLM 根据招标要求和公司信息填充正文内容 │
│ ② 表格还原 (招标表格原样出现,只填充数据) │
│ ③ 图片嵌入 (证书、身份证等扫描件插入对应位置) │
│ ④ 签章占位符 (&& 表示签字/盖章位置) │
│ │
│ ★ 中间产物: bid_fill_draft.json (填充后的各章节内容) │
│ │
└──────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 5 : 一致性校验 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ bid_fill_draft.json ──→ ① 表格完整性检查 │
│ + tender_tables/ (招标中的每个表格是否都在投标文件中?) │
│ ──→ ② 附件编号一致性检查 │
│ + bid_outline.json (正文引用的附件编号、名称 ↔ 文末清单) │
│ ──→ ③ 评分标准覆盖检查 │
│ (评标细则中的每项打分点是否有对应内容?) │
│ ──→ ④ 公司名称/项目名称一致性 │
│ │
│ ★ 中间产物: consistency_report.json (校验报告, 标注问题) │
│ │
└──────────────────────────┬───────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ Phase 6 : DOCX 生成 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ bid_fill_draft.json ──→ ① 按目录大纲顺序遍历所有章节 │
│ + tender_tables/ ──→ ② Markdown正文 → DOCX段落 │
│ + bid_outline.json ──→ ③ 表格 DOCX → 嵌入投标文件 │
│ ──→ ④ 图片路径 → doc.add_picture() │
│ ──→ ⑤ &&占位符 → 下划线 │
│ ──→ ⑥ 应用样式(字体、字号、行距、页边距) │
│ │
│ ★ 最终产出: bid_deliverable_final.docx (完整的投标文件) │
│ │
└─────────────────────────────────────────────────────────────────┘
proposa-ai/
├── data/ # 原始数据
│ ├── 招标文件.pdf
│ ├── 投标文件.pdf (历史参考)
│ └── 招标文件_表格输出/ # 已提取的招标表格
│ ├── tables.json # 表格元数据 (36个表格)
│ └── tables/ # 每个表格独立 DOCX
│
├── llm/ # LLM 工具模块
│ ├── llm_basic.py # 基础调用示例 (DeepSeek API)
│ └── llm_utils.py # 封装: analyze / extract / fill / chat
│
├── pdf_table_to_docx/ # PDF 表格提取模块 (已完成)
│ ├── extractor.py # 主协调器 + 跨页检测合并
│ ├── table_parser.py # 表格解析 + 合并单元格检测
│ ├── docx_writer.py # DOCX 文档生成
│ ├── text_scorer.py # NLP 文本评分 (GPT-2 ONNX)
│ └── cli.py # 命令行入口
│
├── phase1_parsing/ # Phase 1: 招标文件解析
│ ├── extract_pdf_text.py # PDF 文本提取
│ ├── extract_pdf_tables.py # PDF 表格提取 (封装 pdf_table_to_docx)
│ └── extract_bid_toc.py # 历史投标文件目录提取
│
├── phase2_outline/ # Phase 2: 投标大纲生成
│ └── generate_outline.py # LLM 生成目录大纲
│
├── phase3_collection/ # Phase 3: 公司信息收集
│ └── generate_template.py # 生成信息收集模板
│
├── phase4_filling/ # Phase 4: 内容填充 (待开发)
├── phase5_validation/ # Phase 5: 一致性校验 (待开发)
├── phase6_export/ # Phase 6: DOCX 导出 (待开发)
│
├── run_pipeline.py # Pipeline 入口 (python run_pipeline.py --phase 1-3)
│
├── output/ # 各阶段输出产物
│ ├── phase1_tender_text.txt # Phase1: 招标文件文本
│ ├── phase1_tables/ # Phase1: 提取的表格
│ ├── phase2_bid_outline.json # Phase2: 投标目录大纲
│ ├── phase3_company_template.json # Phase3: 公司信息模板
│ ├── company_info_template.json # 旧版详细模板
│ └── company_info_simple.json # 旧版简化模板
│
├── docs/ # 文档
│ └── team_and_architecture.md # 团队分工 + 技术方案
│
├── models/ # ML 模型文件
│ └── gpt2-chinese-cluecorpussmall-onnx/
│
└── README.md # 本文档
每个 Phase 都有独立的中间产物,便于定位问题和针对性优化:
| 路径 | 阶段 | 用途 |
|---|---|---|
output/phase1_new_tender.json |
Phase 1 | 新招标解析(章节、概况、表格索引) |
output/phase1_tender_tables/tables.json |
Phase 1 | 新招标表格元数据 |
output/phase1_historical_summary.json |
Phase 1 | 历史数据汇总,每组含相似度评分、权重、投标目录结构 |
output/phase1_raw/ |
Phase 1 | 招标和各历史文件的原始文本 |
output/phase2_bid_outline.json |
Phase 2 | 投标目录大纲(含来源标注) |
output/phase3_company_template.json |
Phase 3 | 公司信息收集模板 |
output/phase4_bid_fill_draft.json |
Phase 4 | (待开发)填充后的各章节内容 |
output/phase5_consistency_report.json |
Phase 5 | (待开发)一致性校验结果 |
output/phase6_bid_final.docx |
Phase 6 | (待开发)最终投标文件 |
pip install pymupdf pdfplumber python-docx openai onnxruntime tokenizers文本困惑度模型(可选,用于 NLP 表格优化):
models/gpt2-chinese-cluecorpussmall-onnx/