Sentence-transformers 和标准 BERT 在搜索应用中的作用不同,主要是因为它们生成和使用文本嵌入的方式不同。标准 BERT 专为文本分类或问答等任务而设计,在这些任务中,理解句子中单个单词的上下文至关重要。 但是,它没有针对创建整个句子的密集向量表示(嵌入)进行优化,这些向量可以有效地进行相似度比较。 相比之下,sentence-transformers 是 BERT 的修改版本,专门针对生成高质量的句子嵌入进行了微调。 它们在训练期间使用诸如 Siamese 网络和三重损失之类的技术,以确保语义上相似的句子在嵌入空间中更接近,从而使其更适合用于查找相关文档或将查询与结果匹配之类的搜索任务。
关键的技术区别在于模型如何处理和输出嵌入。 标准 BERT 输出句子中每个 token(词)的嵌入,以及一个特殊的 [CLS]
token 嵌入,该嵌入旨在表示整个句子。 但是,如果没有额外的微调,[CLS]
嵌入本身对于语义相似性没有用。 Sentence-transformers 通过添加一个池化层(例如,平均或最大池化)来解决此问题,该池化层将 token 级别的嵌入聚合为单个句子嵌入。 例如,来自 sentence-transformers 库的 all-MiniLM-L6-v2
这样的模型将 BERT 的 token 输出减少为固定大小的向量(例如,384 维),该向量捕获句子的整体含义。 这种方法在诸如自然语言推理(NLI)或语义文本相似性(STS)之类的数据集上进行训练,在该数据集中,模型学习将相似的句子映射到向量空间中更靠近的位置。
在实践中,sentence-transformers 对于搜索来说更有效率和效用。 例如,如果您正在构建一个推荐系统,那么使用句子嵌入比较数千个产品描述比为每对产品重新运行 BERT 在计算上更便宜。 对于标准 BERT,您需要处理 token 级别的输出或依赖于 [CLS]
token,如果没有特定于任务的训练,它在相似性任务中的表现通常很差。 Sentence-transformers 还支持余弦相似度之类的技术来对结果进行排名,这与搜索引擎的运行方式一致。 例如,像“经济实惠的无线耳机”这样的搜索查询会生成一个嵌入,并且系统会检索嵌入在向量空间中最近似的文档。 这使得 sentence-transformers 成为需要可扩展、准确的语义搜索而无需大量定制的开发人员的实用选择。