AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


​最佳Embedding模型效果对比 - OpenAI / Cohere / Google / E5 / BGE
发布日期:2024-05-23 07:21:57 浏览次数: 4449


导读

Embedding效果对 AI 中的检索至关重要,包括RAG,搜索等场景都会经常涉及。前两天和同事聊起来这个topic,就有了下文

通过阅读本文:

  1. 了解各种Embedding的使用

  2. Embedding效果评估

关注公众号,后台发送"Embedding文档"获取对应文档

多语言embedding模型 深入比较

我们正处于AI领域的一个转折点。

公司越来越多地摆脱仅依赖内部模型,转而向全球领先供应商的开放API(迭代太快,使用方便,成本可控效果好)


OpenAIGoogleCohereAnthropic这样的公司目前主导着这个新的全球LLM市场,旨在解决全球范围内的自然语言处理(NLP)任务。    

与此同时,具有突破性意义的文本 embedding API,对于各种应用至关重要,我们看到巨头之间在提供最佳多语言Embedding服务上展开了一场竞争。


微软采取了一种独特的方法,通过开源名为E5的多语言嵌入模型,从而为竞争环境增添了深度。而北京智源最近推出了一种名为BGE-M3的新的竞争性开源多语言模型。


本文中,将呈现对各种embedding模型的独立性能分析,重点关注它们在多种语言查询中的有效性。


这次比较包括OpenAIGoogleCohere等领先平台,以及表现优异的开源模型,以突显它们在快速发展的AI领域中的相对优势!

待比较的模型 

这次比较中模型包括闭源和开源。

以下是不同模型的概述,以及我如何使用它们的示例。

OpenAI Embeddings

OpenAI 提供了一个用于多语言文本嵌入的封闭式 API。

他们最新的嵌入模型 text-embedding-3-large2024 年 1 月 25 日 发布,是本地多语言的,并支持 256、1024 和 3072 维度。

默认情况下,text-embedding-3-large 返回 3072 维度 的嵌入。    

示例用法:


from openai import OpenAI                import os                


OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "") openai_client = OpenAI(api_key=OPENAI_API_KEY)


def openai_embed(query: str, model="text-embedding-3-large"): query = query.replace("\n", " ") response = openai_client.embeddings.create(input=[query], model=model) embedding = response.data[0].embedding return embedding

用法示例(3072维度)                

embeddings = openai_embed("这是我想要嵌入的文本")

                   

Cohere Embeddings

Cohere 提供了一个用于多语言文本嵌入的封闭式 API。

最新的嵌入模型 embed-multilingual-v3.0 于 2023 年 11 月 2 日发布,它是多语言的,并返回一个具有 1024 维度 的嵌入。

示例用法:


import cohere                


COHERE_API_KEY = os.environ.get("COHERE_API_KEY", "") cohere_client = cohere.Client(COHERE_API_KEY)


def cohere_embed(query: str, model="embed-multilingual-v3.0"): response = cohere_client.embed( texts=[query], input_type="search_query", model=model ) embedding = response.embeddings[0] return embedding Output:

 

例子用法(1024维度)                

embeddings = cohere_embed('This is a text I want to embed')

             
               

Google Embeddings

Google 提供了一个用于多语言文本嵌入的封闭式 API。

他们最新的嵌入模型 text-multilingual-embedding-preview-0409 于 2024 年 4 月 2 日发布预览版,它是多语言的,并返回一个具有 768 维度 的嵌入。

这个版本是对之前的嵌入模型 gecko 系列 textembedding-gecko-multilingual@001 的改进。

示例用法:

from vertexai.preview.language_models import TextEmbeddingModel

               
               

def google_embed(query: str):                    embedder_name = "text-multilingual-embedding-preview-0409"                    model = TextEmbeddingModel.from_pretrained(embedder_name)                    embeddings_list = model.get_embeddings([query])                    embeddings = embeddings_list[0].values                    return embeddings                    Output:Example usage (768 dimensions)embeddings = google_embed("This is a text I want to embed")

           
        
           
微软的 E5 embedding           
           


