Install
openclaw skills install @chesaram/bid-dup-check-1-1-0标书查重与围串标风险初筛助手。当用户上传多份投标或招标文件需要检测文本雷同、关键信息(公司/电话/项目经理/造价师等)碰撞、文档属性一致、表格相似或两份文档差异比对时使用。基于大模型语义比对,输出含风险等级与定位的结构化检测报告,并支持导出 Word。适用于投标人自检与招标人初步筛查,不适用于评标委员会正式判定。
openclaw skills install @chesaram/bid-dup-check-1-1-0将主流标书查重 / 围串标检测能力封装为轻量化专家技能(标书查重专家),实现「上传文件 → 自动解析 → 风险检测 → 结构化报告」的闭环。核心定位是标书风险快速初筛助手,而非专业查重系统:用大模型做语义比对与实体抽取,用脚本做确定性的文档解析与报告渲染,避免重计算与自建向量库。
适用:投标人自检、招标人初步筛查。不适用:评标委员会正式判定。仅支持中文标书。
本 Skill 是「给 AI 智能体的行为准则」,而非「给工程师的 SOP」。下面的每一步都同时规定做什么 + 怎么想 + 怎么输出 + 出错怎么办;核心推理(Step 4)的 Schema 已内联,不依赖你"去读外部文件才能知道字段"。
出现以下意图时触发本 Skill:
.docx / .pdf(含文本层)/ .txt 标书,并要求查重或风险检测未触发时勿主动调用。
脚本运行于 WorkBuddy 托管 Python 环境。执行前先自动检测依赖是否就绪:
Python >= 3.9python-docx >= 0.8.11(docx 解析与报告生成)pypdf >= 3.0.0(pdf 文本与元数据)检测与安装方式(用托管 Python 的 pip):
python -c "import docx, pypdf; print('deps ok')" || pip install python-docx pypdf
若导入失败,先安装再继续。若依赖安装失败,给出替代方案:提示用户将文档转为 .txt 后重新上传(.txt 仅需标准库即可解析)。
提取脚本会一并导出 docx 内嵌图片到 extracted_images/ 目录,供视觉 OCR 使用。
执行任何脚本前,必须先确定两个真实路径变量(严禁在命令中保留尖括号 < > 占位符):
SKILL_DIR:本 Skill 的根目录绝对路径,即本 SKILL.md 所在目录。其下的 scripts/ 即脚本目录。WORKSPACE:当前会话的工作目录绝对路径,即用户上传文件所在目录(用 pwd 获取)。命令模板(将 [...] 整体替换为真实绝对路径后再执行):
python "[SKILL_DIR]/scripts/extract_documents.py" \
--files "[FILE1]" "[FILE2]" \
[--bidding "[TENDER]"] \
--out "[WORKSPACE]/extracted.json"
若不确定
SKILL_DIR的真实位置,可在本会话中用文件检索定位scripts/extract_documents.py的真实绝对路径后代入。绝不要把字面量<skill_dir>/<工作目录>当作命令参数传给 Shell。
向用户确认待检测的投标文件(2–10 份)。若用户希望排除「大家都照抄招标文件」造成的误报,可一并收集招标文件用于基线剔除。
输入约束:单文件 ≤ 50 MB;格式 .docx / .pdf(文本层)/ .txt。扫描版 PDF 若无文本层,当前环境 OCR 默认不可用,需在报告中标注限制。
收到文件后立即回复启动确认(P2-2):
已收到 N 份文件:[文件名列表]。正在进行文档解析,预计需要 X 分钟……
估算规则(供填 X 参考,不要求精确):总段落数 ≤ 100 → 约 1–2 分钟;100 < 总段落数 ≤ 300 → 约 3–5 分钟;> 300 → 约 5–10 分钟;若含扫描件 OCR,每张图片额外增加 5–10 秒。
仅上传 1 份文件时:提示至少需要 2 份才能比对,并询问是否仅做单文档结构分析(此时只输出结构概览,不做碰撞检测)。
运行提取脚本,将文档转为统一 JSON(路径按上文 Path Resolution 规范处理):
python "[SKILL_DIR]/scripts/extract_documents.py" \
--files "[FILE1]" "[FILE2]" \
[--bidding "[TENDER]"] \
--out "[WORKSPACE]/extracted.json"
进度反馈:解析完成后简要告知:
✅ 文本提取完成,共解析 N 个段落 / M 份文档。
输出 JSON 含每份文档的段落、表格、元数据与图片路径。若 extracted.json 中出现 errors 或文档 warnings(如 PDF 无文本层),按 Step 6 的错误处理策略处理。
⚠️ 本步解决原文档的矛盾:原 Step 3 说"用视觉能力做 OCR",Notes 又说"OCR 默认不可用",导致职责不清。职责归属如下:
3.1 检查 extracted.json 中每个文档的 char_count:若某文档文本量极少(< 100 字/页)但图片极多 → 判定为扫描件。
3.2 若你具备视觉多模态能力:
extracted_images/ 下该文档的图片逐张进行 OCR 文字提取;source: vision_ocr;3.3 若无视觉能力或 OCR 不可用:
limitations 中记录:文档 [文件名] 含 N 张图片/扫描页,未提取文字,风险检测覆盖率不完整。⚠️ 严禁对图片做图像哈希或 Logo 比对,本 Skill 仅聚焦图片中的文字内容(如 Logo 上的文字、资质证书编号)。
⚠️ 本步骤是整个 Skill 的核心,必须严格按子步骤顺序执行,不得跳过。references/detection_rules.md 含敏感字段与补充规则的详细说明,可在需要时通过文件读取工具查看;但本步内联的字段清单、定级标准与输出 Schema 为唯一权威——两者冲突时一律以本步为准,不得自行增删字段。
4.0 前置分流(应对长文档)
extracted.json 中所有文档的总段落数 total_paragraphs;total_paragraphs ≤ 200:直接进入 4.1 全量比对;total_paragraphs > 200:先执行摘要阶段——每份文档生成章节级摘要(格式:{"chapter": "技术方案", "key_entities": ["张三", "1000万"], "data_points": ["工期365天"]});仅对摘要中命中敏感字段或高度相似的章节进入 4.3 精比;未命中的章节在报告中标注「摘要阶段未命中,未进入精比」。4.1 实体归一化与敏感字段清单(降噪前置 + 字段内联,避免依赖外部文件)
先对齐本步检测的敏感字段清单(确定性与一致性以此为准,不得自行增删):
公司名称 / 公司简称、项目经理、造价师、联系电话、邮箱、开户行与账号、法人 / 授权代表、注册地址、统一社会信用代码。
实体归一化:
中建三局 = 中建三局集团有限公司;李四(项目经理) → 李四;10年 = 十年 = 10 年。4.2 基线剔除(关键降噪,P0 采纳)
--bidding):雷同文本同时出现在招标文件和 ≥2 份投标文件中 → 标记 baseline,level 设为 低,reason 注明「该段文本源自招标文件第 X 章,属正常引用」;limitations 注明「未启用基线剔除,存在基线误报可能」。4.3 风险检测(按优先级执行,低成本高价值优先)
4.3.5 差异比对(仅当投标文件数 = 2 时触发)
conclusion 或 limitations 中说明「文件数超过 2 份,差异比对暂不适用,建议两两单独比对」。4.4 相似度定级标准(P0-2 修订:定性锚定,替代"感觉分数")
| 等级 | 代表 score | 定性特征(满足任一即判定) | 示例 |
|---|---|---|---|
| 高 | 0.90 | 连续 50 字以上完全相同;或仅替换公司名称其余逐字一致;或核心句子相同且多个关键数据(单价/工期/编号)完全一致 | 技术方案整段逐字复制 |
| 中 | 0.60 | 表述逻辑/结构一致但句式与用词有明显调整(同义改写);或表格结构一致但数据有细微变化;或最后作者相同/创建时间高度接近 | "具有10年经验" vs "拥有十年工作经验" |
| 低 | 0.30 | 仅个别通用术语或招标原文重合;非核心字段雷同 | 行业套话"根据招标文件要求" |
场景修正规则:
低,不计入风险。输出要求:每条 text_similarity 必须含 level、score(取上表对应档位代表值)、reason(解释定级依据的定性特征)、type(直接复制 / 同义改写 / 结构相似)。
4.5 强制输出 Schema(严格按此输出,禁止增删顶层字段)
{
"overview": {
"file_count": 2,
"risk_total": 5,
"high_risk_count": 2,
"avg_similarity": 0.42,
"summary": "一句话概述"
},
"key_info_collisions": [
{
"field": "项目经理",
"value": "张三",
"files": ["a.docx", "b.pdf"],
"locations": ["a.docx 第12段", "b.pdf 第8段"],
"level": "高",
"reason": "两家投标文件的项目经理为同一自然人"
}
],
"text_similarity": [
{
"file_a": "a.docx",
"file_b": "b.pdf",
"score": 0.90,
"level": "高",
"type": "直接复制",
"reason": "连续三段落结构完全一致,且关键数据相同",
"segments": [
{"text": "(前50字)……", "location": "a.docx 第X段 / b.pdf 第Y段"}
]
}
],
"attribute_warnings": [
{
"file": "a.docx",
"level": "高",
"fields": {"author": "张三", "company": "XX"},
"detail": "作者/公司相同",
"reason": "不同投标方文档的作者元数据相同"
}
],
"table_similarity": [
{
"file_a": "a.docx",
"file_b": "b.pdf",
"level": "中",
"detail": "表格结构相似",
"reason": "报价表行列结构一致,仅单价尾数不同"
}
],
"diff": [
{"type": "add|delete|change", "file_a": "a.docx", "file_b": "b.pdf", "content": "……"}
],
"limitations": [
"文档 c.txt 含 N 张扫描页未提取文字,覆盖率不完整"
],
"baseline_note": "已使用招标文件做基线剔除",
"conclusion": "综合建议文本"
}
level 取值仅限 高 / 中 / 低 三选一;score 取 4.4 表对应档位代表值;baseline_note 未启用时为 null;conclusion 必填。
4.5.1 limitations 字段填充规则(合并以下来源,去重后输出字符串数组)
extracted.json 中各文档的 warnings(如「PDF 无文本层」);4.6 自检清单(输出前必须逐项确认)
level ∈ {高, 中, 低}extracted.json 中的 filename 完全一致[],严禁省略该字段reason 字段overview.risk_total / high_risk_count 与各数组长度一致limitations 已记录解析失败 / 扫描件未识别等覆盖缺口确认无误后,将 JSON 写入 [WORKSPACE]/findings.json。
将 findings JSON 写入文件后渲染报告(路径按 Path Resolution 规范):
python "[SKILL_DIR]/scripts/build_report.py" \
--findings "[WORKSPACE]/findings.json" \
--out "[WORKSPACE]/标书查重报告.docx" \
[--markdown "[WORKSPACE]/标书查重报告.md"]
结果交付(三层递进,P2-2):
.docx 下载);报告须含七部分:检测概览 → 一、关键信息碰撞 → 二、文本语义相似度 → 三、文档属性预警 → 四、表格内容相似度 → 五、差异比对 → 六、综合结论与建议 →(附)限制与免责声明。
所有对外生成内容(对话摘要、Markdown 报告、docx 报告)末尾必须自动附统一署名与反馈脚注(由 build_report.py 渲染,护栏铁律级,不可省略):「署名:一线评标专家&ChesaraM | 反馈/交流:微信公众号「一线评标专家」(使用问题、误报反馈、实务建议,欢迎留言交流)」。
追问支持(P2-2):用户可针对任意一条 finding 追问。定位原文时回读 extracted.json 中对应文档该段落前后各 1–2 段作为上下文展示,而非仅依赖 segments 中的截取片段;若 segments 的位置信息(如「第 12 段」)不明确,用关键词在原文中模糊搜索回补。同时解释定级理由、建议进一步核实方向。
在对话或报告末尾说明:本 Skill 为初筛/辅助工具,不替代专业查重系统或法律判定;高利害场景须人工复核。不承诺「100% 检出」或「绝对判定围串标」。
错误与降级处理(P1-1,异常不得静默退出):
| 异常场景 | 处理策略 |
|---|---|
| 文件格式不支持 | 提示用户转换格式,列出支持清单(docx/pdf/txt) |
| 文件损坏 / 加密 | 标记该文件「无法解析」,继续处理其余文件,报告中注明 |
| 提取内容为空(疑似扫描版) | 提示可能是扫描版 PDF,建议提供文本版或启用视觉 OCR |
| 脚本执行超时 | 建议减少文件数量或拆分处理 |
| 依赖安装失败 | 给出替代方案:提示用户将文档转为 .txt 后重新上传 |
| 仅上传 1 份文件 | 提示至少需 2 份才能比对,询问是否仅做单文档结构分析 |
| findings 为空 | 报告正文写「未发现显著围串标特征」,仍渲染报告骨架(概览 + 免责声明) |
| 部分文件解析失败 | 在 limitations 记录,报告中标注覆盖率不完整 |
通用原则:脚本报错时立即终止后续脚本执行,读取 stderr,用通俗语言向用户解释;任何步骤失败都必须给出明确反馈,不得静默退出。
extract_documents.py — 从 docx/pdf/txt 提取段落、表格、元数据、内嵌图片路径,输出统一 JSON(含 errors/warnings)。build_report.py — 读取 findings JSON,渲染 docx(及可选 markdown)检测报告,安全展示 reason/type/limitations。detection_rules.md — 敏感字段清单、风险等级、相似度定性评分锚点、基线剔除规则、报告 schema 与免责声明。作为 Step 4 的补充参考(Step 4 内联 Schema 为唯一权威)。标书篇幅长、多份两两比对时上下文压力大。提取脚本已将文档结构化为 JSON,分析在 JSON 上进行;额外策略:
extracted.json 原文上下文(前后各 1–2 段)、解释理由、给核实建议。extracted.json、extracted_images/)。138****5678)。limitations 标注(见 Step 3)。署名:一线评标专家&ChesaraM | 反馈/交流:微信公众号「一线评标专家」(使用问题、误报反馈、实务建议,欢迎留言交流)