""" Phase 3: 公司信息收集模板生成 基于招标文件 + 历史投标文件,生成投标公司需要补充的信息清单。 输出为简化版 JSON:仅有"名称"、"内容/文件地址"、"来源参考"三项。 用法: python -m phase3_collection.generate_template 或: from phase3_collection.generate_template import generate_template template = generate_template(tender_text, bid_toc) """ import sys import os import json sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from llm.llm_utils import LLM # ── 预定义信息项(基于招标文件已知要求的兜底清单) ── FALLBACK_ITEMS = [ {"名称": "公司全称", "内容/文件地址": "", "来源参考": "投标函格式、历史投标文件封面"}, {"名称": "统一社会信用代码", "内容/文件地址": "", "来源参考": "营业执照"}, {"名称": "注册地址", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "联系电话", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "传真", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "邮政编码", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "开户银行", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "银行账号", "内容/文件地址": "", "来源参考": "投标函格式"}, {"名称": "营业执照扫描件", "内容/文件地址": "", "来源参考": "历史投标文件第十一项(第41页)"}, {"名称": "法定代表人姓名", "内容/文件地址": "", "来源参考": "法定代表人授权书格式"}, {"名称": "法定代表人职务", "内容/文件地址": "", "来源参考": "法定代表人授权书格式"}, {"名称": "法定代表人身份证(正面)", "内容/文件地址": "", "来源参考": "历史投标文件第五章第(一)项(第19页)"}, {"名称": "法定代表人身份证(反面)", "内容/文件地址": "", "来源参考": "历史投标文件第五章第(一)项"}, {"名称": "授权委托人姓名", "内容/文件地址": "", "来源参考": "法定代表人授权书格式"}, {"名称": "授权委托人职务", "内容/文件地址": "", "来源参考": "法定代表人授权书格式"}, {"名称": "授权委托人电话", "内容/文件地址": "", "来源参考": "法定代表人授权书格式"}, {"名称": "授权委托人身份证(正面)", "内容/文件地址": "", "来源参考": "历史投标文件第五章第(二)项"}, {"名称": "授权委托人身份证(反面)", "内容/文件地址": "", "来源参考": "历史投标文件第五章第(二)项"}, {"名称": "授权委托书(签字+公章扫描件)", "内容/文件地址": "", "来源参考": "格式参照招标文件第六章"}, {"名称": "ISO 9001 质量管理体系认证证书", "内容/文件地址": "", "来源参考": "历史投标文件第十九项"}, {"名称": "ISO 14001 环境管理体系认证证书", "内容/文件地址": "", "来源参考": "历史投标文件第十九项"}, {"名称": "ISO 45001 职业健康安全管理体系认证证书", "内容/文件地址": "", "来源参考": "历史投标文件第十九项"}, {"名称": "其他资质证书(保安备案/保洁能力/供应商证明)", "内容/文件地址": "", "来源参考": "历史投标文件第十二至十五项(第42-43页)"}, {"名称": "上年度(2024年)审计报告或财务报表", "内容/文件地址": "", "来源参考": "历史投标文件第七项(第21-28页)"}, {"名称": "近期依法缴纳税收的证明(完税凭证)", "内容/文件地址": "", "来源参考": "历史投标文件第八项第一(第29页)"}, {"名称": "近期依法缴纳社保费的证明", "内容/文件地址": "", "来源参考": "历史投标文件第八项第二(第30页)"}, {"名称": "信用中国无失信截图", "内容/文件地址": "", "来源参考": "历史投标文件第十项(第32页)"}, {"名称": "政府采购网无严重违法失信截图", "内容/文件地址": "", "来源参考": "历史投标文件第九项(第31页)"}, {"名称": "从业人员数量", "内容/文件地址": "", "来源参考": "中小企业声明函格式"}, {"名称": "上年度营业收入(万元)", "内容/文件地址": "", "来源参考": "中小企业声明函格式"}, {"名称": "上年度资产总额(万元)", "内容/文件地址": "", "来源参考": "中小企业声明函格式"}, {"名称": "企业规模类型(中型/小型/微型)", "内容/文件地址": "", "来源参考": "中小企业声明函格式"}, {"名称": "拟派项目经理姓名", "内容/文件地址": "", "来源参考": "项目经理情况表格式(招标文件第39页)"}, {"名称": "项目经理出生年月", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理文化程度", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理毕业院校及专业", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理从事物业服务工作年限", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理职业资格", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理技术职称", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理主要工作经历和业绩", "内容/文件地址": "", "来源参考": "项目经理情况表格式"}, {"名称": "项目经理近半年社保缴纳证明", "内容/文件地址": "", "来源参考": "招标文件评分标准—项目经理(3分)"}, {"名称": "项目管理团队主要人员信息", "内容/文件地址": "", "来源参考": "招标文件第40页—管理人员汇总表"}, {"名称": "各专业技术人员执业/职业资格证书", "内容/文件地址": "", "来源参考": "历史投标文件—各主管持证情况"}, {"名称": "近三年办公楼物业业绩合同扫描件", "内容/文件地址": "", "来源参考": "招标文件评分标准—业绩(5分)"}, {"名称": "类似业绩业主评价(满意度证明)", "内容/文件地址": "", "来源参考": "历史投标文件第十八项(第245页)"}, {"名称": "企业获奖证明", "内容/文件地址": "", "来源参考": "历史投标文件第二十项(第261页)"}, {"名称": "雇主责任险和公众责任险购买承诺", "内容/文件地址": "", "来源参考": "招标文件评分标准—责任保险(4分)"}, {"名称": "拟投入本项目的设备一览表", "内容/文件地址": "", "来源参考": "招标文件第42页—设备一览表格式"}, {"名称": "公司简介", "内容/文件地址": "", "来源参考": "历史投标文件公司概况介绍"}, {"名称": "公司现有管理制度目录", "内容/文件地址": "", "来源参考": "招标文件第37页—管理制度一览表格式"}, ] def generate_template( tender_text: str = None, bid_toc: list = None, output_path: str = None, use_llm: bool = False, ) -> dict: """ 生成投标公司信息收集模板。 Args: tender_text: 招标文件全文(可选,LLM 模式下使用) bid_toc: 历史投标文件目录(可选,LLM 模式下使用) output_path: 保存路径 use_llm: 是否使用 LLM 动态生成(默认 False,使用预定义清单) Returns: 模板 JSON 字典 """ if use_llm and tender_text and bid_toc: items = _llm_generate(tender_text, bid_toc) else: items = FALLBACK_ITEMS template = { "投标公司信息收集表": { "说明": "投标公司根据此表提供信息,填充'内容/文件地址'列即可。", "数据来源": { "招标文件": "data/松江区机关事务管理局物业管理服务招标文件.pdf", "历史投标文件参考": "data/松江区机关事务管理局物业管理服务项目投标文件.pdf", }, "信息项": items, } } if output_path: os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True) with open(output_path, "w", encoding="utf-8") as f: json.dump(template, f, ensure_ascii=False, indent=2) print(f"[Phase3] 模板已保存: {output_path} ({len(items)} 项)") return template def _llm_generate(tender_text: str, bid_toc: list) -> list: """使用 LLM 动态生成信息项(备用路径)""" llm = LLM() # 构建历史投标目录文本 toc_lines = [] for item in bid_toc[:60]: indent = " " * (item.get("level", 1) - 1) toc_lines.append(f"{indent}{item['title']} (p.{item.get('page','')})") bid_toc_text = "\n".join(toc_lines) system = ( "你是一个投标文件分析助手。根据招标文件要求和历史投标文件内容," "列出投标公司需要提供的所有信息和材料清单。\n\n" "输出 JSON 数组,每个元素包含:\n" '- "名称": 信息项名称\n' '- "内容/文件地址": 留空字符串\n' '- "来源参考": 招标文件第几章或历史投标文件第几页\n\n' "覆盖以下类别:\n" "- 公司基本信息(名称、地址、联系人等)\n" "- 法定代表人/授权委托人信息(姓名、身份证照片等)\n" "- 资质证书(营业执照、体系认证、专业资质等)\n" "- 财务状况(审计报告、纳税和社保凭证等)\n" "- 企业声明函(中小企业声明、无失信声明等)\n" "- 团队人员(项目经理、主要管理人员信息)\n" "- 历史业绩(合同扫描件、业主评价等)\n" "- 报价信息(报价明细)\n" "- 设备资源(设备一览表)\n\n" "只输出 JSON 数组,不要额外文字。" ) user = ( "请列出投标公司需要提供的全部信息材料。\n\n" f"===== 招标文件关键章节 =====\n" f"{tender_text[:15000]}\n\n" f"===== 历史投标目录 =====\n" f"{bid_toc_text[:10000]}" ) result = llm._call(system, user, max_tokens=8192, temperature=0.2, response_format={"type": "json_object"}) parsed = json.loads(result) # 兼容数组或 {items: [...]} 两种返回格式 if isinstance(parsed, list): return parsed for key in parsed: if isinstance(parsed[key], list): return parsed[key] return FALLBACK_ITEMS # ── CLI ── if __name__ == "__main__": import sys sys.stdout.reconfigure(encoding="utf-8") generate_template(output_path="output/phase3_company_template.json") with open("output/phase3_company_template.json", "r", encoding="utf-8") as f: data = json.load(f) items = data["投标公司信息收集表"]["信息项"] print(f"\n共 {len(items)} 项信息待补充:") for item in items: print(f" □ {item['名称']}")