ベクトル埋め込み入門:ベクトル埋め込みとは何か?
このブログポストでは、ベクトル埋め込みという概念を理解し、その応用、ベストプラクティス、埋め込みを扱うためのツールを探ります。
シリーズ全体を読む
- BGE-M3とSplade: スパース埋め込みを生成する2つの機械学習モデルの探究
- SPLADEスパース・ベクターとBM25の比較
- ColBERTの探求:効率的な類似検索のためのトークン・レベルの埋め込みとランキング・モデル
- UnstructuredとMilvusによるEPUBコンテンツのベクトル化とクエリ
- バイナリ・エンベッディングとは?
- RAGアプリケーションのためのウェブサイト・チャンキングと埋め込み入門ガイド
- ベクトル埋め込み入門:ベクトル埋め込みとは何か?
- 画像検索のための画像埋め込み:詳細な説明
- OpenAIのテキスト埋め込みモデルを使うための初心者ガイド
- DistilBERT:BERTの蒸留バージョン
- ベクトル量子化のパワーを解き放つ:効率的なデータ圧縮と検索のテクニック
ベクトル埋め込みを理解し、いつ、どのように使うか。MilvusとZilliz Cloudのベクターデータベースを使用した実世界のアプリケーションを探求する。
ベクトル埋め込みはデータポイントの数値表現であり、非構造化データの検索を容易にする。これらのエンベッディングは、 Milvus や Zilliz Cloud (フルマネージドMilvus)のような特殊なデータベースに格納され、高度なアルゴリズムとインデックス技術を利用してデータを迅速に検索します。
大規模言語モデル](https://zilliz.com/glossary/large-language-models-(llms))(LLMs)のような最新の人工知能(AI)モデルは、自然言語を理解し、関連する応答を生成するためにテキストベクトル埋め込みを使用します。さらに、LLMの高度なバージョンでは、RAG(Retrieval Augmented Generation)を使用して、タスクに特化したアプリケーションのために外部のベクトルストアから情報を取得する。
このブログポストでは、ベクトル埋め込みという概念を理解し、その応用、ベストプラクティス、埋め込みを扱うためのツールを探ります。
ベクトル埋め込みとは?
ベクトル埋め込みとは、数値データ点のリストのことで、それぞれの数値がデータの特徴を表しています。これらの埋め込みは、データセット内のつながりを分析することで得られます。互いに近いデータ点は意味的に類似していると識別されます。
埋め込みは、データを高次元ベクトル空間にマッピングするように訓練された深層学習モデルを用いて定式化される。BERTやData2Vecのような一般的な埋め込みモデルは、多くの最新のディープラーニングアプリケーションの基礎を形成している。
さらに、ベクトル埋め込みは、その効率の良さから、NLPやCVアプリケーションでよく使われています。
ベクトル埋込みの種類
埋め込みベクトルには、その次元数によって、dense, sparse,, binary embeddingsの3種類があります。ここでは、それぞれの特徴と使い方の違いを説明します:
1.密な埋め込み
ほとんどの非ゼロ要素でデータ点を表現するベクトル埋め込みは密です。ゼロ値も含めてすべてのデータを格納するため、より細かい情報を捉えることができ、ストレージ効率が悪くなります。
Word2Vec、GloVe、CLIP、BERTは、入力データから密なベクトル埋め込みを生成するモデルです。
2.疎な埋め込み
スパースベクトル埋め込みは、ベクトル要素がほとんどゼロの高次元ベクトルです。スパース埋め込みにおける非ゼロ値は、コーパスにおけるデータ点の相対的な重要度を表します。スパース埋め込みは、メモリやストレージをあまり必要とせず、単語頻度のような高次元のスパースデータに適しています。
TF-IDFやSPLADEはスパースベクトル埋め込みを生成する一般的な手法である。
3.バイナリ埋め込み
バイナリ埋め込みは、情報を1と0の2ビットのみで格納します。この格納形式は、32ビット浮動小数点整数よりも大幅に効率的で、データの検索性を向上させます。しかし、データの精度を落とすことになるので、情報の損失が生じます。
ともあれ、バイナリ埋め込みは、わずかな精度よりもスピードが優先される特定のユースケースで人気があります。
ベクトル埋め込みはどのように作られるのか?
洗練されたディープラーニングモデルと統計的手法は、ベクトル埋め込みを作成するのに役立ちます。これらのモデルは入力データのパターンとつながりを識別し、データポイント間の違いを学習する。モデルは、基礎となる接続の理解に基づいて、n次元空間のベクトル埋め込みを生成する。
N次元空間は、我々の3次元的思考を超え、データを多角的に捉える。高次元のベクトル埋め込みは、データポイントからより細かいディテールを捉えることを可能にし、正確なアウトプットをもたらす。
例えば、テキストデータでは、高次元空間を利用することで、単語の微妙な意味の違いを捉えることができます。2次元空間で操作すると、「疲れた」と「疲れ果てた」という単語は一緒にグループ化される。n次元空間では、それらを異なる次元に投影し、感情の違いを捉える。数学的には、次のベクトルはn次元空間のベクトルv
である:
v=[v1,v2,...,vn]である。
ベクトル埋め込みを作成するための2つの一般的な手法があります:
ニューラルネットワーク
畳み込みニューラルネットワーク](https://zilliz.com/glossary/convolutional-neural-network)(CNNs)やリカレントニューラルネットワーク (RNNs)などのニューラルネットは、データの複雑性を学習することに優れている。例えば、BERTは、単語の意味を理解し、埋め込みを生成するために、単語の近傍語を分析する。
行列因数分解
ニューラルネットワークとは異なり、行列因数分解はより単純な埋め込みモデルです。これは訓練データを行列として受け取り、それぞれの行と列がデータレコードを表します。そして、このモデルはデータポイントを低ランクの行列に因数分解します。行列分解は推薦システムでよく使われ、入力行列はユーザーを表す行とアイテム(映画など)を表す列を持つユーザー評価行列です。ユーザ埋め込み行列とアイテム埋め込み行列の転置行列を掛け合わせると、元の行列に近似した行列が生成される。
様々なツールやライブラリが、入力データから埋め込み行列を生成するプロセスを簡素化します。最も人気のあるライブラリには、TensorFlow、PyTorch、Hugging Faceなどがあります。これらのオープンソースのライブラリやツールは、埋め込みモデルを作成するためのユーザーフレンドリーなドキュメントを提供しています。
以下の表は、様々なエンベッディングモデルとその説明、公式ドキュメントへのリンクの一覧です:
| :------------------:| :---------------------------------------------------------------------------------------------------------------------------------------------:| :--------------------------------------------------------------------------------------------------------------------------------------------------------: | モデル** | 説明 | リンク | | ニューラルネットワーク|CNNやRNNのようなニューラルネットワークは、ベクトル埋め込みを生成するのに便利なデータパターンを効果的に識別します。例えば、Word2Vec。| https://developers.google.com/machine-learning/crash-course/introduction-to-neural-networks/video-lecture | Matrix Factorization|行列因数分解は、推薦システムのようなフィルタリングタスクに適している。入力行列を操作することで、ユーザーの嗜好を捉える。| https://developers.google.com/machine-learning/recommendation/collaborative/matrix | GloVe|GloVe は単一方向の埋め込みモデルである。単一単語に対する単一単語埋め込みを生成する。 | https://nlp.stanford.edu/projects/glove/ | BERT|BERT (Bidirectional Encoder Representations from Transformers)は、テキストデータを双方向に解析する事前学習済みモデルである。 | https://zilliz.com/learn/bge-m3-and-splade-two-machine-learning-models-for-generating-sparse-embeddings#BERT-The-Foundation-Model-for-BGE-M3-and-Splade | ColBERT| トークン・レベルの埋め込みとランキング・モデル。 | SPLADE|スパース埋め込みを生成する高度な埋め込みモデル。 | https://zilliz.com/learn/bge-m3-and-splade-two-machine-learning-models-for-generating-sparse-embeddings#SPLADE | BGE-M3|BGE-M3は、BERTの機能を拡張する高度な機械学習モデル。 | https://zilliz.com/learn/bge-m3-and-splade-two-machine-learning-models-for-generating-sparse-embeddings#BGE-M3
ベクトル埋め込みは何に使われるのか?
ベクトル埋め込みは、様々な最新の検索やAIタスクで広く使われています。これらのタスクには以下のようなものがあります:
- 類似探索:*** 類似探索は、高次元空間で類似したデータ点を見つける技術です。これは、ユークリッド距離やジャカード類似度のような類似性尺度を用いて、ベクトル埋め込み間の距離を測定することによって行われる。最近の検索エンジンは、ユーザーの検索に対して関連するウェブページを検索するために類似検索を利用している。
- レコメンデーションシステム:***レコメンデーションシステムは、ベクトル化されたデータに依存して、類似したアイテムをクラスタリングする。同じクラスタからの要素は、ユーザーへの推薦として使用される。システムは、人口統計や嗜好に基づくユーザーのグループや、製品のグループなど、さまざまなレベルでクラスタを作成する。これらの情報はすべて、実行時に効率的かつ正確に検索できるよう、ベクトル埋め込みデータとして保存される。
- 検索拡張生成(RAG)**:RAGは、大規模な言語モデルの幻覚的な問題を緩和し、追加的な知識を与えるための一般的な手法です。埋め込みモデルは、外部知識やユーザクエリをベクトル埋め込みに変換する。ベクトル・データベースは埋め込みを保存し、ユーザーのクエリに最も関連する結果の類似性検索を行う。LLMは検索された文脈情報に基づいて最終的な回答を生成する。
Milvusによるベクトル埋め込みデータの格納、索引付け、検索
Milvusはベクトル埋め込みを保存、索引付け、検索するための組み込みライブラリを提供しています。ここでは PyMilvus
ライブラリを使ったステップバイステップのアプローチを紹介します:
1.ライブラリのインストールとMilvusデータベースのセットアップ
PymilvusはMilvusのPython SDKであり、
gensim` はNLPのPythonライブラリである。以下のコードを実行してライブラリをインストールする:
pip install -U -pymilvus gensim
このチュートリアルでは、Dockerを使用してMilvusに接続します。ターミナルで以下のコマンドを実行し、Milvusをインストールしてください:
> wget -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh
> bash standalone_embed.sh start
ローカルのMilvusベクターデータベースをセットアップするには、MilvusClientインスタンスを作成し、milvus_demo.db
のようなファイル名を指定してすべてのデータを保存します。
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
2.ベクトル埋め込みを生成する
以下のコードでは、埋め込みを格納するコレクションを作成し、gensim
から事前に学習されたモデルをロードし、ice や water のような簡単な単語の埋め込みを生成します:
import gensim.downloader as api
from pymilvus import ( connections, FieldSchema, CollectionSchema, DataType) # コレクションを作成する。
# コレクションを作成する
fields = [ FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False), FieldSchema(name="words", dtype=DataType.VARCHAR, max_length=50), FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=50)] # コレクションの作成
schema = CollectionSchema(fields, "Demo to store and retrieve embeddings")
demo_milvus = client.create_collection("milvus_demo", schema)
# 学習済みモデルをgensimからロードする。
model = api.load("glove-wiki-gigaword-50")
# エンベッディングを生成
ice = model['ice'].
水 = model['water']
cold = model['cold']モデル
tree = model['tree'] ツリー
man = model['男']モデル
woman = model['woman'] (ウーマン = モデル['ウーマン'])
child = model['child']
女性 = model['female']
3.ベクトル埋め込みを保存する
前のステップで生成されたベクトル埋め込みを、上で作成した demo_milvus
コレクションに格納する:
#コレクションにデータを挿入する
data = [ [1,2,3,4,5,6,7,8], # フィールド pk
['ice','water','cold','tree','man','woman','child','female'], # field words
[氷, 水, 冷たい, 木, 男, 女, 子供, 女], # field embeddings].
insert_result = demo_milvus.insert(data)
# 最終的なエンティティが挿入された後、メモリに成長中のセグメントが残らないようにフラッシュを呼び出すのがベスト
demo_milvus.flush()
4.エントリーにインデックスを作成する
インデックスはベクトル検索を高速化する。以下のコードでは、IVF_FLAT
インデックス、L2 (ユークリッド距離)
メトリック、128 パラメータを使用してインデックスを作成します:
index = { "index_type":index = { "index_type": "IVF_FLAT", "metric_type":"L2", "params":{"nlist":128},}
demo_milvus.create_index("embeddings", index)
5.ベクトル埋め込み検索
ベクトル埋め込みを検索するには、.load()
メソッドを使ってMilvusコレクションをメモリ上にロードし、ベクトルの類似度検索を行います:
demo_milvus.load()
demo_milvus.load() # ベクトル類似性検索を行う:
data = [cold]search_params = { "metric_type":"L2", "params":{"nprobe":10},}
result = demo_milvus.search(data, "embeddings", search_params, limit=4, output_fields=["words"])
ベクトル埋め込みを使うためのベストプラクティス
ベクトル埋め込みで最適な結果を得るには,埋め込みモデルを注意深く使う必要があります.ベクトル埋め込みを使うためのベストプラクティスは以下の通りです:
1.正しい埋め込みモデルの選択
エンベッディングモデルは、タスクによって適しているものが異なります。例えば、CLIPはマルチモーダルなタスクのために設計され、GloVeはNLPタスクのために設計されています。埋め込みモデルの選択は、データの必要性と計算の限界に基づいて行うことで、より良いアウトプットが得られます。
2.埋め込みパフォーマンスの最適化
BERT や CLIP のような事前に訓練されたモデルは、良い出発点を提供します。しかし、これらは性能向上のために最適化することができます。
ハイパーパラメータのチューニングも、最適な性能のための重要な特徴の組み合わせを見つけるのに役立ちます。データ増強は、埋め込みモデルの性能を向上させるもう一つの方法です。これはデータのサイズと複雑さを人工的に増大させるもので、データが限られたタスクに適している。
3.モニタリング埋め込みモデル
エンベッディング・モデルの継続的なモニタリングは、時間の経過とともにそのパフォーマンスをテストします。これにより、モデルの劣化に関する洞察を得ることができ、正確な結果を得るための微調整が可能になります。
4.進化するニーズを考慮する
データの増加やフォーマットの変更など、データのニーズが変化すると精度が低下する可能性があります。データニーズに応じてモデルを再トレーニングし、微調整することで、正確なモデル性能を確保します。
よくある落とし穴とその避け方
モデル・アーキテクチャの変更
ファインチューニングとハイパーパラメータのチューニングは、基礎となるモデル・アーキテクチャを変更することができる。モデルはベクトル埋め込みを生成するので、大幅な変更は異なるベクトル埋め込みにつながる可能性がある。
完全に変更せずにモデルの性能を向上させるには、モデルのパラメータを完全に調整することは避けてください。その代わりに、Word2VecやBERTのような事前に訓練されたモデルを特定のタスク用に微調整する。
データ・ドリフト
データ・ドリフトは、モデルが学習したものからデータが変化したときに起こる。その結果、ベクトル埋め込みが不正確になる可能性があります。データを継続的に監視することで、モデルの要件と整合性を保つことができます。
誤解を招く評価指標
すべての評価指標は、異なるタスクに適しています。評価指標を無作為に選択すると、誤解を招く分析になり、モデルの真の性能が隠されてしまうかもしれません。
タスクに適した評価指標を慎重に選んでください。例えば、意味的差異にはコサイン類似度、翻訳タスクにはBLEUスコアなどです。
その他のリソース
ベクトル埋め込みをより深く理解する最善の方法は、関連するリソースを見たり、練習したり、業界の専門家と関わることです。以下は、ベクトル埋め込みをより深く理解するための方法です:
- Zilliz Learnシリーズ:https://zilliz.com/learn
- Zilliz用語集:https://zilliz.com/glossary
- 埋め込みモデルとMilvusとの統合: https://zilliz.com/product/integrations
- 学術論文
- [1810.04805] BERT: 言語理解のための深層双方向変換器の事前学習](https://arxiv.org/abs/1810.04805)
- ベクトルデータベースを評価するためのベンチマークツール:VectorDBBench: An Open-Source VectorDB Benchmark Tool
2.コミュニティへの参加
私たちのDiscord](https://discord.com/invite/8uyFbECzPX)コミュニティに参加して、様々な業界のGenAI開発者とつながり、ベクトル埋め込み、ベクトルデータベース、AIに関連するあらゆることについて議論しましょう。Stack Overflow、Reddit、GitHub の関連するディスカッションをフォローし、エンベッディングを扱う際に遭遇する可能性のある問題を学び、デバッグスキルを向上させましょう。
常に最新のリソースを入手し、コミュニティに参加することで、技術の進歩に伴ってスキルが向上し、AI業界で競争優位に立つことができます。
読み続けて

UnstructuredとMilvusによるEPUBコンテンツのベクトル化とクエリ
この投稿では、MilvusとUnstructuredフレームワークを使用してEPUBデータのベクトル化と検索を探求し、LLMのパフォーマンスを向上させるための実用的な洞察を開発者に提供します。

OpenAIのテキスト埋め込みモデルを使うための初心者ガイド
OpenAIのテキスト埋め込みモデルを使った埋め込み作成とセマンティック検索の総合ガイド。

ベクトル量子化のパワーを解き放つ:効率的なデータ圧縮と検索のテクニック
ベクトル量子化(VQ)は、データ圧縮技術の一つで、セントロイドと呼ばれる、より小さな代表ベクトルの集合で、類似したデータ点の大きな集合を表現する。