Matrix-based · Industry Chain Matching Engine

Industry Chain
Matcher

// 源文本 → 产业链环节 · 批量矩阵映射

将任意源文本文档,通过向量相似度与可配置的规则矩阵,批量精准映射到产业链图谱的具体环节。 支持百万级文档处理,所有匹配逻辑编码为矩阵运算,一次乘法得出全量结果,无需逐条循环。

矩阵批量运算 A/B 双组链路逻辑 "其他"排他兜底 LLM 阈值标定 GPU 可选加速 断点续跑

统一矩阵运算

A/B组门控、排他兜底、L0级联筛选,全部预编码为配置矩阵。匹配时一次矩阵乘法得出 m×n 完整结果,无逐条循环,可扩展至百万级文档。

双类型链路逻辑

A 组(特定应用)需通过 L0 根节点相似度门控;B 组(通用赋能)直接匹配,两类链路共存于同一矩阵运算中,无需分批处理。

"其他"排他兜底

排他归属矩阵(Exclusion Mapping Matrix)确保兜底节点仅在同级所有具体节点均未命中时才触发,支持 L3、L4 等多层级场景。

LLM 辅助阈值标定

内置四步标定流水线:按相似度分箱采样 → LLM 判断 → 统计符合率 → 导出个性化阈值。也支持手动配置 CSV 跳过此步骤。

两阶段执行架构

UPSTREAM PIPELINE MATCHING PIPELINE SOURCE PIPELINE LLM 定义链路 llm_define_chains 解析格式化 parse_chain_defs 链路向量化 embed_chain_defs chain_type.csv A/B 类型标注 threshold*.csv LLM 标定 / 手动 prepare_chain_config 构建配置矩阵 run_similarity 矩阵相似度计算 apply_matching 阈值 + 逻辑掩码 export_results 导出 Parquet final_results .parquet 原始源文本 .parquet / .csv 预处理分批 preprocess_source 源文本向量化 embed_source_texts 0 1 2 3

一次性运行:LLM 为每个产业链节点生成 embedding 友好的文字定义,向量化后保存。更换产业链时重新执行此阶段即可,匹配阶段无需变动。

支持任意文本类型(描述、摘要等)。预处理后分批向量化,输出 source_part_*.npz,可增量追加新批次。

核心匹配流水线

步骤 0→3:构建配置矩阵 → 批量相似度计算 → 阈值+掩码匹配 → 导出 Parquet。无 GPU 要求,全程矩阵运算,支持断点续跑。

统一矩阵计算逻辑

所有匹配判断均编码为矩阵运算,核心思路是将"业务规则"提前预计算为配置矩阵, 匹配时只需三次矩阵乘法 + 逐元素掩码合并,即可得到 m × n 的完整匹配结果。

Sim_L0           = L0_Embed           @ D.T   →  (1,       n)   L0 根节点 vs 全部源文本
Sim_Spec         = Spec_Embeds        @ D.T   →  (m_spec,  n)   具体链路 vs 全部源文本
Sim_Other_Parent = OtherParent_Embeds @ D.T   →  (m_other, n)   "其他"父级 vs 全部源文本
链路类型 匹配条件 涉及矩阵
A 组具体链路 Sim_Spec[j,i] > Threshold_Spec[j] Sim_L0[i] > T_L0 Spec_Mask ∧ Cascade_Mask
B 组具体链路 Sim_Spec[j,i] > Threshold_Spec[j] Spec_Mask(L0 门控自动豁免)
"其他"兜底节点 Sim_Other_Parent[k,i] > Threshold_Other[k] 同级具体节点均未命中 通过类型门控 Other_Mask ∧ No_Sibling_Match ∧ Cascade_Mask
Chain_Type_Vector

A/B 双组门控

每条链路预标注类型(A=特定应用 / B=通用赋能)。A 组链路需要 L0 相似度超过全局阈值 T_L0 才能命中, B 组直接匹配。两组共享同一套相似度矩阵,Chain_Type_Vector 控制 L0 门控是否生效。

Exclusion_Mapping_Matrix

"其他"排他逻辑

预计算一个稀疏矩阵 E (m_other × m_spec),记录每个"其他"节点需要排他的具体兄弟节点。 匹配时 No_Sibling_Match = (E @ Spec_Mask_bool == 0), 一次矩阵乘法即可判断是否有兄弟节点命中。

LLM Calibration

阈值标定流水线

相似度连续值需要转换为二元匹配决策。内置四步流水线: 按分箱采样 → LLM 逐条判断 → 统计各箱符合率 → 取目标符合率对应分位数作为阈值, 每条链路独立确定,也可完全手动配置。

Batch Processing

批量断点续跑

源文本按文件分批处理,每批次的相似度矩阵独立保存。 中断后从上次完成的批次继续,不重复计算已完成的批次。 支持可选 GPU 加速(CuPy),CPU 环境同样可运行。

快速开始

1

安装依赖

pip install -r requirements.txt
2

生成示例数据

生成一条包含 13 个节点的虚构产业链和 200 条模拟文档,以及配套阈值文件。

python sample_data/generate_sample_data.py
3

运行核心匹配流水线

python chain_matching_sop/prepare_chain_config.py   # 步骤 0:构建配置矩阵
python chain_matching_sop/run_similarity.py           # 步骤 1:计算相似度
python chain_matching_sop/apply_matching.py           # 步骤 2:应用匹配逻辑
python chain_matching_sop/export_results.py           # 步骤 3:导出结果
4

查看结果

import pandas as pd
df = pd.read_parquet("chain_matching_sop/results/final_matching_results.parquet")
print(df.columns.tolist())
# ['chain_id', 'chain_name', 'info_id', 'similarity', 'source_text']

环境变量(.env

变量说明
LLM_API_URLOpenAI 兼容的 LLM 接口地址(阈值标定用)
LLM_API_KEYAPI 鉴权密钥
LLM_MODEL_NAMELLM 判断所用的模型名称
EMBEDDING_MODEL_PATH本地 embedding 模型路径(上游流水线用)

输入 / 输出数据格式

输入文件

文件必需字段形状
chain_embeddings.npz chain_names(字符串数组)、embeddings(float32) (m, d)
l0_embedding.npz chain_names(单元素数组)、embeddings(float32) (1, d)
chain_type_classification.csv chain_nametype(取值 A 或 B)
source_part_*.npz ids(整数数组)、embeddings(float32) (n_batch, d)
source_part_*.parquet id(整数)、source_text(字符串)

输出文件

chain_matching_sop/results/final_matching_results.parquet

字段类型说明
chain_idint产业链节点索引
chain_namestr产业链节点全路径名称
info_idint源文本 ID
similarityfloat32余弦相似度得分
source_textstr源文本内容
文件命名约定:源文本 embedding 文件须以 source_part_ 为前缀 (如 source_part_1.parquetsource_part_1.npz), 与 data_config.py 中的 SOURCE_EMBEDDINGS_PATTERN 保持一致。 如需自定义前缀,同步修改该配置项即可。