| name | bid-doc |
| description | 投标服务方案文档生成器。根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。当用户说"生成投标方案"、"做标书"、"做服务方案"、"按技术规范出文档"时使用此skill。 |
投标服务方案文档生成器
根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。
输入要求
用户需提供:
- 技术规范文件(.doc 或 .docx)— 采购技术规范
- 评分标准(图片或文字)— 评分项和分值(可选,默认按服务方案+工作进度评分)
- 参考方案(.docx)— 可选,作为格式和内容参考
- 真实师资/课表(.docx 或图片)— 可选,甲方或合作方提供的真实讲师和课程安排
工作流程
Step 1: 解析技术规范
如果是 .doc 文件,先用 win32com 转换为 .docx:
import win32com.client, pythoncom
pythoncom.CoInitialize()
word = win32com.client.Dispatch("Word.Application")
word.Visible = False
doc = word.Documents.Open(r"原始文件路径.doc")
doc.SaveAs2(r"转换后路径.docx", 16)
doc.Close()
del doc, word
pythoncom.CoUninitialize()
然后用 python-docx 读取所有段落和表格,提取:
- 项目名称、甲方单位全称
- 培训对象、人数、期数/批次数、天数
- 培训内容覆盖(从表格的"培训内容覆盖"行提取,这是最权威的内容列表)
- 培训方式、考核方式
- 师资要求(职称等级)
- 满意率要求
- 交付物要求
- 保密要求
- 后续服务要求
关键:项目概况中的"培训目标"和表格中的"培训内容覆盖"可能不完全一致,以表格中的"培训内容覆盖"为准设计课程。
数据一致性清单(生成后必须交叉验证):
- 人数 × 批次数 = 总人数(如"400人分4批,每批约100人"必须写明)
- 天数口径统一:如有"准备日/报到日",必须在首次提到天数时加括号说明(如"5天(另含1天报到编班)")
- 课表中的讲师名 = 师资简介中的讲师名(一个都不能多、不能少)
- 讲师头衔/单位在全文所有出现处必须一致(课表简写可以,但不能写错)
Step 2: 解析评分标准
如果提供了评分标准图片,用 Read 工具查看图片内容,提取:
- 服务方案评分维度(先进性、创新性、可操作性、技术性、经济性、风险等)
- 工作进度及保证措施评分维度
- 各档次分值区间
评分标准 → 文档章节映射(必须一一对应):
| 评分项 | 分值 | 对应章节 | 得分策略 |
|---|
| 文件总体评价 | 6-10 | 全文结构 | 规范性、完整性、逻辑性 |
| 项目团队 | 12-20 | 2.5 人员配置 | 需公司提供真实资质 |
| 业绩情况 | 12-20 | 商务标 | 方案中不写,商务标单独提供 |
| 服务方案 | 18-30 | 二、服务方案 | 核心得分项,必须深度 + 量化 |
| 工作进度 | 8-13 | 三、工作进度 | 甘特图 + 四维保障 |
| 专利数量 | 0-2 | 商务标 | 如有专利单独提供 |
| 绩效评价 | 1-5 | — | 取决于历史供应商评价 |
Step 3: 生成 Word 文档
使用 docx-js(Node.js)生成 .docx 文件。运行时需要 NODE_PATH="$(npm root -g)"。
文档结构(严格按评分标准覆盖):
封面(项目名称 + 应答人 + 日期)
目录
一、对项目的理解
1.1 对[甲方单位]的理解
1.2 对采购项目的理解
- 项目定位与目标
- 项目规模与实施要求
- 服务敏感点分析
1.3 项目重点与难点分析
二、服务方案(对应评分项"服务方案")
2.1 项目实施思路(五阶段闭环)
2.2 培训课程体系设计
- 课程模块总览(严格按技术规范"培训内容覆盖")
- N天课程安排表
- 课程设计亮点
2.3 培训方式与教学方法(6种教学法)
2.4 师资配备方案
2.5 实施组织形式与人员配置
- 项目组织机构
- 人员配置表(含人员清单和简介说明)
2.6 培训效果评估体系(用技术规范中的考核方式术语)
2.7 质量保障措施(三维品控)
2.8 设备设施配置方案
2.9 风险管理与应对(6类风险+应对表)
★ 项目管理措施(深化服务过程细节,见下方专项说明)
★ 质量控制节点(训前+训中+训后闭环)
三、工作进度及保证措施(对应评分项"工作进度及保证措施")
3.1 项目进度计划(8阶段进度表 + 每期日程)
3.2 进度保证措施(四维保障)
四、项目交付成果(技术规范要求的所有交付物)
五、售后服务承诺(含明确期限、范围、内容)
★ 项目管理措施(关键得分章节)
这是拉开"良"与"优"差距的核心章节。甲方要看到的是操作细节和量化指标,不是空话。
必须包含的维度(4-5个子节,每个都要有量化):
1) 团队构建与职责分工
- 人员选拔标准量化(如"项目经理需5年以上培训管理经验")
- 岗前培训内容清单
- 考核机制(五维度考核 + 绩效挂钩)
2) 师资管理机制
- 三道准入关:资质审核 → 试讲评审 → 课件审核
- 动态监控:量化阈值(如"满意度低于90%立即约谈,低于85%启动替换")
- 课后教研:具体时间(如"每日课后15分钟教研简会")
3) 辅助人员管理(班主任/教务)
- 班主任日程:早间/午间/晚间分段职责
- 教务管理体系(如"五单管理":签到单、评估单、反馈单、日志单、交付单)
- 学员沟通机制(微信群、意见箱、24小时响应)
4) 后勤保障与风险管理
- 场地提前踏勘时间(如"提前3天")
- 设备故障响应时间(如"15分钟响应、30分钟解决")
- 应急响应时间(如"5分钟内启动")
5) 特色管理(按项目类型)
- 党建培训 → "红色现场教学全流程管理"(踩点→路线→安全→教学衔接)
- 党建培训 → "班主任全流程服务(党建特色)"(晨学诵读党章、心得辅导等)
- 技能培训 → 实操环节器材管理、分组演练轮转机制
★ 质量控制节点
训前(6-7个节点):
需求确认 → 方案评审 → 师资试讲 → 课件终审 → 场地踏勘 → 物料清点 → (红色教学点踩点)
训中(日循环):
晨会布置 → 课堂督导 → 午间反馈 → 课后教研 → 日报汇总
训后(闭环):
满意度统计 → 效果评估报告 → 改进建议 → 资料归档 → 跟踪回访
编码要点:
- 字体:SimHei 标题 + SimSun 正文
- 页面:A4(11906 x 16838 DXA)
- 页眉:项目名称
- 页脚:页码
- 表格:headerCell 用 D5E8F0 底色,边框 #999999
- 必须包含的表格:课程安排表、人员配置表、评估体系表、风险管理表、进度计划表
- 文中术语必须与技术规范保持一致(如"一级评估"而非"反应层评估")
Step 4: 生成信息图 HTML
创建一个包含所有信息图的 HTML 文件,风格要求:
- 配色:Navy(#0F172A) + Teal(#0e6b60/#1a8a7d) + Gold(#b8963e)
- 党建类项目可用:Red(#c41e3a) + Navy(#1e3a5f) + Gold(#b8963e)
- 图标:Font Awesome 6(不用emoji)
- 字体:Noto Sans SC
- 交互:cursor-pointer + hover 动效(200ms)
- 圆角:统一 12px/8px
需要的信息图(共14张):
- 项目定位目标(箭头网格 arrow-grid)
- 服务敏感点(六宫格 sens-grid)
- 重点vs难点(VS对比图)
- 五阶段闭环(流程图 flow-stages)
- 课程模块(彩色卡片 modules-grid)
- N天课程表(时间轴 timeline)— 必须包含讲师姓名
- 教学方法(圆环图标 methods-grid)
- 组织机构(层级图 org-chart)
- 评估体系(指标卡片 assess-row)
- 质量保障(三柱图 quality-row)
- 风险管理(卡片网格 risk-grid)
- 甘特图进度(gantt)
- 保障措施(渐变卡片 guarantee-grid)
- 交付成果(清单 deliver-grid)
每个信息图用唯一的 CSS class 命名,页面用 .page 容器包裹。
Step 5: 截取信息图
使用 Playwright 截图:
const { chromium } = require('playwright');
截图存放在 screenshots/ 目录。
Step 6: 插入图片到 Word
使用 python-docx 将截图插入对应段落后面:
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document('方案.docx')
图片插入位置映射(根据段落内容关键词定位):
- 01_project_goals -> "三大培训目标" bullets 之后
- 02_sensitivity -> 敏感点 bullets 之后
- 03_vs_diagram -> 项目难点末段之后
- 04_five_stages -> 实施思路首段之后
- 05_modules -> 课程模块 bullets 之后
- 06_timeline -> 课程表说明之后
- 07_methods -> 教学方法首段之后
- 08_org_chart -> 组织机构描述之后
- 09_assessment -> 评估体系表之后
- 10_quality -> 质量保障首段之后
- 11_risk -> 风险管理首段之后
- 12_gantt -> 进度计划表之后
- 13_guarantees -> 进度保证措施标题之后
- 14_deliverables -> 交付成果首段之后
更新已有图片的技巧(不需要重新插入):
for rel_id, rel in doc.part.rels.items():
if "image" in rel.reltype:
image_part = rel.target_part
with open(new_image_path, 'rb') as f:
image_part._blob = f.read()
Step 7: 质量审查(MANDATORY — 不可跳过)
生成完成后,必须执行以下审查,这是从"良"冲"优"的关键。
7.1 AI 去痕检查
以下表述禁止出现在最终文档中:
| 禁用表述 | 替换方案 |
|---|
| "我公司深刻理解" | 直接删除,陈述事实 |
| "贡献力量" | "圆满完成" |
| "以高度负责的态度和专业化的服务水准" | "以专业的服务水准" |
| "量身定制" | "针对XX实际设计" |
| "先进性、创新性和可操作性"三连 | "切实可行、有针对性" |
| "一对一访谈"(对大规模培训不现实) | "代表性座谈"、"分组访谈" |
| "确保...的XX性"万能句 | 具体说做什么 |
| "N大核心模块"(数字可能与实际不符) | "核心培训模块" |
检测脚本:
ai_phrases = [
'我公司深刻理解', '贡献力量', '量身定制',
'高度负责的态度', '先进性、创新性和可操作性',
'一对一访谈',
]
text = '\n'.join([p.text for p in doc.paragraphs])
for phrase in ai_phrases:
if phrase in text:
print(f'⚠️ AI套话残留: {phrase}')
7.2 数据一致性检查
checks = {
'人数×批次': '检查总人数 = 每批人数 × 批次数',
'天数口径': '正式天数 vs 含报到日,首次提到必须加括号说明',
'师资姓名': '课表中每位讲师必须在师资简介中有对应条目',
'师资头衔': '同一讲师在全文所有出处的单位名/职称必须一致',
'课程覆盖': '技术规范要求的每项培训内容都必须出现在课表或正文中',
'满意率数字': '全文中出现的满意率目标必须一致(如95%)',
'交付物': '技术规范列出的每项交付物都必须在第四章出现',
}
7.3 师资交叉验证(血泪教训)
| 检查项 | 说明 | 典型错误 |
|---|
| 单位名称 | 必须精确到区/县级 | "成都市委党校" vs "成都市温江区委党校" |
| 专家标签 | 必须与本项目课程匹配 | 讲党建课的讲师标签写成"宏观经济专家" |
| 职称资质 | 必须满足技术规范要求 | 技术规范要求"中级及以上",讲师无明确职称 |
| 简写一致 | 课表简写不能写错 | "高培中心" vs "高级培训中心" |
7.4 技术规范全覆盖检查
技术规范"项目概况"和"培训内容覆盖"中提到的每一项内容,都必须在方案中有对应安排:
- 如果课表没有单独安排,必须说明融入哪个模块
- 如果是选修/补充内容,必须在正文中明确标注
for kw in spec_keywords:
if kw not in full_text:
print(f'❌ 技术规范要求但方案未覆盖: {kw}')
Step 8: 真实数据替换(如有)
如果甲方/合作方后续提供了真实师资和课表,执行替换:
- 课表替换:用 python-docx 定位课程安排表(通常是第一个表格),逐行替换
- 师资替换:定位师资简介段落(通常在"2.4 师资配备"下方),删除旧内容插入新内容
- 信息图同步:更新 HTML 中 timeline 区域的讲师姓名,重新截图
- 全文扫描:简化版日程描述、课程模块说明等处也要同步更新
替换后必须重新执行 Step 7 全部检查。
Step 9: 文档扩充(当字数不足时)
当客户反馈"内容太少"或字数未达目标(如2万字),使用以下方法论进行迭代扩充。
9.1 扩充原则
- 分轮迭代:每轮控制5-10处修改,避免一次性改太多导致关键词匹配错位
- 先分析后动手:每轮先统计当前字数,计算差额,选择扩充点
- 优先展开有深度空间的段落:项目理解、服务敏感点、重点难点、风险管理、售后服务
- 保持格式一致:新插入段落必须继承前一段落的字体、字号、缩进等格式
9.2 核心工具函数
import copy
from lxml import etree
from docx import Document
def expand_para(para, new_text):
"""替换段落文本,保留原有格式(字体、加粗等)"""
if not para.runs:
return
para.runs[0].text = new_text
for run in para.runs[1:]:
run.text = ''
def insert_para_after(ref_para, text):
"""在指定段落后插入新段落,继承格式"""
new_para = copy.deepcopy(ref_para._element)
ns = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
for r in new_para.findall(f'.//{ns}r'):
new_para.remove(r)
new_r = etree.SubElement(new_para, f'{ns}r')
if ref_para.runs:
rpr = ref_para.runs[0]._element.find(f'{ns}rPr')
if rpr is not None:
new_r.insert(0, copy.deepcopy(rpr))
new_t = etree.SubElement(new_r, f'{ns}t')
new_t.text = text
new_t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
ref_para._element.addnext(new_para)
9.3 扩充优先级(从高到低)
| 优先级 | 章节 | 扩充方式 | 典型增量 |
|---|
| 1 | 服务敏感点分析 | 每条加具体应对措施 | 每条+80-120字 |
| 2 | 项目重点难点 | 每条加解决方案和量化指标 | 每条+60-100字 |
| 3 | 实施思路/五阶段 | 每阶段加操作细节 | 每阶段+100-150字 |
| 4 | 质量保障措施 | 每条从一句话展开为一段 | 每条+80-120字 |
| 5 | 进度保证措施 | 加时间节点和责任人 | 每条+50-80字 |
| 6 | 售后服务 | 加响应时间、服务期限等量化承诺 | 每条+60-100字 |
| 7 | 风险管理 | 总述展开,每类风险加应急预案 | 总述+150字 |
| 8 | 培训效果评估 | 加过程性评价、结果运用 | 每项+100-150字 |
| 9 | 师资配备 | 总述加选拔标准和备选机制 | +100-150字 |
| 10 | 项目交付成果 | 加资料规范和移交流程 | +80-120字 |
9.4 扩充内容写作要求
- 量化优先:用数字而非形容词("3个工作日内"而非"及时")
- 具体可执行:每个承诺都要能落地执行
- 贴合行业:培训类用"学员""课时""满意度",党建类加"政治把关""红色现场教学"
- 不重复:不同段落扩充的内容不能互相重复
- 不空洞:避免"进一步加强""不断完善"等无实质内容的套话
9.5 迭代字数监控
doc2 = Document(doc_path)
total = sum(len(p.text) for p in doc2.paragraphs)
for t in doc2.tables:
for row in t.rows:
for cell in row.cells:
total += len(cell.text)
print(f'当前字数: {total},距目标还差: {20000 - total} 字')
9.6 关键词匹配注意事项(血泪教训)
- 跨run问题:python-docx的一个段落可能被拆成多个run,关键词可能跨run边界,
p.text能搜到但run.text中搜不到
- 前轮修改影响后轮:前一轮脚本替换了文本后,后续脚本的关键词搜索可能失效,每轮都要用最新文档验证关键词
- 长度限制过滤:搜索时加
len(p.text) < 200避免匹配已展开的段落
- 段落索引偏移:
insert_para_after会增加段落数量,后续段落索引全部后移,如需多处插入应从后往前或分轮处理
Step 10: AI去痕(MANDATORY — 每次生成/扩充后必须执行)
10.1 完整AI禁用表述替换表
| 禁用表述 | 替换方案 | 说明 |
|---|
| 深刻理解 | 充分了解 | 最典型AI套话 |
| 贡献力量 | 圆满完成 | |
| 量身定制 | 专门制定 / 针对XX实际设计 | |
| 赋能 | 支撑 / 助推 | |
| 助力 | 支持 / 帮助 | |
| 打造 | 建设 / 建立 | |
| 筑牢 | 夯实 | 党建文档高频 |
| 构筑 | 构建 | |
| 紧密结合 | 结合 | 出现频率最高,通常4+处 |
| 深度融合 | 融合 | |
| 有机融合 | 融合 / 统筹 | |
| 全方位 | 全面 | |
| 多维度 | 多角度 | |
| 立体化 | 综合 | |
| 系统化培训 | 系统培训 | |
| 深入浅出 | 通俗易懂 | 讲师简介高频 |
| 精心设计 | 合理设计 | |
| 精心打造 | 合理建设 | |
| 精心组织 | 周密组织 | |
| 全面提升 | 提高 | |
| 持续提升 | 逐步提高 | |
| 不断提升 | 逐步提高 | |
| 充分发挥 | 发挥 | |
| 充分体现 | 体现 | |
| 充分调动 | 调动 | |
| 切实增强 | 增强 | |
| 切实提高 | 提高 | |
| 切实做到 | 做到 | |
| 积极探索 | 探索 | |
| 大胆创新 | 创新 | |
| 勇于担当 | 担当 | |
| 凝聚共识 | 统一认识 | |
| 汇聚力量 | 集中力量 | |
| 形成合力 | 协同配合 | |
| 高质量发展 | 稳健发展 | |
| 新质生产力 | 新型生产力 | |
| 确保培训取得实效 | 确保培训达到预期效果 | |
| 确保圆满完成 | 确保按期完成 | |
| 先进性、创新性和可操作性 | 切实可行、有针对性 | 三连套话 |
| 一对一访谈 | 代表性座谈 / 分组访谈 | 大规模培训不现实 |
10.2 自动化去痕脚本模板
"""AI去痕修复脚本模板"""
import sys
sys.stdout.reconfigure(encoding='utf-8')
from docx import Document
doc_path = r'文档路径.docx'
doc = Document(doc_path)
changes = []
replacements = {
'赋能': '支撑',
'紧密结合': '结合',
'全方位': '全面',
'多维度': '多角度',
'持续提升': '逐步提高',
'全面提升': '提高',
'量身定制': '专门制定',
'系统化培训': '系统培训',
'精心设计': '合理设计',
'深入浅出': '通俗易懂',
'深刻理解': '充分了解',
'充分调动': '调动',
'高质量发展': '稳健发展',
'筑牢': '夯实',
'深度融合': '融合',
'凝聚共识': '统一认识',
}
for i, p in enumerate(doc.paragraphs):
for old, new in replacements.items():
if old in p.text:
for run in p.runs:
if old in run.text:
run.text = run.text.replace(old, new)
changes.append(f'[段落{i}] {old} → {new}')
for ti, t in enumerate(doc.tables):
for ri, row in enumerate(t.rows):
for ci, cell in enumerate(row.cells):
for old, new in replacements.items():
if old in cell.text:
for p in cell.paragraphs:
for run in p.runs:
if old in run.text:
run.text = run.text.replace(old, new)
changes.append(f'[表{ti}-行{ri}-列{ci}] {old} → {new}')
doc.save(doc_path)
doc2 = Document(doc_path)
ai_phrases = list(replacements.keys())
残留 = []
for i, p in enumerate(doc2.paragraphs):
for phrase in ai_phrases:
if phrase in p.text:
残留.append(f'[段落{i}] {phrase}')
print(f'AI去痕完成,共 {len(changes)} 处修改')
if 残留:
print(f'⚠️ 残留: {残留}')
else:
print('✅ 无残留')
10.3 跨run替换的坑
AI词汇可能被 python-docx 拆分到多个 run 中(如"紧密"在一个run、"结合"在另一个run),这时 run.text.replace() 无法匹配。解决方案:
if old in p.text and not any(old in run.text for run in p.runs):
combined = ''.join(run.text for run in p.runs)
combined = combined.replace(old, new)
p.runs[0].text = combined
for run in p.runs[1:]:
run.text = ''
输出文件
{项目名}_服务方案.docx — 纯文字版
infographics_{项目名}.html — 信息图网页版
{项目名}_服务方案_final.docx — 带信息图的最终版
注意事项
- Windows 环境下 docx 全局安装需
NODE_PATH="$(npm root -g)"
- .doc 转 .docx 需要 win32com(仅 Windows)
- 如果 Word 正在打开文件会报 EBUSY,换文件名输出
- python-docx 的 sys.stdout 需要
reconfigure(encoding='utf-8')
- 截图需要网络加载 Font Awesome CDN,确保有网络连接
- python-docx 替换图片用
image_part._blob = new_data,不需要重新插入
- 同一文档多次修改时,每次都用
Document(path) 重新读取再保存,避免状态污染