小睿AI导航

ARTICLE DETAIL

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

本文用一个中文帮助中心匹配示例,介绍Sentence Transformers的安装、模型首次下载、批量编码和语义相似度排序。你将学会核对模型的中文支持、输入长度与许可证,检查向量数量和维度,并理解归

🧠 大模型与开发 浏览 1 2026-11-08 作者 小睿AI
📝

文章正文

样式 7 内容详情排版

阅读提示当前文章有1151字,阅读完大概需要3分钟。

先明确要完成的任务

用户输入“密码忘记了,怎样重新设置?”,程序从几条帮助中心问题中找出语义最接近的条目。负责将文本编码为固定维度的向量,再由本地代码计算相似度、排列候选问题。这个最小示例只需要模型和内存中的向量,不需要。

安装依赖并核对模型

建议在独立的Python虚拟环境中执行安装命令:

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

python -m pip install -U sentence-transformers numpy

安装会带入所需依赖,包括PyTorch。若遇到Python版本不兼容或依赖安装失败,应根据安装报错和当前包的环境要求处理。

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

本例使用sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2。其模型卡列出包括中文在内的多语言支持,输出为384,Sentence Transformers配置的最大输入长度为128个token,许可证为Apache-2.0。这里的token不等于汉字数,超出长度的输入会被截断。

  • 中文支持:核对模型卡明确列出的语言,并用自己的中文问题验证效果。
  • 输入长度:检查模型配置,长文可先按段落切分,避免关键信息被截掉。
  • 许可证:部署前确认所选模型的许可证及附带要求。
  • 输入格式:本例模型直接编码文本;换成要求query:、passage:等前缀的模型时,必须按模型卡区分查询和候选文本。

批量生成向量并排序

将下面各行依次保存为match.py。代码使用CPU,便于明确运行设备;这不代表对运行速度或内存占用的承诺。

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

from sentence_transformers import SentenceTransformer

import numpy as np

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', device='cpu')

questions = ['忘记登录密码后如何重置?', '已经登录,如何修改当前密码?', '收不到密码重置邮件怎么办?', '如何修改发票抬头?']

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

query = '密码忘记了,怎样重新设置?'

vectors = model.encode(questions, batch_size=4, convert_to_numpy=True, normalize_embeddings=True)

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

query_vector = model.encode([query], convert_to_numpy=True, normalize_embeddings=True)

print('候选向量形状:', vectors.shape, '查询向量形状:', query_vector.shape)

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

assert vectors.shape == (len(questions), 384)

assert query_vector.shape == (1, 384)

Sentence Transformers怎么用?从文本向量生成到语义相似度计算的入门指南

scores = vectors @ query_vector[0]

order = np.argsort(-scores)

print('\n'.join(f'{scores[i]:.4f} {questions[i]}' for i in order))

运行python match.py。首次加载时,程序需要联网下载模型权重、分词器和配置文件,并写入本机缓存;后续加载可复用缓存。下载完成后,编码计算在本机执行。需要离线运行时,可提前准备完整模型目录,将模型名称替换为本地路径。

候选向量形状应为(4, 384),查询向量形状应为(1, 384):每条文本对应一个384维向量。这里传入的是文本列表,因此即使只有一个查询,也保留了二维形状。batch_size控制每批处理的文本数量,不改变每条向量的维度。

为什么可以用点积计算相似度

余弦相似度是两个向量的点积除以它们长度的乘积,衡量的是方向接近程度。代码设置normalize_embeddings=True,将每个向量做L2归一化,使其长度约为1,因此点积与余弦相似度在浮点误差范围内相等。

如果没有归一化,点积还会受到向量长度影响,不能直接当作余弦相似度。示例中的@执行矩阵与向量的乘法,一次得到所有候选问题的得分,再按分数从高到低排序。

用正例和易混淆反例检查结果

对于当前查询,“忘记登录密码后如何重置?”是应重点检查的正例;“已经登录,如何修改当前密码?”共享密码相关词汇,但操作前提不同;“收不到密码重置邮件怎么办?”涉及同一流程,却对应后续故障;发票问题则作为无关对照。运行后检查这些条目的相对顺序,不预设具体分数。

继续加入“忘记密码且旧邮箱无法使用”“想改密码但仍能登录”等真实表达,逐条确认首位结果是否满足需求。相似度分数不等于答案正确的概率,也没有适用于所有模型和业务的统一阈值。若需要自动答复,应使用带标注的业务样本验证阈值和拒答规则;更换模型或切分方式后,还应重新检查。