本文是《电商同款识别:从属性标准化到可迭代的商品理解系统》的第二篇。文中示例均为合成数据,仅讨论技术方案。

Stage 1 将同款识别表示为叶子类目内的属性精确匹配。这套方法可解释,但它的召回能力受类目、NER 与规则覆盖率限制:标题表达不同、属性缺失或图片承载关键信息时,真实同款可能无法得到完全一致的属性向量。

Stage 2 将问题拆成三个连续步骤:先用文本和多模态向量扩大候选集合,再为每条候选 Link 计算同款分数,最后通过聚类和簇中心清洗得到更紧凑的商品簇。

系列导航: 同款识别(一) · 同款识别(二)· 同款识别(三)

1
2
3
4
5
6
7
8
9
10
11
                    ┌─ Text Embedding ── FAISS ─┐
商品 ── 特征构造 ──┤ ├─ 候选 Link 合并
└─ Multi-modal ───── FAISS ─┘

MaskNet Link Rank

类目相关阈值

商品聚类

簇中心更新与离群清洗

1. 为什么需要双路召回

单一模态只能看到商品的一部分。文本包含品牌、型号、规格和商家描述,但会受到多语言、缩写、营销词与信息缺失的影响;图片能提供外观、结构和包装线索,却很难可靠区分容量、数量或兼容型号等细粒度规格。

因此,Stage 2 为每件商品同时构建文本向量和多模态向量,并分别建立 FAISS 索引。两路召回不要求独立完成最终判断,它们的目标是尽可能把潜在同款放入同一个候选集合。

1.1 文本召回:E5-base

文本路使用 E5-base 作为基础编码器,并使用大规模同款商品 Pair 进行微调。输入可以由标题、规格选项、型号字段和描述等文本组成,经统一模板与分隔符组织后编码为定长向量:

zitext=ftext(xi)z_i^{text}=f_{text}(x_i)

对向量执行 L2 归一化后,内积检索与余弦相似度排序等价,因此可以使用 FAISS 高效搜索 Top-K 近邻:

sim(i,j)=(zitext)Tzjtextsim(i,j)=\left(z_i^{text}\right)^Tz_j^{text}

微调的目的不是让“同类商品”都靠近,而是让描述不同的同款商品更接近,同时拉开外观或用途相似、但型号与规格不同的商品。

1.2 多模态召回:CLIP-base

多模态路使用 CLIP-base 分别生成图像向量与文本向量。两者直接拼接,再经过一个线性投影层映射成统一的商品多模态向量:

zimm=W[hiimage;hitext]+bz_i^{mm}=W\left[h_i^{image};h_i^{text}\right]+b

其中,[;][\cdot;\cdot] 表示向量拼接,WWbb 是可训练的线性投影参数。模型在同款商品 Pair 上使用 InfoNCE 进行对比学习。对于一个 batch 中的正样本对,InfoNCE 提高正样本相似度,并将 batch 内其他样本作为负例:

Li=logexp(sim(zi,zi+)/τ)jexp(sim(zi,zj)/τ)\mathcal{L}_{i}=-\log \frac{\exp\left(sim(z_i,z_i^+)/\tau\right)} {\sum_j\exp\left(sim(z_i,z_j)/\tau\right)}

其中,τ\tau 为温度参数。经过微调后,模型学习到与同款关系更相关的图文表示,而不是只关注宽泛的视觉语义。

线性投影后的多模态向量写入独立的 FAISS 索引。它可以补回文本缺失但图片高度一致的候选,也能覆盖标题使用不同语言或商家表达方式差异很大的情况。

两路 FAISS 分别返回 Top-K 候选。系统将结果取并集并去重,形成待打分的商品对:

1
(item_a, item_b)

这里将一个候选商品对称为一条 Link。双路召回负责回答“这两个商品是否值得进一步比较”,而不是直接回答“它们是否为同款”。

向量相似度适合召回,却不足以单独完成同款判断。例如,两件商品可能图片几乎一致,但包装数量不同;也可能 model name 只差一个后缀,而这个后缀恰好代表不同版本。

因此,Stage 2 在召回之后增加 Link Rank。对于候选商品对 (i,j)(i,j),构造以下几类 Pair-wise 特征:

  • 价格差异:两件商品价格的绝对或相对差异;
  • 类目特征:商品所属类目或类目组合编码,用来表达不同类目的匹配模式;
  • model_name 相似度:型号字段的字符串或语义相似度;
  • 包含关系:一个型号或标题是否完整包含另一个;
  • 交叉特征:例如“类目 × 价格差”“model_name 相似度 × 包含关系”。

