ホームページ  >  記事  >  テクノロジー周辺機器  >  データに最適なエンベディング モデルの選択: OpenAI とオープンソースの多言語エンベディングの比較テスト

データに最適なエンベディング モデルの選択: OpenAI とオープンソースの多言語エンベディングの比較テスト

WBOY
WBOY転載
2024-02-26 18:10:15595ブラウズ

OpenAI は最近、最新世代の埋め込みモデル embedding v3 のリリースを発表しました。これは、より高い多言語パフォーマンスを備えた最もパフォーマンスの高い埋め込みモデルであると主張しています。このモデルのバッチは、小さい text-embeddings-3-small と、より強力で大きい text-embeddings-3-large の 2 つのタイプに分類されます。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

これらのモデルがどのように設計され、トレーニングされるかについてはほとんど情報が公開されておらず、モデルには有料 API を介してのみアクセスできます。オープンソースの組み込みモデルは数多くありますが、これらのオープンソース モデルは OpenAI のクローズド ソース モデルとどう違うのでしょうか?

この記事では、これらの新しいモデルのパフォーマンスをオープンソース モデルと実証的に比較します。私たちは、ユーザーのクエリに基づいてコーパスから最も関連性の高いドキュメントを見つけることが主要なタスクとなるデータ検索ワークフローを構築する予定です。

私たちのコーパスは欧州人工知能法であり、現在検証段階にあります。このコーパスは、人工知能に関連する世界初の法的枠組みであり、24 の言語で利用できるという点でユニークです。これにより、さまざまな言語背景でのデータ検索の精度を比較できるようになり、人工知能の異文化適用に重要なサポートが提供されます。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

多言語テキスト コーパスを使用してカスタムの合成質問/回答データセットを作成し、このデータセットを使用して OpenAI を最新の状態と比較する予定です。 the-art オープンソースの埋め込みモデルの精度。私たちのアプローチは他のデータ コーパスにも簡単に適用できるため、完全なコードを共有します。

カスタム Q/A データ セットの生成

まず、カスタムの質問と回答 (Q/A) データを作成することから始めます。これを行う利点は、データ セットがモデル トレーニングのバイアス要因にならないようにし、MTEB などのベンチマーク参照で発生する可能性のある状況を回避できることです。さらに、カスタム データセットを生成することで、特定のデータ コーパスに合わせて評価プロセスを調整できます。これは、検索拡張アプリケーション (RAG) などのシナリオで重要になる可能性があります。

Llama Index ドキュメントで提案されている簡単なプロセスに従います。まず、コーパスがチャンクに分割されます。次に、ブロックごとに、大規模言語モデル (LLM) を使用して一連の合成質問を生成し、答えが対応するブロック内にあることを確認します。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

Llama Index のような LLM データ フレームを使用してこの戦略を実装するのは、以下のコードに示すように非常に簡単です。

from llama_index.readers.web import SimpleWebPageReader from llama_index.core.node_parser import SentenceSplitter  language = "EN" url_doc = "https://eur-lex.europa.eu/legal-content/"+language+"/TXT/HTML/?uri=CELEX:52021PC0206"  documents = SimpleWebPageReader(html_to_text=True).load_data([url_doc])  parser = SentenceSplitter(chunk_size=1000) nodes = parser.get_nodes_from_documents(documents, show_progress=True)

コーパスは EU 人工知能法の英語版であり、この公式 URL を使用して Web から直接取得されます。最終バージョンはまだすべてのヨーロッパ言語で利用可能ではないため、この記事では 2021 年 4 月のドラフト バージョンを使用します。そのため、私たちが選択したバージョンでは、URL 内の言語を他の 23 の EU の公式言語に置き換えることができ、さまざまな言語 (ブルガリア語の BG、スペイン語の ES、チェコ語の CS など) でテキストを取得できます。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

SentenceSplitter オブジェクトを使用して、ドキュメントを 1000 トークンごとのチャンクに分割します。英語の場合、これにより約 100 のチャンクが生成されます。各ブロックは、次のプロンプト (Llama Index ライブラリで提案されているデフォルトのプロンプト) へのコンテキストとして提供されます。

