このブログ投稿では、ベクトル データベース、ベクトル検索、および比較可能なベクトルの保存と検索を容易にする Python の Langchain パッケージの基礎について説明します。
私たちの旅を始めるにあたって、「エンベディング」として知られる極めて重要なコンセプトから始めます。
この記事では、エンベディングの概念について説明します。これは、機械が容易に理解できる形式でテキスト データを表現できるようにする機械学習の基本的な側面です。
基本的に、埋め込みはテキストのベクトル表現として機能し、複雑に絡み合った単語、文、文章を機械が処理できる数値形式に変換します。
差し迫った問題が 1 つ生じます。それは、人間はこれらの埋め込みを解読できるのかということです。答えはいいえだ。埋め込みは本質的に、テキスト情報をカプセル化する一連の数値です。
したがって、埋め込みベクトルを理解して操作することは、人間にとっては困難な作業になる可能性がありますが、機械は簡単に処理できます。
テキストから埋め込みを生成する手法は無数に存在します。注目すべき手法としては、TF-IDF、Word2Vec、Glove、BERT などが挙げられます。現代の機械学習の分野では、単語の埋め込みよりも文の埋め込みが人気を集めています。
テキストの本質を表すこれらの文埋め込みは、「all-MiniLM-L6-V2」や「all-mpnet-base-v2」などの事前トレーニングされた文変換モデルから取得できます。
これらのモデルは、特定のテキストに対して固定次元 (通常は 384 または 768 次元) の埋め込みを生成します。
エンベディングの基礎とその生成のためのさまざまなテクニックについて説明したので、次は、これらの高次元のエンベディング ベクトルをベクトル ストアに保存するという課題に焦点を移しましょう。
ベクター データ ストアは、オーディオ、ビデオ、画像、テキストなどを含むさまざまなデータ タイプの高次元埋め込み表現を保存するように設計された特殊なデータベースです。
その中心的な機能の 1 つは、指定されたクエリ ベクトルによく似たベクトルをストア内で効率的に検索する機能です。
ベクター ストアは、エンベディングを保存し、これらのベクター間の類似性検索を実行するプロセスを合理化し、高次元データ表現の管理と取得を簡素化します。
ベクトル埋め込みの領域では、類似性検索には 2 つ以上の埋め込み間の近接性または関連性の定量化が含まれます。通常、これは、さまざまな距離メトリックを使用して類似性を計算することによって実現されます。一般的に使用され、広く認識されている距離指標には、ユークリッド距離、マンハッタン距離、コサイン距離などが含まれます。これらのメトリクスは、ベクトル間の類似性または非類似性の程度を測定するのに役立ち、データ内の効果的な類似性検索を容易にします。
たとえば、グラフ上の 2 点間の類似性または近さを判断する場合、ユークリッド距離が一般的に使用されます。この距離は、次の式を使用して計算できます。
ユークリッド距離 = [(x2 - x1)^2 + (y2 - y1)^2]^0.5
ここで、(x1, y1) はグラフ上の 1 番目の点の座標を表し、(x2, y2) は 2 番目の点の座標を表します。この計算の結果は、2 つの点の間の空間的分離の尺度を提供し、グラフ内の位置に関する点の類似性または非類似性を示します。
同様に、類似性検索では、各レコードがデータ ポイントとして機能する高次元空間内に埋め込みが表示されます。
以下のコード行は、指定された入力データの上位 5 つの類似エンベディングを取得する方法を示しています。
distance, n = vector_store.search(input_embedding, k=5)
このコードは、入力データによく似た上位 5 つの埋め込みのリストを返すため、推奨システム、コンテンツ検索などのさまざまなアプリケーションにとって貴重なツールになります。
Vector_store.search() 関数の出力には、上位 k 個の類似した埋め込みと、input_embedding からのそれぞれの距離が含まれます。パラメータ「k」は、類似性検索で取得する最も近い埋め込みの数を決定する構成可能な値です。 「k」を設定すると、検索操作によって返される結果の希望の数を制御できます。
ベクター ストアの基礎的な理解を確立したので、LangChain パッケージと FAISS について詳しく見ていきましょう。これらのツールは、高次元の埋め込みを操作し、効率的な類似性検索を実行する能力をさらに強化します。
簡単に言えば、LangChain は、大規模言語モデル (LLM) の機能を利用するアプリケーションを構築するために設計されたフレームワークです。さらに詳しい情報とリソースについては、LangChain の公式ドキュメントを参照してください。
逆に、「Facebook AI類似性検索」の略であるFAISSは、従来のハッシュベースのアプローチとは異なり、類似したエンベディングを検索するための迅速かつ効率的な手段を開発者に提供するPythonライブラリです。
このライブラリは Facebook AI チームによって開発され、高次元空間での類似性検索タスクのための強力な機能を提供します。
FAISS は、独自のサーバーでホストできるオープンソース ライブラリです。
LangChain と FAISS の探求では、LangChain フレームワーク内で FAISS を実装することを目指します。以下は、この記事で焦点を当てる LangChain の FAISS 統合の主要な API の一部です。
add_documents() : この関数を使用すると、追加のドキュメントをベクター ストアに組み込むことができます。
add_embeddings() : ベクトル ストアにさらに埋め込みを追加できるようにします。
from_documents() : この API は、提供されたドキュメントに基づいて VectorStore を返します。
from_embeddings() : この関数は、指定された埋め込みから生成された FAISS インデックスを提供します。
load_local() : これを使用して、ディスクから FAISS インデックスをロードします。
save_local() : FAISS インデックスをディスクに保存できます。
minimumity_search() : この関数は、指定されたクエリに最も類似したドキュメントを取得します。
minimumity_search_by_vector() : 指定された埋め込みに最も類似したドキュメントを取得します。
これらの API は、LangChain の機能と FAISS を組み合わせるための基盤を形成し、アプリケーション内で埋め込みを操作し、効率的な類似性検索を実行できるようにします。
メタフィルタリングは、LangChain FAISS の検索クエリの結果を絞り込むために使用される貴重な技術です。通常、メタ フィルタリングには、プレフィルタリングとポストフィルタリングの 2 種類があります。私たちのフレームワークでは、特に検索クエリの事後フィルタリングをサポートしています。
検索結果のメタ フィルタリングの概念は、FAISS の LangChain バージョンで利用できる機能であり、FAISS の元の実装には存在しないことに注意することが重要です。このポストフィルタリング機能により、検索結果の精度と関連性が向上し、よりカスタマイズされた結果がユーザーに提供されます。
LangChain FAISS API の知識を身につけて、LangChain FAISS の Python 実装について詳しく見ていきましょう。この実装により、埋め込みを操作し、類似性検索を実行し、ポスト フィルタリング手法を適用して、LangChain フレームワーク内で検索結果を微調整できるようになります。
これらの機能を自由に探索および活用して、大規模言語モデルと FAISS による高度な類似性検索の力を活用するアプリケーションを作成してください。
この説明ガイドでは、スタンフォード データセットをベース データセットとして選択し、LangChain FAISS でのメタ フィルタリングの動作を示すためにいくつかの列を追加しました。
必要なパッケージのインストールとインポートから始めます
!pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle
次に、データセットをインポートします。
passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data
データセットを取得したら、テキスト データをベクトルに変換するための埋め込み関数を初期化する必要があります。 384 次元のエンベディングを生成する「sentence-transformers/all-MiniLM-L6-V2」を使用しました。
from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
メタデータ情報を設定していきます。メタデータには、各埋め込み (コンテンツ) のドキュメント ID とドキュメント言語を追加しました。
start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)
以上です…今から FAISS インデックスを構築します。
faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)
ここで、FAISS インデックスをディスクに保存し、再度ロードしてみます。
faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")
FAISS インデックスの構築、保存、ロードが完了しました。推理の時間です。いくつかのクエリを検索し、FAISS インデックスをテストしてみます。
まず、「無神論」に関連する類似文書のトップ 5 を取得します。
start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5)
まあ、結果は納得です。しかし、それでも、私たちはさらに探索していきます…
今回は、メタ フィルタリングを使用して別の言語クエリを試してみます。フィルタリング基準が {lang: 'ru_RU'} である必要があることを示すロシア語のクエリを実行します。
#Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)
ここでは、ベクター ストアから最も類似した 10 個のドキュメントを取得し、フィルター条件を適用してクエリの上位 5 個のドキュメントを取得することについて説明しました。
この記事を終えると、あなたはベクトル ストアとベクトル検索についてしっかりと理解できたと思います。また、LangChain FAISS の機能を説明するためのデモも提供しました。
ChromaDb、Qdrant、Milvus などの他のベクター ストアを探索することを強くお勧めします。
各ベクター ストアには独自の利点と欠点があるため、ユースケースの特定の要件に基づいて選択してください。
楽しくて実りある学習の旅になることを願っています。