MaskNet 对这些稠密与离散特征进行显式的特征选择和高阶交互,输出候选 Link 属于同款关系的分数:

sij=fmask(ϕ(i,j))s_{ij}=f_{mask}\left(\phi(i,j)\right)

其中,ϕ(i,j)\phi(i,j) 表示商品对的组合特征。相比只设置一个向量相似度阈值,MaskNet 可以学习“某个信号在什么条件下可信”。例如,较大的价格差在某些类目中可能是强烈的反向信号,而在价格波动更大的类目中不应单独决定结果。

不同类目的商品形态和属性结构差异很大,因此不使用一个全局阈值处理所有候选,而是为类目 cc 设置独立阈值 τc\tau_c

edge(i,j)=I[sijτc]edge(i,j)=\mathbb{I}\left[s_{ij}\geq\tau_c\right]

得分超过对应类目阈值的 Link 被保留为同款候选边,低于阈值的 Link 被过滤。这样可以在类目维度控制边的连接强度,避免某些类目过度聚合、另一些类目又过于保守。

经过阈值过滤后,可以把商品表示成图:每个商品是一个节点,保留下来的 Link 是节点之间的边。随后使用 K-Means 对候选集合中的商品向量进一步聚类,将相互接近的商品组织成若干候选簇。

需要注意,Pair-wise Link 具有局部性和传递风险:即使 AABBBBCC 都超过阈值,也不能保证 AACC 一定足够相似。如果直接依赖边的传递关系,少量错误 Link 可能把两个本应分开的簇连接起来。

4.1 重新确定簇中心

对于 K-Means 得到的每个候选簇 CC,算法重新计算或选取一个能够代表该簇的中心 μC\mu_C。一种方式是直接使用簇内商品向量的均值:

μC=1CiCzi\mu_C=\frac{1}{|C|}\sum_{i\in C}z_i

当一个候选集合被拆成多个子簇时,也可以选择成员数量最大的子簇作为主体,再基于该子簇计算代表中心。相比让少量边缘样本共同影响中心,这种方式更偏向保留候选集合中最密集、最具代表性的结构。

4.2 删除远离簇中心的商品

得到新中心后,重新计算簇内每个商品到中心的距离。若距离超过类目或簇对应的阈值,则将其视为离群点并从当前簇中移除:

C={iCd(zi,μC)δc}C'=\{i\in C\mid d(z_i,\mu_C)\leq\delta_c\}

这一步相当于从“局部 Link 一致”回到“整体簇一致”。它能够将由错误边、图片近似或型号混淆带入簇中的边缘商品移出当前簇,使保留下来的成员围绕同一个中心保持更稳定的距离结构。被移出的只是簇成员关系,原始商品数据不会被删除。

5. 一个合成示例

假设查询商品是某型号的无线耳机。文本路召回了标题包含同一 model name 的商品,多模态路则补回了标题信息很少、但包装和耳机外观一致的商品。

候选集中同时混入了三类干扰项:

  1. 外观相同但型号后缀不同的升级版本;
  2. 标题包含目标型号、实际却是保护壳或替换配件的商品;
  3. 主图相似,但包装数量不同的组合装。

MaskNet 综合类目、价格差、model_name 相似度和包含关系,对每条 Link 重新打分。经过类目阈值过滤后,商品进入聚类;如果仍有某个升级版本通过局部 Link 混入,它与新簇中心的距离较远,会在中心清洗阶段被移除。

6. Stage 2 的技术边界

这一方案把同款识别从严格属性匹配扩展为“高召回候选生成 + Pair-wise 精排 + 全局簇清洗”,但仍有几个需要明确的技术边界:

  • 两路召回的 Top-K 和合并策略决定候选召回上限;
  • 对比学习的正负样本质量会直接影响向量空间;
  • MaskNet 只能在已召回的 Link 上重新排序,无法恢复召回阶段完全遗漏的商品;
  • 类目阈值需要适配不同类目的分数分布;
  • 错误 Link 可能通过传递关系污染整个簇;
  • K 值、簇中心策略与距离函数的定义会影响离群清洗结果。

Stage 3 将进一步讨论:如何用分层大模型替换 Link Rank,并通过 Key-Sales SOP 将逐属性判断组合成最终的同款结论。

上一篇: 同款识别(一):类目与属性基线
下一篇: 同款识别(三):分层模型与属性 SOP