prompts={} 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 に設定します。その後、Llama Index ライブラリのgenerate_qa_embedding_pairsを呼び出すことで質問を生成できます:

from llama_index.llms import OpenAI from llama_index.legacy.finetuning import generate_qa_embedding_pairs  qa_dataset = generate_qa_embedding_pairs(llm=OpenAI(model="gpt-3.5-turbo-0125",additional_kwargs={'seed':42}),nodes=nodes,qa_generate_prompt_tmpl = prompts[language],num_questions_per_chunk=2 )

我们依靠OpenAI的GPT-3.5-turbo-0125来完成这项任务,结果对象' qa_dataset '包含问题和答案(块)对。作为生成问题的示例,以下是前两个问题的结果(其中“答案”是文本的第一部分):

  1. What are the main objectives of the proposal for a Regulation laying down harmonised rules on artificial intelligence (Artificial Intelligence Act) according to the explanatory memorandum?
  2. How does the proposal for a Regulation on artificial intelligence aim to address the risks associated with the use of AI while promoting the uptake of AI in the European Union, as outlined in the context information?

OpenAI嵌入模型

评估函数也是遵循Llama Index文档:首先所有答案(文档块)的嵌入都存储在VectorStoreIndex中,以便有效检索。然后评估函数循环遍历所有查询,检索前k个最相似的文档,并根据MRR (Mean Reciprocal Rank)评估检索的准确性,代码如下:

def evaluate(dataset, embed_model, insert_batch_size=1000, top_k=5):# 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_, text=text) for id_, text in corpus.items()]index = VectorStoreIndex(nodes, embed_model=embed_model, insert_batch_size=insert_batch_size)retriever = index.as_retriever(similarity_top_k=top_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)

嵌入模型通过' embed_model '参数传递给评估函数,对于OpenAI模型,该参数是一个用模型名称和模型维度初始化的OpenAIEmbedding对象。

from llama_index.embeddings.openai import OpenAIEmbedding  embed_model = OpenAIEmbedding(model=model_spec['model_name'],dimensinotallow=model_spec['dimensions'])

dimensions参数可以缩短嵌入(即从序列的末尾删除一些数字),而不会失去嵌入的概念表示属性。OpenAI在他们的公告中建议,在MTEB基准测试中,嵌入可以缩短到256大小,同时仍然优于未缩短的text-embedding-ada-002嵌入(大小为1536)。

我们在四种不同的嵌入模型上运行评估函数:

两个版本的text-embedding-3-large:一个具有最低可能维度(256),另一个具有最高可能维度(3072)。它们被称为“OAI-large-256”和“OAI-large-3072”。

OAI-small:text-embedding-3-small,维数为1536。

OAI-ada-002:传统的文本嵌入text-embedding-ada-002,维度为1536。

每个模型在四种不同的语言上进行评估:英语(EN),法语(FR),捷克语(CS)和匈牙利语(HU),分别涵盖日耳曼语,罗曼语,斯拉夫语和乌拉尔语的例子。

embeddings_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_name=language+"_dataset.json"qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name) # Loop through all modelsfor model_name, model_spec in embeddings_model_spec.items(): # Get modelembed_model = OpenAIEmbedding(model=model_spec['model_name'],dimensinotallow=model_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 和开源多语言嵌入的对比测试

嵌入尺寸越大,性能越好。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

开源嵌入模型

围绕嵌入的开源研究也是非常活跃的,Hugging Face 的 MTEB leaderboard会经常发布最新的嵌入模型。

为了在本文中进行比较,我们选择了一组最近发表的四个嵌入模型(2024)。选择的标准是他们在MTEB排行榜上的平均得分和他们处理多语言数据的能力。所选模型的主要特性摘要如下。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

e5-mistral-7b-instruct:微软的这个E5嵌入模型是从Mistral-7B-v0.1初始化的,并在多语言混合数据集上进行微调。模型在MTEB排行榜上表现最好,但也是迄今为止最大的(14GB)。

multilingual-e5-large-instruct(ML-E5-large):微软的另一个E5模型,可以更好地处理多语言数据。它从xlm-roberta-large初始化,并在多语言数据集的混合上进行训练。它比E5-Mistral小得多(10倍),上下文大小也小得多(514)。

