エンベッディングの概要
エンベッディングは、データを高次元空間にマッピングするための機械学習の概念であり、類似したセマンティックのデータが近くに配置される。通常、BERTまたは他のTransformerファミリーのDeep Neural Networkであるエンベッディング・モデルは、テキスト、画像、および他のデータタイプのセマンティクスを、ベクトルとして知られる一連の数値で効果的に表現することができます。これらのモデルの主な特徴は、高次元空間におけるベクトル間の数学的距離が、元のテキストや画像のセマンティクスの類似性を示すことができることです。この特性は、GoogleやBingのようなウェブ検索エンジン、eコマースサイトの商品検索やレコメンデーション、そして最近話題の生成AIにおけるRAG(Retrieval Augmented Generation)パラダイムなど、多くの情報検索アプリケーションを解き放つ。
エンベッディングには主に2つのカテゴリがあり、それぞれが異なるタイプのベクトルを生成する:
高密度埋め込み:ほとんどの埋め込みモデルは、情報を数百から数千次元の浮動小数点ベクトルとして表現します。ほとんどの次元が0でない値を持つため、出力は「密な」ベクトルと呼ばれます。例えば、一般的なオープンソースの埋め込みモデルBAAI/bge-base-en-v1.5は、768個の浮動小数点数からなるベクトル(768次元浮動小数点ベクトル)を出力します。
疎な埋め込み:これに対して、スパース埋め込みは、ほとんどの次元がゼロのベクトル(スパースベクトル)を出力します。これらのベクトルは、多くの場合、トークン語彙のサイズによって決定されるはるかに高い次元(数万またはそれ以上)を持っています。スパース・ベクトルはディープ・ニューラル・ネットワークやテキスト・コーパスの統計解析によって生成される。その解釈のしやすさと、より優れた領域外汎化能力により、スパース埋め込みは密な埋め込みを補完するものとして開発者に採用されつつあります。
Milvusはベクトルデータの管理、保存、検索のために設計されたベクトルデータベースです。主流の埋め込みと再ランク付けモデルを統合することで、元のテキストを検索可能なベクトルに簡単に変換したり、強力なモデルを使用して結果を再ランク付けし、RAGのより正確な結果を達成することができます。この統合により、テキスト変換が簡素化され、エンベッディングやリランキングコンポーネントを追加する必要がなくなるため、RAGの開発と検証が効率化されます。
エンベッディングを実際に作成するには、Using PyMilvus's Model To Generate Text Embeddingsを参照してください。
埋め込み関数 | タイプ | APIまたはオープンソース |
---|---|---|
openai | 密な | API |
センテントランスフォーマー | 密 | オープンソース |
スプラード | スパース | オープンソース |
bge-m3 | ハイブリッド | オープンソース |
ボヤガイ | 密な | API |
ジーナ | 密な | API |
コヒーレ | 濃い | API |
講師 | デンス | オープンソース |
ミストラルAI | デンス | API |
ノミック | 密な | API |
mGTE | ハイブリッド | オープンソース |
例1: 密なベクトルを生成するためにデフォルトの埋め込み関数を使う
Milvusで埋め込み関数を使うには、まずPyMilvusクライアントライブラリを、埋め込み生成のための全てのユーティリティをラップしたmodel
サブパッケージとともにインストールします。
pip install "pymilvus[model]"
model
サブパッケージはOpenAI,Sentence Transformers,BGE M3,SPLADE事前学習モデルなど様々な埋め込みモデルをサポートしています。簡略化のため、この例ではDefaultEmbeddingFunction
を使用します。このモデルはすべてMiniLM-L6-v2文変換モデルで、約70MBあり、最初の使用時にダウンロードされます:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()
# Data from which embeddings are to be generated
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
embeddings = ef.encode_documents(docs)
# Print embeddings
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
期待される出力は以下のようなものです:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
例2: BGE M3モデルを使用して、1回の呼び出しで密なベクトルと疎なベクトルを生成する
この例では、BGE M3ハイブリッドモデルを使用して、テキストを密なベクトルと疎なベクトルの両方に埋め込み、関連文書を検索するために使用します。全体的な手順は以下の通り:
BGE-M3モデルを使ってテキストを密なベクトルと疎なベクトルに埋め込む;
密なベクトルと疎なベクトルを格納するMilvusコレクションをセットアップする;
Milvusにデータを挿入;
検索と結果の検査。
まず、必要な依存関係をインストールする必要がある。
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
BGE M3を使って、埋め込み検索用のドキュメントとクエリをエンコードする。
# 1. prepare a small corpus to search
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
query = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])