OpenAI とオープンソースの多言語埋め込みモデル、どちらを選びますか?

OpenAI とオープンソースの多言語埋め込みモデル、どちらを選びますか?

翻訳者 | 朱 仙中

レビュー | Chonglou

制作:51CTO テクノロジースタック(WeChat ID:blog)

この記事では、OpenAI の複数の埋め込みモデルと複数のオープンソースの多言語埋め込みモデルを包括的に比較し、最終的に最も適したビッグデータ開発モデルを選択できるようにします。

1. はじめに

OpenAI は最近、Embedding v3 と呼ばれる次世代の埋め込みモデルをリリースしました。同社では、このモデルを多言語パフォーマンスが向上したこれまでで最も高性能な埋め込みモデルであると説明しています。これらのモデルは、text-embedding-3-mall と呼ばれる小さいモデルと、text-embedding-3-large と呼ばれるより大きく強力なモデルの 2 つのカテゴリに分けられます。

これらのモデルがどのように設計され、トレーニングされるかについては、ほとんど情報が公開されていません。以前リリースされた埋め込みモデル(2022 年 12 月、モデル クラス ada-002 経由)と同様に、OpenAI は再びクローズド ソース市場戦略を選択し、これらのモデルには有料 API 経由でのみアクセスできるようになりました。

しかし、これらのモデルは人々がお金を払うほど優れているのでしょうか?

この投稿の目的は、これらの新しいモデルのパフォーマンスをオープンソース モデルのパフォーマンスと経験的に比較することです。ユーザークエリに応じてコーパス内で最も関連性の高いドキュメントを検索するデータ取得ワークフローを使用して比較します。

