服装设计网站有哪些推荐中铁建设集团有限公司招标网
服装设计网站有哪些推荐,中铁建设集团有限公司招标网,西安+美院+网站建设,昆山市建设局网站6原文地址#xff1a;OpenAI vs Open-Source Multilingual Embedding Models
选择最适合您的数据的模型
2024 年 2 月 25 日
OpenAI最近发布了他们的新一代embedding模型#xff0c;称为embeddingv3#xff0c;他们描述是他们性能最好的embedding模型#xff0c;具有更高…原文地址OpenAI vs Open-Source Multilingual Embedding Models
选择最适合您的数据的模型
2024 年 2 月 25 日
OpenAI最近发布了他们的新一代embedding模型称为embeddingv3他们描述是他们性能最好的embedding模型具有更高的多语言性能。这些模型分为两类:较小的称为text-embeddings-3-small较大且功能更强大的称为text-embeddings-3-large。
有关这些模型的设计和训练方式的信息披露得很少。正如他们之前发布的embedding模型(2022年12月与ada-002模型类)一样OpenAI再次选择了一种闭源方法其中模型只能通过付费API访问。
但这些性能真的值得花钱去看吗?
这篇文章的动机是将这些新模型与开源模型的性能进行实证比较。我们将依赖于一个数据检索工作流在这个工作流中必须根据用户查询找到语料库中最相关的文档。
我们的语料库将是欧洲人工智能法案该法案目前处于验证的最后阶段。这个语料库除了是世界上第一个关于人工智能的法律框架外还有一个有趣的特点那就是它有24种语言版本。这使得比较不同语言族的数据检索的准确性成为可能。
这篇文章将通过以下两个主要步骤:
从多语言文本语料库生成自定义合成问题/答案数据集在此自定义数据集上比较OpenAI和最先进的开源embedding模型的准确性。 重现本文中呈现的结果的代码和数据可以在这个Github存储库中获得。请注意本文以欧盟人工智能法案为例本文所采用的方法可以适用于其他数据语料库。
生成自定义Q/A数据集
让我们首先从生成自定义数据的问答(Q/ a)数据集开始该数据集将用于评估不同embedding模型的性能。生成自定义Q/ a数据集的好处是双重的。首先它通过确保数据集没有成为embedding模型训练的一部分来避免偏差这可能发生在参考基准上如MTEB。其次它允许将评估调整为特定的数据语料库这可能与检索增强应用程序(RAG)等情况相关。
我们将遵循LlamaIndex在他们的文档中建议的简单流程。语料库首先被分成一组块。然后对于每个分块通过大型语言模型(large language model, LLM)生成一组合成问题使答案位于相应的分块中。这个过程说明如下: 为您的数据生成问题/答案数据集方法来自LlamaIndex
使用Llama Index之类的LLM数据框架实现此策略非常简单。可以使用高级函数方便地加载语料库和分割文本如下面的代码所示。 1
2
3
4
5
6
7
8
9
10from llama_index.readers.web import SimpleWebPageReader
from llama_index.core.node_parser import SentenceSplitterlanguage EN
url_doc https://eur-lex.europa.eu/legal-content/language/TXT/HTML/?uriCELEX:52021PC0206documents SimpleWebPageReader(html_to_textTrue).load_data([url_doc])parser SentenceSplitter(chunk_size1000)
nodes parser.get_nodes_from_documents(documents, show_progressTrue)在这个例子中语料库是欧盟人工智能法案的英文版本直接取自Web使用这个官方URL。我们使用2021年4月的草案版本因为最终版本尚未适用于所有欧洲语言。在这个版本中可以用其他23种欧盟官方语言中的任何一种语言替换URL中的英语以检索不同语言的文本(BG表示保加利亚语ES表示西班牙语CS表示捷克语等等)。 下载欧盟24种官方语言的欧盟人工智能法案链接(来自欧盟官方网站)
我们使用SentenceSplitter对象将文档分成每1000个令牌的块。对于英语来说这导致大约100个块。
然后将每个块作为上下文提供给以下提示符(Llama Index库中建议的默认提示符): 1
2
3
4
5
6
7
8
9
10
11
12
13prompts{}
prompts[EN] \
Context information is below.---------------------
{context_str}
---------------------Given the context information and not prior knowledge, generate only questions based on the below query.You are a Teacher/ Professor. Your task is to setup {num_questions_per_chunk} questions for an upcoming quiz/examination.
The questions should be diverse in nature across the document. Restrict the questions to the context information provided.提示旨在生成关于文档块的问题就好像老师正在准备即将到来的测验一样。要为每个数据块生成的问题数量作为参数num_questions_per_chunk传递我们将其设置为2。然后可以通过调用LlamaIndex库中的generate_qa_embedding_pairs来生成问题: 1
2
3
4
5
6
7
8
9from llama_index.llms import OpenAI
from llama_index.legacy.finetuning import generate_qa_embedding_pairsqa_dataset generate_qa_embedding_pairs(llmOpenAI(modelgpt-3.5-turbo-0125,additional_kwargs{seed:42}),nodesnodes,qa_generate_prompt_tmpl prompts[language],num_questions_per_chunk2
)我们依靠OpenAI的GPT-3.5-turbo-0125模式来完成这项任务该模式是OpenAI该系列的旗舰模型支持16K上下文窗口并针对对话进行了优化(https://platform.openai.com/docs/models/gpt-3-5-turbo。
结果对象’ qa_dataset ‘包含问题和答案(块)对。作为生成问题的示例以下是前两个问题的结果(其中“答案”是文本的第一部分): 根据解释性备忘录制定人工智能协调规则(人工智能法案)的法规提案的主要目标是什么?如上下文信息所述人工智能法规提案如何旨在解决与使用人工智能相关的风险同时促进欧盟对人工智能的采用? Chunks和问题的数量取决于语言英语大约有100个chunks和200个问题匈牙利语有200个chunks和400个问题。
OpenAI embedding模型的评价
我们的评估函数遵循LlamaIndex文档由两个主要步骤组成。首先所有答案(文档chunks)的嵌入都存储在VectorStoreIndex中以便有效检索。然后评估函数循环遍历所有查询检索前k个最相似的文档并根据MRR评估检索的准确性(Mean Reciprocal Rank)。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36def evaluate(dataset, embed_model, insert_batch_size1000, top_k5):# Get corpus, queries, and relevant documents from the qa_dataset objectcorpus dataset.corpusqueries dataset.queriesrelevant_docs dataset.relevant_docs# Create TextNode objects for each document in the corpus and create a VectorStoreIndex to efficiently store and retrieve embeddingsnodes [TextNode(id_id_, texttext) for id_, text in corpus.items()]index VectorStoreIndex(nodes, embed_modelembed_model, insert_batch_sizeinsert_batch_size)retriever index.as_retriever(similarity_top_ktop_k)# Prepare to collect evaluation resultseval_results []# Iterate over each query in the dataset to evaluate retrieval performancefor query_id, query in tqdm(queries.items()):# Retrieve the top_k most similar documents for the current query and extract the IDs of the retrieved documentsretrieved_nodes retriever.retrieve(query)retrieved_ids [node.node.node_id for node in retrieved_nodes]# Check if the expected document was among the retrieved documentsexpected_id relevant_docs[query_id][0]is_hit expected_id in retrieved_ids # assume 1 relevant doc per query# Calculate the Mean Reciprocal Rank (MRR) and append to resultsif is_hit:rank retrieved_ids.index(expected_id) 1mrr 1 / rankelse:mrr 0eval_results.append(mrr)# Return the average MRR across all queries as the final evaluation metricreturn np.average(eval_results)Embedding模型通过embed_model参数传递给评估函数对于OpenAI模型该参数是一个用模型名称和模型维度初始化的OpenAI Embedding对象。 1
2
3
4from llama_index.embeddings.openai import OpenAIEmbeddingembed_model OpenAIEmbedding(modelmodel_spec[model_name],dimensionsmodel_spec[dimensions])dimensions API参数可以缩短嵌入(即从序列的末尾删除一些数字)而不会失去embedding的概念表示属性。例如OpenAI建议在他们的公告中在MTEB基准测试中embedding可以缩短到256的大小同时仍然优于未缩短的1536大小的text-embedt-ada-002embedding。
我们在四种不同的OpenAIembedding模型上运行评估函数:
两个版本的text-embeddings-3-large:一个具有最低可能维度(256)另一个具有最高可能维度(3072)。它们被称为OAI-large-256和OAI-large-3072。OAI-small:text-embedding-3-small embedding模型维度为1536。OAI-ada-002:传统的text-embedding-ada-002模型维度为1536。
每个模型在四种不同的语言上进行评估:英语(EN)法语(FR)捷克语(CS)和匈牙利语(HU)分别涵盖日耳曼语罗曼语斯拉夫语和乌拉尔语的例子。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32embeddings_model_spec {
}embeddings_model_spec[OAI-Large-256]{model_name:text-embedding-3-large,dimensions:256}
embeddings_model_spec[OAI-Large-3072]{model_name:text-embedding-3-large,dimensions:3072}
embeddings_model_spec[OAI-Small]{model_name:text-embedding-3-small,dimensions:1536}
embeddings_model_spec[OAI-ada-002]{model_name:text-embedding-ada-002,dimensions:None}results []languages [EN, FR, CS, HU]# Loop through all languages
for language in languages:# Load datasetfile_namelanguage_dataset.jsonqa_dataset EmbeddingQAFinetuneDataset.from_json(file_name)# Loop through all modelsfor model_name, model_spec in embeddings_model_spec.items():# Get modelembed_model OpenAIEmbedding(modelmodel_spec[model_name],dimensionsmodel_spec[dimensions])# Assess embedding score (in terms of MRR)score evaluate(qa_dataset, embed_model)results.append([language, model_name, score])df_results pd.DataFrame(results, columns [Language ,Embedding model, MRR])所得的MRR精度报告如下: OpenAI模型的性能总结
正如预期的那样对于大型模型embedding尺寸3072越大性能越好。与小型和遗留的Ada模型相比大型模型比我们预期的要小。为了比较我们还在下面报告了OpenAI模型在MTEB基准测试上获得的性能。 OpenAI embedding模型的性能详见官方公告
有趣的是与MTEB基准测试相比大型、小型和Ada模型之间的性能差异在我们的评估中远没有那么明显这反映了这样一个事实即在大型基准测试中观察到的平均性能不一定反映在定制数据集上获得的性能。
开源embedding模型的评估
围绕嵌入的开源研究相当活跃并且定期发布新的模型。了解最新发布的模型的一个好地方是hug Face..MTEB排行榜。
为了在本文中进行比较我们选择了最近发表的(2024)四个embedding模型。选择的标准是他们在MTEB排行榜上的平均得分和他们处理多语言数据的能力。所选模型的主要特性摘要如下。
Embedding modelEmbedding sizeContext sizeSize (GB)MTEB Rank (Feb 24)Release datee5-mistral-7b-instruct40963276814404/01/2024multilingual-e5-large-instruct10245141.121008/02/2024BGE-M3102481922.27NA29/01/2024nomic-embed-text-v176881920.552210/02/2024
选择开源embedding模型
*E5- mistral-7b- instruction * (E5-mistral-7b):微软的E5embedding模型是从Mistral-7B-v0.1初始化的并在多语言数据集的混合上进行微调。该型号在MTEB排行榜上表现最好但也是迄今为止最大的(14GB)。*multilingual- E5-large - directive * (ML-E5-large):微软的另一个E5模型旨在更好地处理多语言数据。它从xlm-roberta-large初始化并在多语言数据集的混合上进行训练。它比E5-Mistral小得多(10倍)但上下文大小也小得多(514)。*BGE-M3*:该模型由北京人工智能研究院设计是他们最先进的多语言数据embedding模型支持100多种工作语言。截至2024年2月22日它还没有进入MTEB排行榜。*** Nomic- embed-text-v1*** (Nomic- embed):该模型由Nomic设计声称性能优于OpenAI Ada-002和text- embeding3 -small而大小仅为0.55GB。有趣的是该模型是第一个完全可复制和可审计的(开放数据和开源训练代码)。
用于评估这些开源模型的代码类似于用于OpenAI模型的代码。主要的变化在于模型规范其中必须指定诸如最大上下文长度和池类型之类的附加细节。然后我们对四种语言中的每一种模型进行评估: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46embeddings_model_spec {
}embeddings_model_spec[E5-mistral-7b]{model_name:intfloat/e5-mistral-7b-instruct,max_length:32768, pooling_type:last_token, normalize: True, batch_size:1, kwargs: {load_in_4bit:True, bnb_4bit_compute_dtype:torch.float16}}
embeddings_model_spec[ML-E5-large]{model_name:intfloat/multilingual-e5-large,max_length:512, pooling_type:mean, normalize: True, batch_size:1, kwargs: {device_map: cuda, torch_dtype:torch.float16}}
embeddings_model_spec[BGE-M3]{model_name:BAAI/bge-m3,max_length:8192, pooling_type:cls, normalize: True, batch_size:1, kwargs: {device_map: cuda, torch_dtype:torch.float16}}
embeddings_model_spec[Nomic-Embed]{model_name:nomic-ai/nomic-embed-text-v1,max_length:8192, pooling_type:mean, normalize: True, batch_size:1, kwargs: {device_map: cuda, trust_remote_code : True}}results []languages [EN, FR, CS, HU]# Loop through all models
for model_name, model_spec in embeddings_model_spec.items():print(Processing model : str(model_spec))# Get modeltokenizer AutoTokenizer.from_pretrained(model_spec[model_name])embed_model AutoModel.from_pretrained(model_spec[model_name], **model_spec[kwargs])if model_nameNomic-Embed:embed_model.to(cuda)# Loop through all languagesfor language in languages:# Load datasetfile_namelanguage_dataset.jsonqa_dataset EmbeddingQAFinetuneDataset.from_json(file_name)start_time_assessmenttime.time()# Assess embedding score (in terms of hit rate at k5)score evaluate(qa_dataset, tokenizer, embed_model, model_spec[normalize], model_spec[max_length], model_spec[pooling_type])# Get duration of score assessmentduration_assessment time.time()-start_time_assessmentresults.append([language, model_name, score, duration_assessment])df_results pd.DataFrame(results, columns [Language ,Embedding model, MRR, Duration])以MRR表示的结果准确性报告如下。 开源模型的性能总结
BGE-M3的性能最好其次是ML-E5-Large、E5-mistral-7b和Nomic-Embed。BGE-M3模型尚未在MTEB排行榜上进行基准测试我们的结果表明它可能比其他模型排名更高。值得注意的是虽然BGE-M3针对多语言数据进行了优化但它在英语方面的表现也比其他模型更好。
我们还在下面报告了每个embedding模型的处理时间。 以秒为单位浏览英文问答数据集的处理时间
E5-mistral-7b比其他型号大10倍以上毫无疑问是迄今为止最慢的型号。
结论
让我们把八个测试型号的性能并排放在一个数字中。 八个测试模型的性能总结
这些结果的主要观察结果是:
采用开源模型获得最佳性能。由北京人工智能研究院开发的BGE-M3模型成为表现最好的模型。该模型具有与OpenAI模型相同的上下文长度(8K)大小为2.2GB。OpenAI范围内的一致性。大型(3072)、小型和传统OpenAI模型的性能非常相似。然而减少大型模型(256)的embedding大小会导致性能的下降。语言敏感性。几乎所有型号(ML-E5-large除外)在英语上表现最好。在捷克语和匈牙利语等语言中人们的性能存在显著差异。
因此你是应该付费订阅OpenAI还是托管一个开源embedding模型?
OpenAI最近的价格调整使得他们的API变得更加实惠现在每百万代币的成本为0.13美元。因此每月处理一百万个查询(假设每个查询涉及大约1K令牌)的成本约为130美元。因此根据您的用例租用和维护您自己的embedding服务器可能不符合成本效益。
然而成本效益并不是唯一的考虑因素。可能还需要考虑延迟、隐私和对数据处理工作流的控制等其他因素。开源模型提供了完全数据控制的优势增强了隐私性和定制性。另一方面OpenAI的API也存在延迟问题有时会导致响应时间延长。
总之在开源模型和像OpenAI这样的专有解决方案之间做出选择并不是一个简单的答案。开源嵌入提供了一个引人注目的选择它将性能与对数据的更好控制结合在一起。相反OpenAI的产品可能仍然会吸引那些优先考虑便利性的人特别是如果隐私问题是次要的。
引用
Companion Github repository: GitHub - Yannael/multilingual-embeddingsEverything you wanted to know about sentence embeddings (and maybe a bit more)OpenAI blog announcement: New embedding models and API updatesEmbeddings: OpenAI guideMTEB: Massive Text Embedding Benchmark and Hugging Face MTEB leaderboardText Embeddings: Comprehensive GuideA Practitioners Guide to Retrieval Augmented Generation (RAG)How to Find the Best Multilingual Embedding Model for Your RAG
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89823.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!