BGE-M3:该模型由北京人工智能研究院设计,是他们最先进的多语言数据嵌入模型,支持100多种工作语言。截至2024年2月22日,它还没有进入MTEB排行榜。

nomic-embed-text-v1 (Nomic- embed):该模型由Nomic设计,其性能优于OpenAI Ada-002和text-embedding-3-small,而且大小仅为0.55GB。该模型是第一个完全可复制和可审计的(开放数据和开源训练代码)的模型。

用于评估这些开源模型的代码类似于用于OpenAI模型的代码。主要的变化在于模型参数:

embeddings_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_name=="Nomic-Embed":embed_model.to('cuda') # Loop through all languagesfor language in languages: # Load datasetfile_name=language+"_dataset.json"qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name) start_time_assessment=time.time() # Assess embedding score (in terms of hit rate at k=5)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_assessment results.append([language, model_name, score, duration_assessment])  df_results = pd.DataFrame(results, columns = ["Language" ,"Embedding model", "MRR", "Duration"])

結果は次のとおりです。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

BGE-M3 が最高のパフォーマンスを示し、次に ML-E5-Large、E5- が続きました。 misstral-7b および Nomic-Embed。 BGE-M3 モデルはまだ MTEB ランキングでベンチマークされておらず、当社の結果は他のモデルよりも上位にランクされる可能性があることを示しています。 BGE-M3 は多言語データ用に最適化されていますが、英語でも他のモデルよりも優れたパフォーマンスを発揮します。

オープンソース モデルは一般にローカルで実行する必要があるため、各組み込みモデルの処理時間も意図的に記録しました。

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

E5-mistral-7b は他のモデルに比べて 10 倍以上大きいため、最も遅いのが通常です

概要

すべての結果を要約します

选择最适合数据的嵌入模型:OpenAI 和开源多语言嵌入的对比测试

オープンソース モデルを使用して取得しました最高のパフォーマンスを得るには、BGE-M3 モデルが最高のパフォーマンスを発揮しました。このモデルは OpenAI モデルと同じコンテキスト長 (8K) を持ち、サイズは 2.2GB です。

OpenAI のラージ (3072)、スモール、ADA モデルのパフォーマンスは非常に似ています。大きい (256) の埋め込みサイズを減らすとパフォーマンスが低下し、OpenAI が言うほどの ada ほど良くありません。

ほぼすべてのモデル (ML-E5-large を除く) は英語で最高のパフォーマンスを発揮します。チェコ語やハンガリー語などの言語では、おそらくトレーニングするデータが少ないため、パフォーマンスに大きな違いがあります。

OpenAI のサブスクリプションにお金を払うべきですか、それともオープンソースの組み込みモデルをホストするべきですか?

OpenAI の最近の価格調整により、API がより手頃な価格になりました。現在のコストは 100 万トークンあたり 0.13 ドルです。 1 か月あたり 100 万件のクエリを処理する場合 (各クエリに約 1,000 トークンが含まれると仮定)、コストは約 130 ドルになります。したがって、実際のニーズに基づいて、オープンソースの埋め込みモデルをホストするかどうかを選択できます。

もちろん、考慮すべき点は費用対効果だけではありません。遅延、プライバシー、データ処理ワークフローの制御などの他の要素も考慮する必要がある場合があります。オープンソース モデルには、完全なデータ制御、プライバシーの強化、カスタマイズという利点があります。

レイテンシと言えば、OpenAI の API にもレイテンシの問題があり、応答時間が長くなる場合があるため、OpenAI の API が必ずしも最速の選択肢であるとは限りません。

つまり、オープンソース モデルと OpenAI のような独自のソリューションのどちらを選択するかは、簡単な答えではありません。オープンソースの埋め込みは、パフォーマンスとデータのより優れた制御を組み合わせる優れたオプションを提供します。そして、特にプライバシーへの懸念が二の次である場合、OpenAIの製品は利便性を優先する人々にとって依然として魅力的である可能性がある。

この記事のコード: https://github.com/Yannael/multilingual-embeddings

以上がデータに最適なエンベディング モデルの選択: OpenAI とオープンソースの多言語エンベディングの比較テストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。