Milvusによる多言語言語の埋め込みとクエリー
このガイドでは、MilvusとBGE-M3多言語埋め込みモデルを使用して、多言語言語をベクトル空間に埋め込むための課題、戦略、アプローチを探ります。
シリーズ全体を読む
- 筏か否か?クラウドネイティブデータベースにおけるデータ一貫性のベストソリューション
- Faiss(フェイスブックAI類似検索)を理解する
- 情報検索メトリクス
- ベクターデータベースにおける高度なクエリー技術
- ベクトル検索を支える人気の機械学習アルゴリズム
- ハイブリッド検索:テキストと画像を組み合わせて検索機能を強化
- ベクターデータベースの高可用性の確保
- ランキングモデル:ランキングモデルとは何か?
- Zillizでレキシカル検索とセマンティック検索を使いこなす
- バイナリ量子化とMilvusによるベクトル検索の効率化
- モデルプロバイダーオープンソースとクローズドソースの比較
- Milvusによる多言語言語の埋め込みとクエリー
- 構造化データのベクトル化とクエリの究極ガイド
- HNSWlibを理解する:高速近似最近傍探索のためのグラフベースライブラリ
- ScaNN(Scalable Nearest Neighbors)とは?
- ScaNNを始める
- 次世代検索:クロスエンコーダとスパース行列因子分解がk-NN検索を再定義する方法
- ボイジャーとは?
- 迷惑とは何か?
#はじめに
世界はますます相互接続が進んでおり、異なる言語間のデータを効果的に処理・分析する能力は、これまで以上に重要になっている。しかし、多くの一般的な自然言語処理(NLP)モデルは、主に英語に対応しており、様々なアプリケーションにおいて言語能力に大きなギャップを残している。このギャップは、特にベクトル検索エンジンにおいて、多言語ソリューションの差し迫った必要性を強調している。
このガイドでは、MilvusとBGE-M3の多言語埋め込みモデルを使用して、多言語言語をベクトル空間に埋め込むための課題、戦略、アプローチを探ります。
多言語ベクトル埋め込みとは?
多言語ベクトル埋め込みとは、異なる言語間の単語やフレーズを数値で表現し、共有されたベクトル空間内でその意味を捉えることです。例えば、英語の "cat"、スペイン語の "gato"、フランス語の "chat "のような単語は、高次元空間内で互いに近接したベクトルで表現され、意味的な類似性を示します。この意味的な結合は、ベクトル検索エンジンにとって非常に貴重であり、クエリの言語に関係なく、関連する結果を取得することを可能にします。多言語埋め込みは、通常Milvusのようなベクトルデータベースに格納され、意味的に関連する情報のシームレスな検索を容易にします。
Milvusは、大規模なデータセットを管理できるオープンソースのベクトルデータベースです。Milvusの特長は、多言語データを扱うことができる点にあります。Milvusは、多言語ベクトル表現を生成するBGE-M3などの様々なエンベッディングモデルとシームレスに統合することで、多様な言語のデータを処理し、インデックスを作成することができます。さらに、MilvusはIVF、HNSW、PQのような高度なインデックス作成技術を活用し、複雑な多言語データセットにおいても迅速かつ正確な検索性能を保証します。このような包括的な機能を備えたMilvusは、弾力性があり、スケーラブルで、言語にとらわれない検索ソリューションの導入に最適です。
##多言語言語組み込みの課題
ベクトル空間への多言語言語の埋め込みは、正確で意味のある表現を確実にするために対処しなければならない、ユニークな一連の課題を提示する。主な障害には次のようなものがあります:
- 言語的多様性:*** どの言語にも独特の文法、文体、語彙があります。すべての言語でうまく機能する普遍的な埋め込みモデルを作成するのは困難です。例えば、アラビア語やフィンランド語のような複雑な形態素体系を持つ言語は、単語を単一の単位として扱うモデルをつまずかせる可能性があります。このようなモデルでは、単語の形成や屈折の複雑さを捉えるのに苦労する。
- 多くの言語、特にリソースの少ない言語では、ロバストな埋め込みモデルを学習するための高品質なデータセットが不足しています。十分なデータがない場合、結果として得られる表現はあまり正確でない可能性があり、実世界のアプリケーションでの性能低下につながります。
- トークン化とセグメンテーション:** 中国語や日本語のようなlogographic writingシステムを持つ言語は、テキストを埋め込みに意味のある単位に分解するために、特別なトークン化とセグメンテーション技術を必要とします。このような言語的なニュアンスを考慮しないと、不正確または不完全な表現になる可能性があります。
- クロスリンガルアライメント:*** 言語間で意味的に類似した概念を近傍のベクトルにマッピングする最適なクロスリンガルアライメントを達成することは、特に英語と中国語のように言語構造が大きく異なる遠い言語ペアでは、依然として困難である。
多言語埋め込みモデルの概要
BGE-M3のような多言語埋め込みモデルは、自然言語処理を大幅に進歩させます。これらのモデルは、多言語を理解し処理するように設計されているため、汎用性が高く、様々な多言語コンテキストに適用可能です。BGE-M3は、異なる言語の単語やフレーズを、共有された埋め込み空間のベクトルにマッピングすることで機能する。これにより、モデルは言語間の意味的・構文的類似性を捉え、言語横断的な知識伝達を可能にする。
例えば、BGE-M3モデルは、機械翻訳、クロスリンガル情報検索、多言語感情分析などのタスクで顕著な性能を示した多言語埋め込みモデルである。ディープラーニングの力を活用し、言語にとらわれない表現を学習します。つまり、言語に関係なく単語やフレーズの意味を理解することができます。
多言語のために高度な埋め込みモデルを使用することには多くの利点がある。第一に、自然言語処理タスクにおける言語の壁を克服するのに役立つ。これは、機械学習モデルの学習に利用できるリソースが限られている言語にとって有益である。第二に、これらのモデルは、ある言語から学んだ知識を活用して、他の言語のパフォーマンスを向上させることができる。この特性は、低リソース言語にとって特に有用である。モデルは、高リソース言語のリソースを活用してパフォーマンスを向上させることができるからである。最後に、これらのモデルにより、母国語でユーザーを理解し対話できる、真にグローバルなAIシステムの開発が可能になり、AIシステムのユーザー体験とアクセシビリティが向上する。
Milvus と BGE-M3 を用いた多言語言語のエンコードと検索
Milvusは、BGE-M3を含む多くの一般的な埋め込みモデル(https://milvus.io/docs/embeddings.md)を統合しています。この統合により、開発パイプラインにコンポーネントを追加することなく、多言語ドキュメントを簡単にエンベッディングに変換することができます。エンベッディングを取得した後は、類似検索のためにMilvusに保存することができます。
以下は、多言語データの管理と検索のためにBGE-M3とMilvusをセットアップする方法についてのステップバイステップガイドです。
環境の構築
BGE-M3を使ってMilvusをセットアップするコードを書く前に、Milvusをコンピュータにインストールし、必要なパッケージをインストールする必要があります。まず、このガイドに従ってMilvusをコンピュータにインストールする。次に、必要なPythonパッケージを以下のコマンドでインストールします:
pip install "pymilvus[モデル]"
Pymilvus[model]は
PyMilvus` のコンポーネントで、埋め込みモデルを扱うための機能を提供する。様々なモデルを使ってデータから埋め込みデータを生成することができる。
ここでは、BGE-M3とMilvusを統合するために Pymilvus[model]
を使用します。このコマンドはPython SDKであるPymilvusもインストールします。
次に、必要なモジュールとクラスをインポートします:
# 必要なモジュールとクラスをインポートする
from pymilvus import MilvusClient, DataType
# 文のエンコード用にBGEM3EmbeddingFunctionをインポートする。
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
MilvusClientは
Milvusベクトルデータベースとのインタラクションを支援する。 DataType
クラスはコレクションのフィールドのデータ型を定義するのに役立つ。最後に、 BGEM3EmbeddingFunction
クラスは BGE-M3
多言語文埋め込みモデルを読み込んで使用するのに役立つ。
データのインポートが終わったら、環境の設定は完了です。
BGE-M3モデルのインスタンス化とMilvusへの接続
次に、埋め込みモデル(この場合はBGE-M3多言語モデル)をインスタンス化する必要があります。これは英語以外の言語を埋め込むために使用するモデルです。
# BGEM3EmbeddingFunctionをインスタンス化する。
# これは事前に学習された多言語文埋め込みモデルです。
bge_m3_encoder = BGEM3EmbeddingFunction(
model_name='BAAI/bge-m3', device='cpu', use_fp16=False
)
このエンコーダは100以上の言語のテキストデータに対して高品質な埋め込みを生成することができます。
次に、Milvusインスタンスへの接続を確立します。Milvusインスタンスが動作しているUniform Resource Identifier (URI)を指定する必要があります。MilvusのデフォルトURIは http://localhost:19530
です。
# Milvus インスタンスへの接続
client = MilvusClient(
uri="http://localhost:19530"
)
uri`の値をMilvusインスタンスの設定で置き換える。
コレクションスキーマの定義
Milvus**インスタンスと接続した後、コレクション用のスキーマを定義する必要があります。これには MilvusClient
を使用します。
# コレクションスキーマの定義
schema = MilvusClient.create_schema(
auto_id=True、
enable_dynamic_field=True、
)
# スキーマにフィールドを追加
schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535)
schema.add_field(field_name="doc_embedding", datatype=DataType.FLOAT_VECTOR, dim=1024)
上記のコードでは、create_schema
を使用してコレクションのスキーマを定義しています。auto_id=Trueは一意なドキュメント ID の自動生成を指定する。enable_dynamic_field=True
は後から新しいフィールドを追加できるようにする。
以下は schema
の各フィールドの役割である:
- doc_id`:各文書の一意な識別子を格納する(自動生成される)。
- doc_text`: ドキュメントのテキストを格納する:文書のテキストを格納する。
- doc_embedding`: ドキュメントの埋め込みベクトル:文書のセマンティクスを表す 1024 次元の埋め込みベクトルを格納する。
コレクションの作成
コレクションのスキーマを作成した後、次のステップはコレクションを作成することです。作成しようとしているコレクションが既にMilvusに存在するかどうかをチェックすることから始めます。存在する場合、データベースから削除し、定義されたスキーマと説明を使用して新しいコレクションを作成します:
コレクション名 = "multilingual_docs"
# 既存のコレクションがあれば、それを削除する
if client.has_collection(collection_name):
client.drop_collection(collection_name)
# コレクションを作成する
コレクションを作成する # client.create_collection(
collection_name="multilingual_docs"、
schema=schema、
description="多言語ドキュメントコレクション"
)
コレクションを作成したら、今度はコレクション内の特定のデータの検索を高速化するためにインデックスを作成する必要があります。
インデックスの作成
何千もの文書があるコレクションを想像してみてください。インデックスなしで類似文書を検索するには、クエリの埋め込みとコレクション内のすべての文書の埋め込みを比較する必要があります。これは非常に時間がかかります。インデックスは、クエリ処理を高速化します。
効率的な類似検索を可能にするために、doc_embedding
フィールドにインデックスを作成します:
# インデックスのパラメータを作成する
index_params = [{ }} # インデックスのパラメータを作成する
"field_name":"doc_embedding"、
"index_type":"IVF_FLAT"、
"metric_type":"L2",
「params":{"nlist":128}
}]
# インデックスの作成
client.create_index(collection_name, index_params)
print("New index created successfully.")
上記のコードでは、インデックスのパラメータを定義している。そして、 create_index
メソッドを使用して、定義されたパラメータに基づいて doc_embedding
フィールドにインデックスを作成する。IVF_FLATインデックス型と
L2` (ユークリッド) メトリックはベクトルの類似性検索に適している。
多言語ドキュメントのMilvusへの挿入
インデックスを作成したら、多言語文書を挿入する準備ができました。以下はヒンディー語の文書例です。BGE-M3多言語埋め込みモデルは、これらの文書をエンコードします。
ドキュメント = [
"Zilliz क्या है?Zilliz एक उच्च प्रदर्शन डेटा वैज्ञानिकता कंपनी है जो विशेष रूप से डेटा वैज्ञानिकता और अनुरूप साधनों पर केंद्रित है। यह उन्नत अनुकूलन और तेजी से परिसर को प्रदान करता है,जिसे वैज्ञानिक और तकनीकी समस्याओं का हल करना संभव होता है।"、
"Milvus क्या है?Milvus एक ओपन सोर्स सॉफ्टवेयर परियोजना है जो वेक्टर डेटाबेस की बाजार में उभरती टेक्नोलॉजी है। यह डेटा वैज्ञानिकता और मशीन लर्निंग के क्षेत्र में एक अत्यधिक प्रभावी और सरल उपायहै जो विभिन्न उपयोग केस को समर्थ बनाता है। Milvus विशेष रूप से वेक्टर सिमिलैरिटी और उपक्रमी अनुरोधों के लिए डेटा को त्वरित और सरल तरीके से प्रोसेस करने के लिए विकसित किया गया है।"
]
ドキュメントを繰り返し、Milvusに挿入する。
# ドキュメントを繰り返し、コレクションに挿入する
for doc_text in documents:
doc_embedding = bge_m3_encoder.encode_documents([doc_text])['dense'][0].
エンティティ = {
"doc_text": doc_text、
"doc_embedding": doc_embedding.tolist()
}
insert_result = client.insert(collection_name, [entity])
print(f "Inserted document: {doc_text[:20]}...")
各文書の埋め込みはBGE-M3エンコーダを使って生成され、Milvusコレクションに挿入されます。多言語文書が埋め込まれ、Milvusに挿入されるので、様々な目的のために意味的に関連するデータを検索することができます。簡単なクエリと類似検索システムを実装してみましょう。このシステムは後に検索拡張生成(RAG)システムを作成するために発展させることができる。
問い合わせと類似検索
類似検索を実行するには、まずコレクションをメモリにロードします:
# コレクションをメモリにロードする
client.load_collection(collection_name)
次に、メトリックの種類 (ユークリッド距離の場合は L2
) や nprobe
の値 (大きいほど良いが、遅い) などの検索パラメータを定義する:
search_params = {
"metric_type":"L2",
"params":{"nprobe":10}
}
次に、以前に埋め込んだデータがヒンディー語だったので、ヒンディー語のクエリーテキストを提供し、BGE-M3エンコーダーを使ってそのエンベッディングを生成する:
query_text = "Milvus क्या है?"
query_embedding = bge_m3_encoder.encode_queries([query_text])['dense'][0].
最後に、Milvusで類似検索を行い、クエリ埋め込みに基づいて最も類似した文書を検索する:
search_result = client.search(
collection_name=collection_name、
data=[query_embedding]、
limit=10、
output_fields=["doc_text", "doc_embedding"]、
search_params=search_params
)
client.searchメソッドは、類似度スコアでソートされた上位
limit` 件の結果を返す。最初にヒットした結果が (もしあれば) 出力される。
if search_result and len(search_result[0]) > 0:
first_hit = search_result[0][0].
エンティティ = first_hit['entity']
print(f "Text: {entity['doc_text']}")
print(f "クエリ埋め込み: {query_embedding}")
print(f "ファーストヒットの埋め込み: {entity['doc_embedding']}")
else:
print("結果が見つかりません。")
上記のコードの結果は以下の通り:
結果はクエリー Milvus क्या है?
に対する最初のヒットを示している。これはヒンディー語版のMilvusとは何ですか?上のスクリーンショットで最初にヒットしたのはMilvusに関する文書であり、Zillizではない。このスクリーンショットは、英語以外の言語を埋め込み、英語以外の検索クエリに意味的に関連する情報を取得できることを示している。Google翻訳を使えば、検索クエリと出力を英語に翻訳することができる。
その他の多言語埋め込みモデル
BGE-M3以外にも、多くの多言語エンベッディングモデルが販売されています。ここでは、BGE-M3と他の著名なエンベッディングモデルとの比較を示します:
BGE-M3と他のモデルの比較
BERT**:最も古く、最も広く使われている変換モデルの1つで、100以上の言語の埋め込みを提供する。しかし、より最近のモデルは、多言語ベンチマークでBERTを上回る傾向があります。XLM-RoBERTaは、100言語のデータで事前に訓練されたRoBERTaの拡張であり、強力なクロスリンガル性能を示すが、BGE-M3よりも語彙が少ない。
LaBSE**:Googleのデュアルエンコーダーモデルで、100以上の言語を同じ意味空間に埋め込んでいる。検索タスクでは優れているが、テキスト生成タスクではBGE-M3より劣る可能性がある。T5の多言語バージョン(mT5)は、101言語のデータで学習され、テキストを生成できるが、計算量が多い。
mAlBERT:自己教師付き事前学習とクロスリンガルアライメントを利用した効率的な多言語モデル。軽量ですが、ベンチマークによってはBGE-M3に遅れをとることがあります。
正しいモデルの選択
モデルの選択は、言語カバレッジの必要性、アプリケーション要件(生成と理解など)、計算上の制約、対象タスクの性能ベンチマークなどの要因に優先順位をつけることによって決まります。
リソースの少ない言語を扱う場合、BGE-M3は200以上の言語に対応するロバストな多言語機能を提供します。翻訳や要約のようなテキスト生成タスクでは、BGE-M3はしばしば他のモデルを凌駕します。しかし、検索やランキングタスクでは、LaBSEのようなデュアルエンコーダーモデルの方が優れた性能を発揮します。
計算リソースが限られている場合は、mAlBERTのような軽量モデルも選択肢になり得るが、性能はトレードオフになる。
本番環境でのZillizクラウドの利用
これまで、BGE-M3多言語エンベッディングモデルでMilvusをセルフホストで使用する方法について説明してきました。しかし、Milvusを自分でホスティングせず、完全に管理されたクラウドベースのベクターデータベースを使いたい場合はどうでしょうか?そこでZilliz Cloudの登場です。
Zilliz Cloudは、本番環境、特に多言語データを扱う場合に適したベクターデータベースです。Milvusのクラウド版である。その利点と実際のアプリケーションを紹介しよう:
多言語データセットを扱う本番環境でZilliz Cloudを使用する利点:
1.効率的なベクトルインデックスと検索: Zilliz Cloudは高度なベクトルインデキシングアルゴリズムを使用しているため、大規模な多言語データセットを非常に効率的に検索できます。これは、スピードと効率が要求される本番環境で特に有効です。
2.スケーラビリティ: Zilliz Cloudは大規模データを扱うように設計されています。データセットの増大に合わせて容易にスケールアウトできるため、本番環境での堅牢な選択肢となります。
3.多言語対応: Zilliz Cloudは多言語にも対応しており、多言語データの処理に最適です。Zilliz Cloudは様々な言語のデータを処理し、インデックスを作成することができるため、多言語環境で効率的な検索と取得が可能です。
Zillizが多言語環境で優れている実際のアプリケーション:
1.Eコマースのレコメンデーション:異なる言語を話す顧客に対応するグローバルEコマースプラットフォームにおいて、Zillizは正確な商品レコメンデーションを提供することができます。多言語の顧客行動データを処理し、インデックス化することで、Zillizは言語に関係なく、各ユーザーにパーソナライズされたレコメンデーションを生成することができます。
2.多言語カスタマーサポート: グローバルな顧客基盤を持つ企業は、しばしば多言語でのカスタマーサポートを提供する必要があります。Zillizは、様々な言語での顧客からの問い合わせを理解し、対応できるインテリジェントなチャットボットを提供し、カスタマーサポートの効率と効果を向上させることができます。
3.グローバルコンテンツディスカバリー: Zillizは、ニュースアグリゲーターやソーシャルメディアサイトのようなグローバルコンテンツプラットフォームのコンテンツディスカバリーを改善することができます。複数の言語でコンテンツをインデックス化することで、ユーザーは自分の好きな言語で関連するコンテンツを発見することができます。
これらは、Zillizが本番環境でどのように多言語データセットを扱うことができるかのほんの一例に過ぎません。詳しくは、こちらのベクトルデータベースの使用例ページをご覧ください。
結論
このガイドを通して、多言語ベクトル埋め込みと、ベクトル類似検索の文脈におけるその強力なアプリケーションの世界についての貴重な洞察を得ることができました。
最新の NLP アプリケーションにおける多言語対応の重要性と、多様な言語データをベクトル空間に埋め込むことの難しさをご理解いただけたと思います。この知識があれば、Milvusと多言語埋め込みモデルを探求し、実験することができ、言語の境界を超えた、言語にとらわれないアプリケーションの新たな可能性を解き放つことができます。
その他のリソース
- 詳細なコメントを含む全コード:https://www.kaggle.com/code/deniskuria/notebook1e4c44ebed
- Milvus ドキュメンテーション: https://milvus.io/docs/
- BGE-M3ドキュメント: BGE M3 Milvusドキュメント
- Zilliz Cloud: https://zilliz.com/cloud
- ミルバス・コミュニティ: https://github.com/milvus-io/milvus/discussions