データに最適な埋め込みモデルの選択: OpenAI とオープンソースの多言語埋め込みの比較テスト

データに最適な埋め込みモデルの選択: OpenAI とオープンソースの多言語埋め込みの比較テスト

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

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

この論文では、これらの新しいモデルのパフォーマンスをオープンソース モデルと経験的に比較します。ユーザークエリに基づいてコーパス内で最も関連性の高いドキュメントを見つけるデータ取得ワークフローを作成します。

私たちのコーパスは、現在検証の最終段階にある欧州 AI 法です。このコーパスは、人工知能に関する世界初の法的枠組みであることに加え、24 の言語で利用できるという重要な特徴もあります。この方法で、異なる言語でのデータ取得の精度を比較できます。

多言語テキストコーパスから生成されたカスタム合成質問/回答データセットで、OpenAI と最先端のオープンソース埋め込みモデルの精度を比較します。この記事で採用したアプローチは他のデータ コーパスにも適用できるため、完全なコードは最後に記載されています。

カスタムQ/Aデータセットを生成する

まず、質問応答 (Q/A) データセット用のカスタム データの生成から始めましょう。カスタム データセットを生成する利点は、データセットが埋め込みモデルのトレーニングの一部にならないようにすることでバイアスを回避できることです。これは、MTEB などの参照ベンチマークで発生する可能性があります。また、検索拡張アプリケーション (RAG) などの場合に関係する可能性のある特定のデータ コーパスに合わせて評価を調整することもできます。

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

以下のコードに示すように、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)

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

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」には質問と回答 (チャンク) のペアが含まれています。生成された質問の例として、最初の 2 つの質問の結果を以下に示します (「回答」はテキストの最初の部分です)。

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

OpenAI 埋め込みモデル

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

 def evaluate(dataset, embed_model, insert_batch_size=1000, top_k=5): # Get corpus, queries, and relevant documents from the qa_dataset object corpus = dataset.corpus queries = dataset.queries relevant_docs = dataset.relevant_docs # Create TextNode objects for each document in the corpus and create a VectorStoreIndex to efficiently store and retrieve embeddings 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) # Prepare to collect evaluation results eval_results = [] # Iterate over each query in the dataset to evaluate retrieval performance for 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 documents retrieved_nodes = retriever.retrieve(query) retrieved_ids = [node.node.node_id for node in retrieved_nodes] # Check if the expected document was among the retrieved documents expected_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 results if is_hit: rank = retrieved_ids.index(expected_id) + 1 mrr = 1 / rank else: mrr = 0 eval_results.append(mrr) # Return the average MRR across all queries as the final evaluation metric return 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'])

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

評価関数を 4 つの異なる埋め込みモデルで実行します。

text-embedding-3-large の 2 つのバージョン: 1 つは可能な限り低い次元 (256) で、もう 1 つは可能な限り高い次元 (3072) です。これらは「OAI-large-256」および「OAI-large-3072」と呼ばれます。

OAI-small:text-embedding-3-small、寸法は 1536 です。

OAI-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"] # Loop through all languages for language in languages: # Load dataset file_name=language+"_dataset.json" qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name) # Loop through all models for model_name, model_spec in embeddings_model_spec.items(): # Get model embed_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 の精度は次のとおりです。

埋め込みサイズが大きいほど、パフォーマンスは向上します。

オープンソースの埋め込みモデル

埋め込みに関するオープンソースの研究も非常に活発で、Hugging Face の MTEB リーダーボードでは最新の埋め込みモデルが頻繁にリリースされています。

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

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

multilingual-e5-large-instruct(ML-E5-large): 多言語データをより適切に処理できる、Microsoft の別の 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 model 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') # Loop through all languages for language in languages: # Load dataset file_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 assessment 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"])

結果は次のとおりです。

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

これらのモデルはオープンソースであるため、通常はローカルで実行する必要があります。そのため、各埋め込みモデルの処理時間も具体的に記録しました。

E5-ミストラル-7bは他のモデルよりも10倍以上大きいので、最も遅いのは当然です

要約する

すべての結果をまとめてみましょう。

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

OpenAI の large(3072)、small、ada モデルのパフォーマンスは非常に似ています。埋め込みサイズをlarge(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

<<: 

>>:  インダストリー 5.0: スマート シティの未来を形作るテクノロジーのメガトレンドの融合

ブログ    

推薦する

AIは黄金時代を迎えているのか、それとも冬を迎えようとしているのか?

人工知能開発の世界的なブームは今も急速に進んでおり、止まる気配はありません。現在、数十カ国が経済成長...

機械学習で保険ビジネスの問題を簡素化する3つのシナリオ

実際の請求ケースでは、保険会社は個人、シナリオ、さらには他の影響要因を含む大量のデータを使用する必要...

Microsoft Flight SimulatorはAIを使って15億の建物を復元、宮殿がオフィスビルに変わる際にバグが発生

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

PyTorch ライブラリの 95% がこのバグの影響を受けます。テスラのAIディレクターも例外ではなかった

[[393110]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

AIがPythonの記述を手助けし、インストールはたった5ステップで完了し、自由に調整できます。

[[269874]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...

...

オープンソース! Gartner の 100 ページの機械学習ブックが無料でダウンロードできるようになりました。

今日の大企業は、産業化以来最大の変革を経験しています。人工知能は、産業や私たちの働き方、考え方、交流...

「Nvidia人工呼吸器」オープンソース:コンピュータアーキテクチャのマスターによって構築され、コストが98%削減され、黄仁訓が賞賛

この人工呼吸器は、コンピューターアーキテクチャの巨匠ビル・ダリー氏によって設計されました。コンピュー...

機械学習における線形代数の理解に役立つ 10 の例

線形代数は、ベクトル、行列、線形変換を扱う数学の分野です。これは機械学習の重要な基盤であり、アルゴリ...

北京大学とテンセントは、デザイナーと同じくらいクリエイティブなテキストロゴ生成モデルを提案した。

テキスト ロゴのデザインはデザイナーの創造性と経験に大きく依存しますが、その中でも各テキスト要素のレ...

人工知能によって仕事が置き換えられた後、一般の人々は何をすべきでしょうか?

The Paperによると、世界経済フォーラムの報告書では、2025年までに8000万の仕事が機械...

...

5G悪報セキュリティ管理プラットフォームにおけるディープラーニングに基づくテキスト感情認識技術の応用

著者: Sun Yue、所属部署: 中国移動 (杭州) 情報技術有限公司 | 中国移動杭州 R&am...

人工知能の時代、3つの問題が未来を決定づける

学習と進化ご存知のとおり、量子という概念は120年前にドイツの物理学者プランクによって提唱されました...

Baidu Brain OCR技術がBaimiaoアプリを強化:AIが視覚障害者の目となる

現実には、あらゆる種類の印刷されたテキストや、周囲のあらゆるものを何の障害もなく簡単に読むことができ...