多语言 E5 是微软研究团队创建的开源多语言嵌入模型。            
           
    
示例用法:           
           
          

from sentence_transformers import SentenceTransformer            


def e5_embed(query: str, model: str): if model not in ['large', 'base', 'small', 'large-instruct']: raise ValueError(f'Invalid model name {model}')


embedder = SentenceTransformer(f'intfloat/multilingual-e5-{model}') if model == 'large-instruct': task = 'Given a short informative text, retrieve relevant topics' query = f'Instruct: {task}\nQuery: {query}'


embeddings = embedder.encode(sentences=[query], convert_to_tensor=False, normalize_embeddings=True) return embeddings

         
        
           
示例用法(768维)            

embeddings = e5_embed('This is a text I want to embed', model='base')

           
BGE-M3           
              

BGE-M3 是由北京人工智能学院创建的开源多语言嵌入模型。            
           
他们最新的嵌入模型 **BGE-M3** 于 2024 年 1 月 30 日发布,它是多语言的,返回一个具有 **1024 维度** 的嵌入。            
           
M3 代表 **M**ulti-linguality(100 多种语言),**M**ulti-granularities(输入长度最长可达 8192),**M**ulti-Functionality(密集、词汇、多向量(colbert)检索的统一)[[source](https://github.com/vespa-engine/pyvespa/blob/master/docs/sphinx/source/examples/mother-of-all-embedding-models-cloud.ipynb)]。  
         
           
示例用法:            
           
          

from FlagEmbedding import BGEM3FlagModel            


def bge_m3_embed(query: str): # 可以添加 "use_fp16=True" 来加速预测 model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=False) embeddings = model.encode([query])['dense_vecs'][0] return embeddings

         

例子用法(1024维度)            

embeddings = bge_m3_embed("这是我想要嵌入的文本")  

         
           


评估embedding质量 

句子嵌入的目的是将整个句子的语义含义封装到密集的向量表示中,有效地将单词及其上下文含义转换为计算机可以理解的数字形式。

实质上,embedding 只是句子的数值表示,其中具有相似含义的句子在向量空间中被放置在紧密的位置。

这意味着我们可以通过嵌入具有语义含义相似的句子并测量这些嵌入相对于彼此的接近程度来评估嵌入模型的质量。

为了说明这个概念,让我们考虑以下两个句子:

1."今天天气寒冷多风。"

2."今天是个寒冷多风的日子。"

这两个句子传达了非常相似的含义,描述了天气条件为寒冷并伴有一些风。理想情况下,嵌入这两个句子应该得到非常相似的向量。

为了了解这些嵌入的有效性或质量,关键是要检查我们如何测量它们之间的距离或相似性,这就是 距离函数 发挥作用的地方。

我们可以使用多种距离函数,每种都有其特定的用途。

以下是一些最广泛使用的距离函数列表:    

欧氏距离:计算向量空间中两点之间的直线距离。它对向量的大小敏感,较小的距离表示更大的相似性。

曼哈顿距离:通过在直角网格中移动来计算两个坐标之间的距离(不是最快的路径)。它通过对每个维度中坐标的绝对差值求和来计算。

余弦相似度:计算两个向量之间的夹角的余弦,侧重于方向而不是大小。它非常适合评估文本中的语义相似性,因为它评估了嵌入的方向性。接近1的值表示高相似性。接近0或负值表示低到无相似性,负值表示相反的含义。

   

   

尽管欧氏距离最初似乎是最合乎逻辑的选择,但它在高维空间中面临着重大挑战。这一困难来自一个被称为“维度诅咒”的现象。

对于文本数据之间的语义相似性的测量,余弦相似度通常是三种方法中最受欢迎的方法,主要是因为它不依赖于向量大小。 具体参见:推荐系统中的相似度度量

这一优势源于余弦相似度计算两个向量之间的夹角的余弦,侧重于向量指向的方向而不是它们的长度。

余弦相似度有效地对向量大小进行了归一化,特别适用于比较长度和内容密度不同的文本。

   

因此,我们的评估将利用余弦相似度来评估我们的嵌入的性能。

我们将向我们的评估模块传递一系列多语言句子,以确定提供最佳性能的嵌入模型 - 即最准确捕捉不同语言环境中语义关系的模型。


评估数据集 

我创建了一个主题数据集,我们可以用来进行评估。

该数据集包括50个不同主题下的200个句子(其中一些主题密切相关)。

以下是数据集中的一些示例:

帆船和划船:许多人在水上感到宁静的慰藉。

全球经济:主要经济体之间的贸易紧张局势继续影响全球市场。

美国股市:华尔街的指数反映了美国企业和经济健康状况。

书评:发现畅销书和隐藏的珍宝的最新书评。

宗教和灵性:许多人在他们的宗教信仰中寻找安慰和指引。

用于编码和软件开发的人工智能:人工智能在软件开发中的应用正在彻底改变这个行业。


我使用GPT4将数据集翻译成多种语言:英语 ?? , 西班牙语 ?? , 法语 ?? , 德语 ?? , 俄语 ?? , 荷兰语 ?? , 葡萄牙语 ?? , 挪威语 ?? , 瑞典语 ?? , 芬兰语 ?? 。

主题数据集

基于排名的评估 Top N 

在我展示最终评估结果之前,应该清楚地解释显示的指标。

累积匹配特征(CMC)曲线是一种直观的方式,展示了嵌入模型在各种情况下的表现如何。    

这条曲线在展示模型预测的可能性方面起着关键作用(在这种情况下,与给定查询匹配的嵌入将落在前 N 名结果中)。

考虑一个例子,你被呈现了200个句子,并被要求基于它们与50个主题的相关性对每个句子进行排名。

我们可以通过观察分配给正确主题的排名来评估精度。将正确主题放在第1名的预测表现出优秀的排名精度,而将正确主题放在第50名的预测表现出最差的性能。

我们可以迭代 N,其中 1 ≤ N ≤ 50,以计算在前 N 个最佳匹配主题中预测到正确主题的概率。

为了将其付诸实践,让我们考虑以下使用Python的示例实现:

for N inrange(1, 51):  # 从1开始,一直到包括50                correct_topics = []                for query, target_topic inzip(queries, topics):                    sim = cosine_similarity(query, topics)                    sim_sorted_idx = sim.argsort()                    topics_ordered = [topics[i] for i in sim_sorted_idx]                    top_N = topics_ordered[-N:]                    correct_topics.append(1 if target_topic in top_N else0)                CMC_score = round(sum(correct_topics) / len(correct_topics), 3)                print(f"Top {N} CSC_score: {CMC_score}")

在这段代码中,queries代表我们的句子,topics代表每个句子可能相关的主题。函数cosine_similarity衡量了每个句子与可能主题之间的相似性。对于指定范围内的每个 N,我们计算了一个从0到1的分数,其中1表示在前 N 个匹配中准确预测目标主题的足够准确性。

为了说明累积匹配特征的外观,让我们看一个关于multilingual-e5-small瑞典语中的示例:    

从图中我们可以得出,大约95%的句子在前4个位置上有其正确的主题排名 - 因为当 N=4 时,蓝线超过了0.95。

正如你可能已经理解的那样,精度只能在较大的 N 值上提高(因为它增加了包含目标主题的机会)。

我们可以通过添加multilingual-e5-large来扩展这个图表,这应该是一个性能更好的模型。

让我们看看它是什么样子的:

   

如预期的那样,multilingual-e5-large(红线)高于multilingual-e5-small(蓝线) - 表明在所有 N 值上性能更好。


错误率评估 

除了CMC曲线之外,我们还可以通过计算平均精度均值(MAP)来可视化成功率的条形图。

然而,为了可视化错误率,我们可以计算MAP的倒数,逆平均精度均值(IMAP),这实质上给了我们一个侧重于模型错误而不是成功的指标。

IMAP自然是一个小数,因为所有可能的N值的平均性能接近1。我们可以通过一个因子1000来缩放错误率,以便将其缩放为更具可比性的数字 - 使比较更容易。

IMAP的计算如下:

MAP = avg(cmc_score)              scale_rate = 1000  # 为了更容易比较数字              IMAP = (1 - MAP) * scale_rate  # 也被称为“错误率”

请记住,在显示错误率时,接近0的值表示更好的性能。

为了说明逆平均精度均值是什么样子,让我们再次看看我们的示例,使用多语言-e5-small多语言-e5-large来进行瑞典语

   

正如我们所看到的,图表显示了每个嵌入模型的累积错误。如预期的那样,多语言-e5-large的错误率低于其较小的兄弟多语言-e5-small - 这表明多语言-e5-large是更好的瑞典语整体模型。

现在我们了解了CMCIMAP这两个指标,让我们跳到结果。

结果 

我们的调查涉及多种语言(英语 ??,西班牙语 ??,法语 ??,德语 ??,俄语 ??,荷兰语 ??,葡萄牙语 ??,挪威语 ??,瑞典语 ??和芬兰语 ??)。

本研究使用了累积匹配特征曲线和逆均值平均精度率,这些方法在前面的章节中有描述,用于衡量我们的模型表现如何。

让我们来看看当我们将它们在所有语言中进行平均时的这些指标!


累积匹配特性(CMC)曲线

较高的CMC曲线表示性能更优越。从图中可以看出,最差的嵌入模型和最佳模型之间有明显的区别。

现在,让我们结合图中所有N值的分数,并计算IMAP(错误率)。    


逆均值平均精度(错误率)

为了获得额外的见解,并可能可视化异常情况,让我们将每种语言的错误率进行可视化。

每种语言的逆均值平均精度(错误率)

解释

我们的调查旨在确定在所选语言中排名前列的嵌入模型。

最初,我们发现 OpenAI,Google,E5-InstructCohere 从竞争中脱颖而出,其中 OpenAI 在所有语言中的平均错误率较低,略胜一筹。

在对各个语言表现进行更仔细的检查后,情况变得更加复杂。    

Cohere 在几种语言中成为顶尖模型,在测试的一半语言中超越其他模型。然而,它在葡萄牙语中表现不佳,这促使我们更广泛地审视模型表现的一致性。

以下是每种语言中表现最佳的模型的快照:

尽管 Cohere 在某些语言中表现良好,但一个最佳的多语言嵌入模型应该在广泛的多样化语言范围内展现出一致的结果。

OpenAI 通过其在我们的分析中保持稳定的表现来体现了这种一致性。这表明 OpenAI 擅长创建强大的、普遍适用的嵌入。

然而,值得注意的是,主题数据集是由 GPT4(由 OpenAI 开发)生成的,这可能在使用 OpenAI 的嵌入模型时引入性能偏差。话虽如此,如上表所示,Cohere 在大多数语言中仍然优于 OpenAI。

这一观察结果表明,在未来的分析中包含更多的语言可能会进一步突出模型的优势,强调它们在广泛的语言范围内的适应性和可扩展性的重要性。    

结论 

这项分析揭示了多语言嵌入技术的复杂景观。

虽然 OpenAI、Google 和 Cohere 在专有大型语言模型领域是领先力量,但这项分析展示了它们在多语言嵌入生成方面的最新性能。

特别值得注意的是 OpenAI 在各种语言上的稳定性,Cohere 在一些语言中的强劲表现,以及 Google 在小型嵌入维度下的整体性能。

此外,开源模型如 E5-Instruct 和 BGE-M3 的影响不可低估。这些模型不仅丰富了竞争格局,而且展示了社区驱动创新在人工智能中的潜力。

我要向微软的 E5 模型研究团队以及北京人工智能学院的 BGE-M3 表示感谢。他们的重要贡献丰富了竞争格局。             

 

    


关注公众号,后台发送"Embedding文档"获取对应文档


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询