私たちのコーパスは、現在最終検証段階にある EU 人工知能法 (https://artificialintelligenceact.eu/) になります。このコーパスの興味深い特徴は、AI に関する世界初の法的枠組みであることに加えて、24 の言語で利用できることです。これにより、異なる言語ファミリー間でのデータ取得精度を比較できるようになります。

この記事では、主に次の 2 つの手順を実行します。

  • 多言語テキストコーパスからカスタム合成質問応答データセットを生成します。
  • このカスタム データセットで、OpenAI と最先端のオープン ソース埋め込みモデルの精度を比較します。

この論文で提示されたすべての結果を再現するためのコードと関連データは、Github リポジトリ (https://github.com/Yannael/multilingual-embeddings) で提供されています。この論文で採用されているアプローチは、EU AI 指令を例にしていますが、他のデータ コーパスにも適用できることに注意してください。

2. カスタム質問応答データセットを生成する

まず、さまざまな埋め込みモデルのパフォーマンスを評価するために使用されるカスタム データ、つまり質問応答 (Q/a) データセットを生成することから始めましょう。カスタムの質問応答データセットを生成する利点は 2 つあります。

まず、データセットが埋め込みモデルのトレーニングの一部にならないようにすることでバイアスを回避します。これは、MTEB などの参照ベンチマークで発生する可能性があります (https://huggingface.co/spaces/mteb/leaderboard)。

2 番目に、検索拡張アプリケーション (RAG) の場合などに関連する可能性のある特定のデータ コーパスに対する評価が可能になります。

Llama Index のドキュメントで提案されている簡単なプロセスに従います。まず、コーパスをチャンクのグループに分割します。次に、各チャンクに対して、大規模言語モデル (LLM) を通じて合成質問のセットが生成され、回答が対応するチャンクに含まれるようになります。プロセスは次のとおりです。

写真

Llama Indexメソッドを使用して、データの質問応答データセットを生成します。

上記の戦略を実装するのは、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 AI 指令の英語版であり、公式 URL (https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A52021PC0206) を使用して Web から直接入手できます。

最終版はまだすべてのヨーロッパ言語で利用可能ではないため、2021 年 4 月のドラフト版を使用します。このバージョンでは、URL 内の英語を他の 23 の EU 公用語のいずれかに置き換えて、別の言語のテキストを取得できます (ブルガリア語の場合は BG、スペイン語の場合は ES、チェコ語の場合は CS など)。

写真

EU AI指令をEU公式24言語でダウンロードする(EU公式ウェブサイトから)

PensioneSplitter オブジェクトを使用して、ドキュメントを 1000 トークンのチャンクに分割します。英語の場合、約 100 個のチャンクが生成されます。

各チャンクは、次のプロンプト (Llama インデックス ライブラリで提案されるデフォルトのプロンプト) のコンテキストとして提供されます。

 https://github.com/run-llama/llama_index/blob/c058f2531ea86ee74822cb1421ceaeee7098a99f/llama_index/finetuning/embeddings/common.py#L51): 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 インデックス ライブラリの 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 モデルを使用します。OpenAI によれば、このモデルはファミリーのフラッグシップ モデルであり、16K サイズのコンテキスト ウィンドウをサポートし、ダイアログ ボックス用に最適化されています (https://platform.openai.com/docs/models/gpt-3-5-turbo)。

結果のオブジェクト「qa_dataset」には、質問と回答(チャンク)のペアが含まれます。生成された質問の例として、最初の 2 つの質問の結果を以下に示します (「回答」は最初のテキスト ブロックです)。

1)説明覚書によると、人工知能に関する統一規則を定める規則(人工知能法)の提案の主な目的は何ですか?

大まかな中国語の意味は次のとおりです。説明覚書によると、人工知能に関する統一規則を確立するための規制案(「人工知能法」)の主な目的は何ですか?

2) コンテキスト情報で概説されているように、人工知能に関する規制の提案は、欧州連合における AI の導入を促進しながら、AI の使用に関連するリスクにどのように対処することを目指していますか?

大まかな中国語の意味は次のとおりです。コンテキスト情報に記載されているように、AI規制の提案は、EUでのAIの導入を促進しながら、AIの使用に関連するリスクにどのように対処することを目指していますか?

チャンクと質問の数は言語によって異なり、英語では約 100 チャンクと 200 質問、ハンガリー語では 200 チャンクまたは 400 質問になります。

3. OpenAI埋め込みモデルの評価

私たちの評価関数は、Llama Index のドキュメントに従っており、次のようになります。

(https://docs.llamaindex.ai/en/stable/examples/finetuning/embeddings/finetune_embedding.html)、

これには主に 2 つのステップが含まれます。

まず、すべての回答 (ドキュメント チャンク) の埋め込みが VectorStoreIndex に保存され、効率的に検索できるようになります。次に、評価関数はすべてのクエリをループし、最も類似する上位 k 個のドキュメントを取得し、MRR (平均逆順位) に基づいて検索の精度を評価します。

 def evaluate(dataset, embed_model, insert_batch_size=1000, top_k=5): # 从qa_dataset对象获取语料库、查询和相关文档corpus = dataset.corpus queries = dataset.queries relevant_docs = dataset.relevant_docs # 为语料库中的每个文档创建TextNode对象,并创建VectorStoreIndex以有效地存储和检索嵌入nodes = [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) #准备收集评估结果eval_results = [] # 对数据集中的每个查询进行迭代,以评估检索性能for query_id, query in tqdm(queries.items()): # 检索当前查询的前_k个最相似的文档,并提取检索到的文档的ID retrieved_nodes = retriever.retrieve(query) retrieved_ids = [node.node.node_id for node in retrieved_nodes] #检查所需文档是否在检索到的文档中expected_id = relevant_docs[query_id][0] is_hit = expected_id in retrieved_ids # 假设每个查询有1个相关文档# 计算平均倒数排名(MRR)并添加到结果集中if is_hit: rank = retrieved_ids.index(expected_id) + 1 mrr = 1 / rank else: mrr = 0 eval_results.append(mrr) #返回所有查询的平均MRR作为最终评估度量return np.average(eval_results)

埋め込みモデルは、「embed_mode」パラメータを介して評価関数に渡されます。 OpenAI モデルの場合、このパラメーターはモデル名とモデル寸法で初期化された OpenAIEmbedding オブジェクトです。

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

API パラメータ dimensions を使用すると、埋め込みの概念的表現プロパティを失うことなく、埋め込みを短縮できます (つまり、シーケンスの末尾からいくつかの数字を削除します)。たとえば、OpenAI は発表の中で、MTEB ベンチマークでは埋め込みをサイズ 256 に短縮しても、サイズ 1536 の短縮されていない text-embedding-ada-002 埋め込みよりも優れたパフォーマンスを発揮できることを示唆しました。

私たちは、4 つの異なる OpenAI 埋め込みモデルで評価関数を実行しました。

ltext-embedding-3-largeの2つのバージョン:1つは可能な限り低い次元(256)で、

もう 1 つは、最も高い次元 (3072) を持ちます。これらは「OAI-large256」および「OAI-Large3072」と呼ばれます。

lOAI-small: サイズが 1536 の text-embedding-3-small 埋め込みモデル。

lOAI-ada-002: サイズ 1536 の従来の text-embedding-ada-002 モデル。

各モデルは、英語 (EN)、フランス語 (FR)、チェコ語 (CS)、ハンガリー語 (HU) の 4 つの異なる言語で評価され、それぞれゲルマン語、ロマンス語、キリル語、ウラル語をカバーします。

 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"] # 循环遍历所有语言for language in languages: #加载数据集file_name=language+"_dataset.json" qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name) # 循环遍历所有模型for model_name, model_spec in embeddings_model_spec.items(): #取得模型embed_model = OpenAIEmbedding(model=model_spec['model_name'], dimensinotallow=model_spec['dimensions']) # 评估嵌入分数(根据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モデルのパフォーマンス概要

予想どおり、大規模モデルでは埋め込みサイズが 3072 と大きいほどパフォーマンスが向上します。ただし、小型の従来の Ada モデルと比較すると、大型モデルは予想よりも小さくなります。比較のために、MTEB ベンチマークで OpenAI モデルによって得られたパフォーマンスも以下に報告します。

OpenAI の埋め込みモデルのパフォーマンス (公式発表で説明されているとおり)

私たちの評価では、大規模モデル、小規模モデル、および Ada モデル間のパフォーマンスの違いは、MTEB ベンチマークの場合ほど顕著ではないことは注目に値します。これは、大規模なベンチマークで観察された平均パフォーマンスが、必ずしもカスタム データセットで得られたパフォーマンスを反映するわけではないという事実を反映しています。

4. オープンソース埋め込みモデルの評価

現在、埋め込みに関するオープンソースの研究は非常に活発で、新しいモデルが定期的に公開されています。最新リリースモデルの最新情​​報を入手するには、Hugging Face MTEB リーダーボード (https://huggingface.co/spaces/mteb/leaderboard) が最適です。

本論文では比較のために、最近(2024 年)公開された 4 つの埋め込みモデルのセットを選択しました。選考基準は、MTEB リーダーボードの平均スコアと多言語データを処理する能力でした。選択されたモデルの主な特徴は以下の通りです。

選択されたオープンソース埋め込みモデル

lE5-Mistral-7B-instruct (E5-Mistral-7B): Microsoft のこの E5 埋め込みモデル (https://huggingface.co/intfloat/e5-mistral-7b-instruct) は、Mistral-7B-v0.1 から初期化され、多言語データセットの混合で微調整されています。このモデルは MTEB リーダーボードで最高のパフォーマンスを発揮しますが、これまでで最大のモデル (14GB) でもあります。

lmultilingual-e5-large-instruct (ML-e5-larg): 多言語データをより適切に処理できるように設計された、Microsoft の別の e5 モデル。これは xlm-roberta-large から初期化され、多言語データセットの混合でトレーニングされます。これは E5-Mistral よりもはるかに小さい (10 倍) ですが、コンテキスト サイズもはるかに小さくなります (514)。

lBGE-M3: このモデル (https://huggingface.co/BAAI/bge-m3) は北京人工知能アカデミーによって設計され、100 を超える作業言語をサポートする最も高度な多言語データ埋め込みモデルです。 2024年2月22日現在、MTEBリーダーボードではベンチマークされていません。

lnomic-embed-text-v1 (nomic-embed): このモデルは Nomic (https://home.nomic.ai/) によって設計され、OpenAI Ada-002 や text-embedding-3-small よりも優れたパフォーマンスを発揮すると主張していますが、サイズはわずか 0.55GB です。興味深いことに、このモデルは完全に再現可能で監査可能な最初のモデルです (オープン データとオープン ソースのトレーニング コード)。

これらのオープンソース モデルを評価するために使用されるコードは、OpenAI モデルに使用されるコードと似ています。主な変更点はモデル仕様にあり、最大コンテキスト長やプーリング タイプなどの追加の詳細を指定する必要があります。次に、4 つの言語ごとに各モデルを評価します。

 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"] # 循环遍历所有模型for model_name, model_spec in embeddings_model_spec.items(): print("Processing model : "+str(model_spec)) # 获取模型tokenizer = 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') # 循环遍历所有语言for language in languages: # 加载数据集file_name=language+"_dataset.json" qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name) start_time_assessment=time.time() # 评估嵌入得分(根据k=5时的命中率) score = evaluate(qa_dataset, tokenizer, embed_model, model_spec['normalize'], model_spec['max_length'], model_spec['pooling_type']) #计算分数评估的持续时间duration_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"])

MRR に基づく精度レポートは次のとおりです。

オープンソースモデルのパフォーマンス概要


上記のグラフからわかるように、BGE-M3 のパフォーマンスが最も高く、次いで ML-E5-Large、E5-mistral-7b、Nomic Embed となっています。 BGE-M3 モデルは MTEB リーダーボードでベンチマークされていませんが、結果から、他のモデルよりも上位にランクされる可能性があることが示唆されています。 BGE-M3 は多言語データに最適化されていますが、英語でも他のモデルよりも優れたパフォーマンスを発揮する点に注目すべきです。

以下では、各埋め込みモデルの処理時間も報告します。

英語の質問応答データセットを閲覧するための処理時間(秒)

E5-mistral-7b は他のモデルよりも 10 倍以上大きく、はるかに遅いモデルであることが簡単にわかります。

5. 結論

ここで、同じ図でテストした 8 つのモデルのパフォーマンスを比較してみましょう。

8つのテストモデルのパフォーマンス比較

上記の結果から、次のような主な結論が得られます。

  • オープンソースモデルは最高のパフォーマンスを達成しました。その中で、北京人工知能研究院が開発したBGE-M3モデルが目立った。このモデルは OpenAI モデルと同じコンテキスト長 (8K) を持ち、サイズは 2.2 GB です。
  • OpenAI 全体の一貫性。大規模 (3072)、小規模、従来の OpenAI モデルのパフォーマンスは非常に似ています。ただし、大規模モデルの埋め込みサイズ (256) を縮小すると、パフォーマンスが低下します。
  • 言語に対する感受性。ほぼすべてのモデル (ML-E5-large を除く) は英語で最高のパフォーマンスを発揮します。チェコ語やハンガリー語などの言語ではパフォーマンスに大きな違いがあります。

この結論に基づいて、有料の OpenAI に加入するべきでしょうか、それともホストされたオープンソースの埋め込みモデルを使用することを選択するべきでしょうか?

OpenAI の最近の価格改定 (https://openai.com/pricing) により、API へのアクセスがより手頃になり、現在のコストは 100 万トークンあたり 0.13 ドルとなっています。したがって、1 か月あたり 100 万のクエリを処理するコスト (各クエリに約 1K のトークンが関係すると想定) は約 130 ドルになります。したがって、使用方法によっては、独自の組み込みサーバーをレンタルして維持することはコスト効率が良くない可能性があります。

ただし、コスト効率だけが考慮されるわけではありません。レイテンシ、プライバシー、データ処理ワークフローの制御など、他の要素も考慮する必要があるかもしれません。対照的に、オープンソース モデルは、完全なデータ制御、強化されたプライバシー、カスタマイズなどの利点を提供します。一方、OpenAI の API にもレイテンシの問題があり、応答時間が長くなることがあります。

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

主な参考文献

コンパニオン Github リポジトリ:

https://github.com/Yannael/multilingual-embeddings

文の埋め込みについて知りたいことすべて(そしておそらくそれ以上のこと):

https://osanseviero.github.io/hackerllama/blog/posts

OpenAI ブログ投稿: 新しい埋め込みモデルと API の更新

https://openai.com/blog/new-embedding-models-and-api-updates

埋め込み: OpenAI ガイド

埋め込みモデル

MTEB: 大規模テキスト埋め込みベンチマークと Hugging Face MTEB リーダーボード

https://huggingface.co/spaces/mteb/leaderboard

テキスト埋め込み: 総合ガイド

https://towardsdatascience.com/text-embeddings-comprehensive-guide-afd97fce8fb5

検索強化生成 (RAG) 実践ガイド

https://cameronrwolfe.substack.com/p/a-practitioners-guide-to-retrieval.

RAG に最適な多言語埋め込みモデルを見つける方法

https://towardsdatascience.com/how-to-find-the-best-multilingual-embedding-model-for-your-rag-40325c308ebb

翻訳者紹介

Zhu Xianzhong 氏は、51CTO のコミュニティ エディターであり、51CTO の専門ブロガー兼講師であり、濰坊の大学のコンピューター教師であり、フリーランス プログラミング コミュニティのベテランです。

オリジナルリンク: https://towardsdatascience.com/openai-vs-open-source-multilingual-embedding-models-e5ccb7c90f05

<<:  クラウドAI市場は2028年までに2,700億ドルに達すると予想

>>: 

ブログ    
ブログ    
ブログ    

推薦する

AI データラベリングとは何ですか?課題は何ですか?

データ注釈はほとんどの人工知能の基盤であり、機械学習とディープラーニング モデルの品質を決定します。...

EUがAIを活用して社会イノベーションを推進する方法

[[377176]] 2020年の新型コロナウイルスの世界的な蔓延は、人類にとって永遠の記憶となるこ...

ガートナーが短期的なAIイノベーションを推進する4つのトレンドを明らかに

ガートナーの 2021 年人工知能ハイプ サイクルの 4 つのトレンドが、短期的な AI イノベーシ...

ロボットが2000万の仕事に取って代わる:最大の懸念は30代なのに何も知らないこと

[[269741]] 01 数日前、あるニュースが私の周りの多くの人々に反省と心配を抱かせました。 ...

陳丹奇と清華大学特別賞受賞学生が新たな成果を発表:Google BERTが提案したトレーニングルールを破る

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能は医療従事者の燃え尽き症候群を軽減すると期待されている

[[266831]]臨床医は世界で最も困難な仕事の一つです。彼らは、高齢の患者層に対応するために24...

現実は素晴らしい、Googleとコーネル大学が提案した実画像補完技術RealFill

休暇で旅行するときは、写真を撮ることが必須です。しかし、景勝地で撮影した写真の多くは、背景に何かが写...

李開復氏は5人の学生が作ったAIプロジェクトを賞賛した

AI スタートアップのアイデアは、わずか 2 か月の作業で商品化できるのでしょうか?今年のイノベーシ...

1枚の写真を2分で3Dに変換します。テクスチャ品質とマルチビューの一貫性:新しいSOTA|北京大学が制作

写真を 3D に変換するのにかかる時間はわずか2 分です。さまざまな視点から見て、質感の品質と一貫性...

...

SaaS アプリケーションで AI スノーボールはどのように大きくなるのでしょうか?

Shopify の不正防止機械学習から Salesforce の Einstein まで、過去数年...

...

C# データ構造とアルゴリズムにおける線形テーブルの簡単な分析

C# データ構造とアルゴリズムの線形リストとは何ですか?まず、C# のデータ構造とアルゴリズムにおけ...

[NCTSサミットレビュー] アリババの潘家騰:アリママのオフラインテストドメインのインテリジェント構築

2019年10月26日、Testinが主催する第2回NCTS中国クラウドテスト業界サミットが北京で開...