嵌入策略:all-mpnet-base-v2 用于语义搜索

本文解释了如何使用 all-mpnet-base-v2 句子转换器模型,为我们的 SEO 流程提供语义搜索支持。

问题:将查询与产品匹配

当用户搜索“迷你电脑”或“小型计算机”时,尽管没有共享关键词,但它们指的是同一事物。传统的关键词匹配在此失效。我们需要语义嵌入——能够捕捉含义而不仅仅是词语的密集向量表示。

我们的 SEO 流程处理超过 65,000 条搜索查询,需要:

  • 将相似的查询聚类在一起,以便生成查询页面

  • 根据含义将查询与产品匹配

  • 查找相关搜索

  • 扩展短语到筛选器的映射关系

模型:all-mpnet-base-v2

我们使用 all-mpnet-base-v2,这是一个句子转换器模型,它:

  • 输出 768 维 向量

  • 在超过 10 亿个句子对上进行训练

  • 可处理最多 384 个标记的序列

该模型将文本映射到一个密集的向量空间,其中语义相似的文本具有较高的余弦相似度

我们如何使用它

1. 嵌入查询

我们将所有搜索查询嵌入为 768 维向量:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-mpnet-base-v2")
embeddings = model.encode(queries)

每个查询变成一个包含 768 个浮点数的向量(3,072 字节)。对于 65,000 个查询,嵌入向量约占用 190 MB 空间。

2. 聚类查询

我们根据相似度对查询进行聚类:

  • 选择流量最高的 1,000 个查询作为聚类中心

  • 计算所有 65,000 个查询与这 1,000 个中心之间的余弦相似度

  • 相似度 ≥ 0.85 的查询加入该聚类

  • 未聚类的查询成为单例聚类

这创建了查询页面,其中每个页面代表一组相似的搜索。

详情请参阅查询聚类算法

3. 匹配产品

我们嵌入产品名称和特性,然后使用余弦相似度将查询与产品匹配。与查询相似度最高的产品会出现在该查询页面上。

详情请参阅产品匹配算法

4. 扩展短语映射

我们使用嵌入向量来查找用于筛选器提取的相似短语。例如,如果“迷你电脑”映射到一个尺寸筛选器,我们可以发现“小型计算机”也应该映射到该筛选器。

详情请参阅短语映射扩展

存储:NumPy 数组

我们将嵌入向量存储为 NumPy .npy 文件:

import numpy as np

# 保存
np.save("embeddings.npy", embeddings)

# 加载(内存映射)
embeddings = np.load("embeddings.npy", mmap_mode='r')

为什么使用 NumPy?

  • 使用内存映射实现快速加载

  • 用于相似度计算的原生数组操作

  • 紧凑的二进制格式(65,000 个查询约 190 MB)

增量嵌入

我们不会每次都重新嵌入所有查询。我们的增量嵌入流程:

  1. 加载现有的嵌入向量
  2. 比较查询键(文本 + 元数据)
  3. 仅嵌入新的或更改过的查询
  4. 追加到现有数组中

当只有少数查询发生变化时,这显著减少了处理时间。

多服务器架构

嵌入向量在多个服务器上使用:

  1. 批处理流程:根据查询和产品生成嵌入向量
  2. 搜索服务:为相关搜索 API 加载嵌入向量
  3. 主 Web 服务器:使用嵌入向量进行产品匹配

存储方式因服务器而异:

  • NumPy 文件:批处理流程(快速的本地访问)

  • Valkey RediSearch:搜索服务(向量相似度搜索)

有关 Valkey 集成的详细信息,请参阅搜索服务架构

与 SEO 流程的集成

嵌入向量为流程的多个步骤提供支持:

  1. 步骤 0嵌入源数据 - 产品、部件、文章
  2. 步骤 3b嵌入查询 - 所有搜索查询
  3. 步骤 4扩展短语映射 - 查找相似短语
  4. 步骤 5聚类查询 - 分组为查询页面
  5. 步骤 6匹配产品 - 查询-产品匹配
  6. 步骤 8生成相关搜索 - 查找相关查询

完整流程请参阅 SEO 流程概览

参考资料

模型文档

技术概念

相关文章

总结

我们使用 all-mpnet-base-v2 将文本转换为捕捉语义的 768 维向量。这些嵌入向量为我们整个 SEO 流程提供动力:

  • 查询聚类:使用 0.85 相似度阈值将 65K 条查询分组到页面

  • 产品匹配:根据语义将查询与产品匹配

  • 相关搜索:查找用于导航的相似查询

  • 短语扩展:发现新的筛选器短语

嵌入向量存储为 NumPy 数组以实现快速加载,并通过增量处理避免重新嵌入未更改的数据。相同的嵌入向量通过 NumPy 文件和 Valkey RediSearch 在多个服务器上使用。


← 返回文档索引