AI赋能招投标:标书生成,告别复制粘贴地狱!
推荐语
AI助力标书制作,告别繁琐格式调整,让投标人重获自由!
核心内容:
1. 标书制作的痛点:格式调整与图片插入的繁琐流程
2. AI解决方案:智能解析招标文件,自动提取并精准插入附件
3. 实践案例:知识库管理与企业资质图片的自动化处理
杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家
"投标人员的时间守恒定律:格式调整耗时 = 插入图片数 × 标书页数/10" ⏰
在企业的日常经营中,经过投标判断助手确定标底后,就来到了让无数投标人闻风丧胆的标书撰写阶段。以算力领域为例,一份标书通常包含:
-
📑 10+个章节
-
📝 5万字+文本
-
🖼️ 100+张资质图片
-
😫 1位濒临崩溃的投标人员
📖 前言:当算力遇上格式强迫症
- 格式的执念:虽然算力招标对技术参数允许合理波动,但对标书格式却有着"像素级"要求。不同招标单位的格式模板差异,足以让最淡定的投标人抓狂。
- 图片的迷宫:如何在保证技术准确性的同时,把企业资质图片精准插入到标书指定位置?这不仅是技术问题,更是艺术!
📥 输入输出样例
graph LR A[招标文件] --> B[智能解析] B --> C[自动提取附件] C --> D[精准插入图片] D --> E[完美格式标书]
🎬 产品演示:眼见为实
温馨提示:观看时请勿羡慕到流泪 😭
🤖 Agent搭建全解析
🎯 知识库:AI的"记忆宫殿"
数据是LLM的血液,没有数据的Agent就像没有汽油的超跑 —— 只能看不能开
我们采用"分治策略"管理企业资质:
-
将营业执照、纳税证明等图片存入docx
-
按材料类型分段存储,确保检索时能返回完整图片集
-
在dify平台通过URL分发图片资源
知识库:这里存放着价值百万的"数字房产证"🏠
💡 工作流:标书生成的"流水线"
温馨提示:本流程已通过ISO-9001"防加班"认证 🕒
🛠️ 前处理三剑客
- DOCX标题提取器 - 专业的"目录生成师"
import requests
- 招标文件分析 - LLM的"格式侦探"
你是一个招标文件分析助手,在招投标领域,乙方投标文件,必须按照甲方招标文件中规定的格式进行撰写#输入是招标文件的章节标题,请判断对于投标文件的格式要求,所在的章节,然后返回开始章节标题,和结束章节标题#符合条件的章节,一般包含有"附件"字样,即该章,附带了许多格式化的表格,投标人照此写标书#如果没有结束章节标题,则置为空参考输出格式:{"开始标题":”XXX“,”结束标题“:"XXX"}{{#投标文件的章节名称.result#}}/no_think
经过LLM后,去掉输出结果的think标签
import re,jsonfrom typing import Listimport jsondef main(arg1): tmp = re.sub(r"<think>[\s\S]*?</think>", "", arg1, flags=re.DOTALL) tmp = re.sub(r'^\s*```(?:json)?\s*\n?', '', tmp,flags=re.IGNORECASE) tmp = re.sub(r'\n?```\s*$', '', tmp) tmp = tmp.replace(r'\n', '\n').replace(r'\"', '"').strip() result=tmp return { 'result':result }
- DOCX章节提取器 - 精准的"文档外科医生",代码逻辑如下:
# ===== 数据结构定义 =====定义 ElementInfo: 元素类型: 'paragraph' 或 'table' XML内容: 字符串 文本内容: 字符串 (用于预览) 索引: 整数 分区格式: 字典 (可选)定义 SectionInfo: 标题: 字符串 元素列表: [ElementInfo]定义 PageFormatInfo: 页面宽度, 高度, 方向, 四周边距: 整数/字符串定义 DocumentExtractResult: 章节列表: [SectionInfo] 页面格式: PageFormatInfo 源文件路径: 字符串 元素总数: 整数 抽取信息: 字典 分区格式列表: [字典] (可选) 样式XML: 字符串 (可选) 编号XML: 字符串 (可选)# ===== 文档解析器类 =====类 DocxExtractor: 初始化(文档路径): 加载DOCX文档 获取页面格式(章节索引=0): 尝试从文档获取页面设置 失败则返回默认A4格式 查找单章节(开始标题, 标题级别=1, 结束标题=None): 预处理标题(移除空格) 收集所有文档元素(段落+表格) 遍历元素: - 发现匹配的开始标题 → 创建新章节 - 继续收集元素直到: a) 遇到结束标题 b) 遇到同级标题(无结束标题时) 返回找到的章节列表 抽取单章节(开始标题, 标题级别=1, 结束标题=None): 调用查找单章节 收集分区格式信息 确定最终页面格式: 优先使用提取的分区格式 否则调用获取页面格式 构建DocumentExtractResult对象 返回结果# ===== 插件工具类 =====类 DocxExtractorTool (继承Tool): 执行入口(参数): 验证必要参数(文档文件, 开始标题) 下载DOCX文件 → 保存为临时文件 创建DocxExtractor实例 调用抽取单章节方法 处理结果: 添加成功元数据 转换为JSON格式 生成输出文件 异常处理: 值错误/通用错误 → 生成错误JSON文件 返回处理结果(文件blob或错误信息)
🔄 迭代环节:图片与文字的"相亲大会"
遍历所有xml数据,查找对应的图片
// XML数据结构:标书的DNA{ "element_type": "paragraph", "xml_content": "<w:p>7-2纳税证明</w:p>", "text_content": "7-2纳税证明", "index": 642}
智能匹配流程:a.文字:"7-2纳税证明"发出相亲请求b.知识库:匹配到纳税证明图片集c.LLM媒人:生成"结婚证"(XML数据)d.输出:文字+图片的完美组合
大模型将图片转换为xml的prompt:
你是一个json数据处理专家,请将数据A,按照参考格式,进行构造,然后返回一个新的json数据#如果待处理数据只有文字,则生成element_type为paragraph。如果待处理数据还有图像,则生成element_type为picture。#index字段,与B保持一致,举例B为100,则输出的所有index都是100数据A:{{检索到的图片url.result#}}数据B:{{#当前数据索引#}}如果只有文字,输出格式参考 { "element_type": "paragraph", "xml_content": "xxxx", "text_content": "xxx", "index": xxx, "section_format": null }如果是图像,输出格式参考{ "element_type": "picture", "image_path": "XXX, "index": XXX}
🎉 后处理:标书诞生的"高光时刻"
函数 assemble_document(输入: 抽取结果, 输出路径, 是否清理分区属性):
使用xml标签,确保了生成标书的格式的正确性,而且自动插入图片,节省了投标人员一部分时间。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek002/post/202510/AI%E8%B5%8B%E8%83%BD%E6%8B%9B%E6%8A%95%E6%A0%87-%E6%A0%87%E4%B9%A6%E7%94%9F%E6%88%90-%E5%91%8A%E5%88%AB%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4%E5%9C%B0%E7%8B%B1/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com