# Proposa AI AI 驱动的投标书智能生成系统 根据招标文件,自动分析需求、生成目录、填充公司信息、输出完整的投标文件 DOCX。 --- ## 处理流程(Pipeline) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 输 入 层 │ ├───────────────────────────┬─────────────────────────────────────┤ │ ① 新招标文件 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 | (待开发)最终投标文件 | --- ## 环境要求 - Python 3.10+ - 依赖: `pip install pymupdf pdfplumber python-docx openai onnxruntime tokenizers` ## 模型下载 文本困惑度模型(可选,用于 NLP 表格优化): - [GPT-2 Chinese CLUE Corpus Small (ONNX)](https://modelscope.cn/models/Maiteka/gpt2-chinese-cluecorpussmall-onnx/summary) - 下载后放入 `models/gpt2-chinese-cluecorpussmall-onnx/`