嵌入策略: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)
增量嵌入
我们不会每次都重新嵌入所有查询。我们的增量嵌入流程:
- 加载现有的嵌入向量
- 比较查询键(文本 + 元数据)
- 仅嵌入新的或更改过的查询
- 追加到现有数组中
当只有少数查询发生变化时,这显著减少了处理时间。
多服务器架构
嵌入向量在多个服务器上使用:
- 批处理流程:根据查询和产品生成嵌入向量
- 搜索服务:为相关搜索 API 加载嵌入向量
- 主 Web 服务器:使用嵌入向量进行产品匹配
存储方式因服务器而异:
-
NumPy 文件:批处理流程(快速的本地访问)
-
Valkey RediSearch:搜索服务(向量相似度搜索)
有关 Valkey 集成的详细信息,请参阅搜索服务架构。
与 SEO 流程的集成
嵌入向量为流程的多个步骤提供支持:
- 步骤 0:嵌入源数据 - 产品、部件、文章
- 步骤 3b:嵌入查询 - 所有搜索查询
- 步骤 4:扩展短语映射 - 查找相似短语
- 步骤 5:聚类查询 - 分组为查询页面
- 步骤 6:匹配产品 - 查询-产品匹配
- 步骤 8:生成相关搜索 - 查找相关查询
完整流程请参阅 SEO 流程概览。
参考资料
模型文档
-
all-mpnet-base-v2 模型卡片 - Hugging Face
-
Sentence Transformers 文档 - 官方文档
-
Sentence Transformers 论文 - Reimers & Gurevych, 2019
技术概念
-
词嵌入 - 维基百科
-
余弦相似度 - 维基百科
-
NumPy 内存映射文件 - NumPy 文档
相关文章
-
SEO 流程概览 - 完整的流程架构
-
查询聚类算法 - 我们如何聚类 65K 条查询
-
搜索服务架构 - Valkey RediSearch 集成
-
产品匹配算法 - 语义匹配
-
短语映射扩展 - 使用嵌入向量进行筛选器扩展
总结
我们使用 all-mpnet-base-v2 将文本转换为捕捉语义的 768 维向量。这些嵌入向量为我们整个 SEO 流程提供动力:
-
查询聚类:使用 0.85 相似度阈值将 65K 条查询分组到页面
-
产品匹配:根据语义将查询与产品匹配
-
相关搜索:查找用于导航的相似查询
-
短语扩展:发现新的筛选器短语
嵌入向量存储为 NumPy 数组以实现快速加载,并通过增量处理避免重新嵌入未更改的数据。相同的嵌入向量通过 NumPy 文件和 Valkey RediSearch 在多个服务器上使用。