供应商串标风险分析
从供应商清单(文本或截图)出发,完成"识别主体 → 检索工商 → 关联比对 → 风险判定 → 导出 Excel"
全链路,输出结构化结论与四表 Excel 报表。面向招投标合规、采购风控、审计。
何时使用
- 用户粘贴/上传供应商名单,要求"查一下有没有关联""会不会串标""做关联分析"。
- 用户给出投标/中标截图,要求识别供应商并评估围标风险。
- 用户要求输出"供应商对比表""关联关系表""风险结论"等 Excel。
- 触发词:串标、围标、关联、工商比对、防围标、股权穿透、利益输送。
目录结构
supplier-collusion-risk/
├── SKILL.md # 本说明文件(功能/触发/依赖/调用/流程)
├── scripts/
│ ├── extract_suppliers.py # 步骤1 名称提取与校验(简称/错别字/重名)
│ ├── lookup_company.py # 步骤2 单平台工商字段规范化 + 可信度 + 实控人推断
│ ├── aggregate_data.py # 步骤2 多平台聚合:缺失补全 + 跨平台校验 + 并集合并
│ ├── association_analysis.py # 步骤3 关联比对 + 风险分/等级/不确定性 + 直接关联强制高
│ ├── build_excel.py # 步骤4 导出四表 Excel(重合高亮 + 结论横幅 + 校验摘要)
│ └── run_analysis.py # 单进程编排器:聚合→分析→出表,带阶段缓存,端到端更快
└── references/
├── data_sources.md # 数据源、字段清单、可信度赋值约定
└── association_rules.md # 关联类型权重、风险阈值、群体性升级规则、直接/间接分类
依赖
- Python 3.10+(用隔离 venv,勿污染用户环境):
PY=/Users/huang/.workbuddy/binaries/python/versions/3.13.12/bin/python3
$PY -m venv /Users/huang/.workbuddy/binaries/python/envs/default
/Users/huang/.workbuddy/binaries/python/envs/default/bin/pip install openpyxl
- 工商检索依赖(按需):已连接的工商类 Connector(天眼查 tyc-mcp、企查查 qcc-company、
水滴征信 cisp-mcp、恒生聚源 gildata);若全断开,回退 WebSearch/WebFetch(见 references/data_sources.md)。 - OCR:截图输入直接用 Read 工具读取图片做视觉 OCR,提取文字后进入步骤1;无需额外 OCR 依赖。
标准执行流程
推荐:单进程编排器(端到端更快)
run_analysis.py 把聚合、分析、出表三个阶段在同一进程内完成,仅启动一次 Python、
仅导入一次 openpyxl,并带有阶段结果缓存(默认 ~/.workbuddy/cache/supplier-collusion/,
按输入内容哈希落盘)。相同输入重复生成报告时直接命中缓存、跳过计算,近乎即时返回。
绝大多数场景应优先用此入口,而非依次调用三个独立脚本(后者每次多进程启动开销约 0.3s)。
PYE=/Users/huang/.workbuddy/binaries/python/envs/default/bin/python
# 多平台原始 JSON → 直接出表(最常用)
$PYE scripts/run_analysis.py --multi-raw multi_platform_raw.json \
--output 供应商串标风险分析.xlsx
# 已有规范化记录 → 出表
$PYE scripts/run_analysis.py --records records.json --output 供应商串标风险分析.xlsx
# 跳过重跑缓存(强制重算)
$PYE scripts/run_analysis.py --multi-raw multi_platform_raw.json --no-cache --output 供应商串标风险分析.xlsx
性能要点(已落地于代码):
- 关联分析阶段对每条供应商预构建比对索引(归一化股东/高管/历史集合、电话/邮箱/地址
归一值、经营范围关键词与二元组一次性切分、实控人归一值),O(n²) 两两比对直接复用,
不再每对重算归一化与经营范围切分。
- norm / normalize_phone 经 lru_cache 记忆化,相同字符串只算一次。
- aggregate_data.py 的字段别名、平台可信度改为一次性查表,去掉每次调用的线性扫描。
- build_excel.py 高频单元格样式提至模块级常量,避免逐行重复构造对象。
步骤 1 — 提取与校验供应商名称
- 文本:直接喂给
extract_suppliers.py。 - 截图:用 Read 工具识别图中供应商名单文字,整理为文本后再喂脚本。
PYE=/Users/huang/.workbuddy/binaries/python/envs/default/bin/python
$PYE scripts/extract_suppliers.py --text "$(cat 名单.txt)" > suppliers_raw.json
- 脚本输出每项含
raw / normalized / confidence / flags / needs_full_name_check。 - 对
needs_full_name_check=true或带"疑似错别字/近似重名"的条目,用 WebSearch 核对权威全称,
以统一社会信用代码为准去重;重名条目合并为一家。
步骤 2 — 检索工商并规范化(多平台优先 · 缺失自动补全 · 跨平台校验 · 股权穿透)
检索顺序(见 references/data_sources.md):
1. 优先调用已连接工商 Connector(天眼查 tyc-mcp、企查查 qcc-company、水滴征信 cisp-mcp、恒生聚源 gildata)。
2. 缺失或全断开时,必须从以下平台逐一检索,不可只取单源:
- 天眼查(tianyancha.com):股东/高管/历史变更/电话/邮箱/对外投资
- 企查查(qcc.com):股东/法人/对外投资/司法/股权穿透图
- 启信宝(qixin.com):股权穿透/受益所有人/邮箱/间接股东
- 风鸟(shuidi.cn):工商基础信息补充/联系电话
- 爱企查(aiqicha.baidu.com):联系方式/邮箱/经营范围/股权穿透图
- 国家企业信用信息公示系统(gsxt.gov.cn):官方权威,股东/变更/分支
3. 某平台缺字段时,自动从其他平台补齐;同一字段多平台取值需交叉比对,一致则高可信,冲突则取高可信平台并标注。
联系方式检索要求:
- 联系电话与邮箱是串标最核心的关联证据,必须主动从年报/企业公示信息页获取。
- 天眼查/启信宝/爱企查年报页面含「企业联系电话」「电子邮箱」字段,需 WebFetch 抓取。
- 如企业选择不公示电话/邮箱,须在记录中标注「企业未公示」,不可留空不查。
股权穿透检索要求:
- 对每家供应商,须追溯股东至少 2 层穿透(直接股东 → 股东的股东)。
- 天眼查/企查查/启信宝均提供「股权穿透图」「最终受益人」「实际控制人」页面,需 WebFetch/WebSearch 获取。
- 将穿透结果写入 shareholder_chain 字段(数组),每项含 name(股东名称)、layer(穿透层数,1=直接股东)、ratio(持股比例)、via(间接持股路径,如"经X公司")。
- 自然人独资企业(如100%持股),穿透结果即该自然人,仍须记录。
- 样例见 samples/multi_platform_input.json。
多平台聚合(推荐路径):将各平台检索结果整理为 aggregate_data.py 的输入
(每供应商一个 platforms 对象,键为平台名),运行:
$PYE scripts/aggregate_data.py --file multi_platform_raw.json > records.json
- 脚本自动完成:缺失补全、跨平台一致性/冲突校验、列表字段并集合并。
- 输出规范记录:含股东/高管/历史变更/对外投资/分支/推断实控人、
field_credibility(按校验结果赋值)、completeness、missing_key_fields、platforms、cross_validation。 - 样例见
samples/multi_platform_input.json。
单平台路径(仅在确无多源时):把检索结果直接按 lookup_company.py 输入结构组装,运行:
$PYE scripts/lookup_company.py --file suppliers_raw.json > records.json
- 输入结构见
samples/example_input.json与脚本头部示例。 - 检索时按 references/data_sources.md 的字段清单采集;每项标注
source与field_credibility。
步骤 3 — 关联分析与风险判定
$PYE scripts/association_analysis.py --file records.json > analysis.json
- 产出
associations(每条关联的类型/涉及方/明细/证据/可信度)、risks(每对风险等级/依据/不确定性)、
groups(≥3 家共享主体的群体性告警)、summary。判定逻辑见 references/association_rules.md。
步骤 4 — 导出 Excel
$PYE scripts/build_excel.py --records records.json --analysis analysis.json \
--output 供应商串标风险分析.xlsx
- 生成四表:
- 概览:顶部「最终风险结论」横幅直接展示判定结果(高风险红色高亮、无风险绿色),并列出重点高风险对;含核心统计卡片与风险等级图例。存在风险时以概括性段落描述各组风险(等级、风险分、命中关联类型、关联性质);无风险时明确显示「无风险」。页面仅呈现必要核心汇总结论,简洁清晰。数据完整度(completeness)与跨平台校验(cross_validation)仅在
aggregate_data.py后台计算,用于内部数据质量校验,不在概览页渲染或展示。 - 供应商信息对比表(重合项黄底高亮)。
- 关联关系明细表(含「关联性质」列:直接 / 间接)。
- 风险结论汇总表(含「关联性质」列)。
- 关联性质口径:直接关联(直接控股、直接共同董监高、共用电话/地址/邮箱等联系方式、同一实控人、兄弟公司);间接关联(多层股权穿透、历史投资路径、历史任职交叉等推导关系)。详见 references/association_rules.md。
- 用 present_files 交付 xlsx,并在回复中给出文字结论(高/中/低风险分布 + 关键证据)。
关键判别与易错点
- 全称校验是前提:简称、错别字、重名必须先在步骤1用工商权威源确认,否则后续关联全部错位。
- "无关联"≠"无串标":公开数据有滞后与脱敏,结论仅代表"未检出可量化关联",须附不确定性提示。
- 强关联优先:电话/邮箱/实控人一致几乎等同同操盘方,权重已体现;弱关联(经营范围雷同)单独出现不升级。
- 伪重合防范:虚拟地址、园区注册、共用代理记账会造成"伪重合",在 basis 中说明,必要时建议补实地/IP/笔迹旁证。
- 数据缺口即风险的一部分:缺失股东/法人/地址时,结论可信度下调,不可隐瞒缺口。
辩证视角
- 关联结构只能证明"具备串标条件",不能直接证明"已串标";本技能输出的是风险信号,供人工与旁证复核。
- 同一证据在不同行业权重不同(工程类重地址/电话,货物类重股东/实控人),阈值可在 references/association_rules.md 调整。
- 检索来源存在商业利益与收录偏差,结论应标注来源与可信度,避免把单一站点数据当权威。
交付
- 主交付:
供应商串标风险分析.xlsx(含四表)。 - 文字结论:高/中/低风险家数与证据要点、群体性告警、数据缺口提示。
- 过程文件:
suppliers_raw.json/records.json/analysis.json存于工作区,便于复核与重跑。