正如大多数矢量搜索供应商所宣传的那样,语义搜索系统的基本设计有两个简单的(这很讽刺) 步骤:
您的语义搜索的最终效果取决于您的嵌入模型。但选择模型通常被认为超出了大多数早期采用者的能力范围。所以大家一上来就选择 sentence-transformers/all-MiniLM-L6-v2,并希望得到最好的结果。
然而,这种方法存在的问题要比它所提供的答案还要多:
最初的 Transformer 架构可以看作是一个将输入文本转换为输出文本的黑盒子。但神经网络本身并不理解文本,它们只懂数字——所有内部的转换都是数字形式的。
Transformer 由两个主要模块组成:
因此,在编码器和解码器之间,有一个输入的嵌入表示。输入和嵌入都是数值向量,但它们之间仍然存在显着差异:
几年后,出现不少充满活力的基于 transformer 的不同文本处理模型系列,有两个主要的独立分支:
在上图中,您可以看到 BERT 和 GPT 模型子系列之间的划分。传统上,BERT 后代最常用于语义搜索领域。
BERT 模型似乎非常适合我们的语义搜索问题,因为它可以简化为特定查询的相关和不相关文档的二元分类任务。
但 BERT 嵌入最初并不是为了语义相似性:该模型被训练来预测大型文本语料库上的屏蔽词。事实上,相似的文本具有相似的嵌入,这是一个很好的自然产生的副作用。
但“最初并不是为了语义相似”只是一种观点。有没有办法客观地衡量参考数据集的好坏?
学术论文 “ BEIR:信息检索模型零样本评估的异构基准” 提出了 IR 方法的基准和数据集的参考集。并且使模型质量之争变得不再那么有趣:现在有一个排行榜可以将您的嵌入模型与竞争对手进行比较。
BEIR 基准提出了一组 19 个不同的 IR 数据集和用于搜索质量评估的所有机制。
原始论文还在整个数据集上对几种基线方法进行了基准测试。2021年得出的主要结论是BM25是一个经久不衰的技术和一个强大的基线。
后来 BEIR 被合并到一个更广泛的基准套件中:MTEB,大规模文本嵌入基准。运行它非常简单(如果您有 128GB RAM、现代 GPU 和 8 小时的空闲时间):
from mteb import MTEB
from sentence_transformers import SentenceTransformer
# load the model
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# run a subset of all benchmarks
evaluation = MTEB(tasks=["MSMARCO"])
results = evaluation.run(model, output_folder="results")
就像我们之前聊过的,咱们回到论文的中心思想,“原始的BERT嵌入不能用于语义搜索”。如果我们将 bert-base-uncased(一种语言模型)和顶尖的句子转换模型 all-MiniLM-L6-v2 以及 all-mpnet-base-v2 放在一起,用BEIR/MTEB基准来测试,我们会得到下面这些数字:
从这张表中我们可以得出两个明显的结论:
但是为什么相似的嵌入模型在语义搜索任务中表现会有如此大的不同呢?
当前(2023 年 6 月)的 MTEB/BEIR 基准排行榜看起来充满了不知名的名字:
我们可以通过以下方式总结当前最先进的语义搜索:
我们可以通过构建语义搜索模型的两种哲学的棱镜来看待这四个模型系列:
在大小和性能之间找到平衡对于构建出色的嵌入模型至关重要。
嵌入是进行搜索的多种方式之一。旧的 BM25 仍然是一个强大的基线,并且有一些新的“稀疏”检索方法,例如 SPLADEv2 和 ColBERT - 结合了分词术语搜索和神经网络的优势。
在下面的表格中,我们试图汇总所有公开可得的BEIR分数,这些分数来自以下几个来源:
如果将此表与两年前发布的 BEIR 表进行比较,您可能会注意到 BM25 被认为是一个强大的基线 - 但BM25 在 2023 年不再是明显的赢家。
另一个观察结果是稀疏(例如,ELSER 和 SPLADEv2)和密集(E5)检索方法在质量上非常接近。因此,这个领域没有明显的赢家,但看到如此多的竞争是很棒的。
作者对稀疏与密集检索方法争论的个人看法:
但争论仍在继续,我们将随时向您通报最新动态。
人们普遍认为模型越大,其检索质量就越好。从 MTEB 排行榜上可以清楚地看到这一点,但它忽略了服务这些模型的简单性和廉价性这一重要且实用的特征。
实际上,您需要运行嵌入模型两次:
像 SBERT 和 E5 这样的小型模型可以在合理的延迟预算内轻松地在 CPU 上运行,但如果参数超过 500M(SGPT 的情况),则无法避免使用 GPU。如今 GPU 价格昂贵。
为了查看真实的延迟数字,我们在 https://github.com/shuttie/embed-benchmark 上提供了一个基于 JMH 的小型 ONNX 推理基准:
从表中可以看出:
世界不仅用英语说话,而且大多数模型和评估框架都只关注英语:
如果您向 BERT 分词器提供非英语文本,就会发生这种情况:
from transformers import BertTokenizer, AutoTokenizer
bert = BertTokenizer.from_pretrained("bert-base-uncased")
e5 = AutoTokenizer.from_pretrained('intfloat/multilingual-e5-base')
en = bert.encode("There is not only English language")
print(bert.convert_ids_to_tokens(en))
# ['[CLS]', 'there', 'is', 'not', 'only', 'english', 'language', '[SEP]']
de = bert.encode("Es gibt nicht nur die englische Sprache")
print(bert.convert_ids_to_tokens(de))
# ['[CLS]', 'es', 'gi', '##bt', 'nic', '##ht', 'nur', 'die', 'eng', '##lis', '##che', 'sp', '##rac', '##he', '[SEP]']
de2 = e5.encode("Es gibt nicht nur die englische Sprache")
print(e5.convert_ids_to_tokens(de2))
# ['<s>', '▁Es', '▁gibt', '▁nicht', '▁nur', '▁die', '▁englische', '▁Sprache', '</s>']
BERT 分词器无法将德语单词作为单独的标记正确处理,必须将其拆分为子词。相比之下,多语言 XLM 分词器处理同一个句子要好得多。
幸运的是,本文中提到的大多数模型都有可用的多语言版本:
总结一下,本文的主要结论如下:
本文来源:https://blog.metarank.ai/from-zero-to-semantic-search-embedding-model-592e16d94b61
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。