「Rustベースのベクトルデータベース、Qdrantに深く潜る」

「Rustベースのベクトルデータベース、Qdrantの奥深く探る」

イントロダクション

ベクトルデータベースは、非構造化および構造化データの表現を格納および索引化するための主要な場所となっています。これらの表現は、埋め込みモデルによって生成されるベクトル埋め込みです。ベクトルストアは、ディープラーニングモデル、特に大規模な言語モデルを使用したアプリの開発で重要な役割を果たしています。ベクトルストアの領域は常に進化しており、最近導入されたQdrantはその1つで、機能が充実しています。さあ、それについてもっと詳しく見ていきましょう。

学習目標

  • Qdrantの専門用語に慣れることで、より理解を深める
  • Qdrant Cloudにダイブし、クラスタを作成する
  • ドキュメントの埋め込みを作成し、Qdrantコレクションに保存する方法を学ぶ
  • Qdrantでクエリがどのように機能するかを探る
  • Qdrantのフィルタリングを弄って、その動作を確認する

この記事はData Science Blogathonの一環として公開されました。

埋め込みとは何ですか?

ベクトル埋め込みは、データを数値形式で表現する手段です。つまり、テキスト、写真、音声、ビデオなどのデータの種類に関係なく、n次元空間または数値ベクトルとして表します。埋め込みを使用すると、関連するデータをグループ化することができます。特定の入力は、特定のモデルを使用してベクトルに変換することができます。Googleによって作成された有名な埋め込みモデルであるWord2Vecは、単語をベクトル(ベクトルはn次元の点です)に変換します。各大規模言語モデルには、LLMの埋め込みを生成する埋め込みモデルがあります。

埋め込みは何に使用されますか?

単語をベクトルに変換する利点の1つは、比較が可能であるということです。数値入力またはベクトル埋め込みとして2つの単語が与えられた場合、コンピュータはそれらを直接比較することはできませんが、それらを比較することができます。類似した埋め込みを持つ単語をグループ化することが可能です。王、女王、王子、王女といった用語は、関連するクラスタに表示されます。

この意味で、埋め込みは、与えられた用語に関連する単語を特定するのに役立ちます。これは、文に使用され、入力された文に関連する文を返すデータが提供される場合に使用されます。これは、チャットボット、文の類似度、異常検知、セマンティックサーチなどの多くのユースケースの基礎となります。私たちが提供するPDFまたはドキュメントに基づいて質問に答えるために開発するチャットボットは、この埋め込みの概念を利用しています。これは、すべての生成的大規模言語モデルが、それらに供給されるクエリに同様に関連付けられたコンテンツを取得するために使用する方法です。

ベクトルデータベースとは何ですか?

先述のように、埋め込みは、通常非構造化データの場合に数字形式で表される、あらゆる種類のデータの表現です。それでは、それらをどこに保存するのでしょうか?伝統的なRDBMS(リレーショナルデータベース管理システム)では、これらのベクトル埋め込みを保存することはできません。これがベクトルストア/ベクトルデータベースの登場する場所です。ベクトルデータベースは、効率的な方法でベクトル埋め込みを保存および取得するために設計されています。埋め込みモデルのサポートや似たようなベクトルを取得するために使用する検索アルゴリズムの種類によって異なる多くのベクトルストアが存在します。

Qdrantとは何ですか?

Qdrantは、新しいベクトル類似度検索エンジンおよびベクトルデータベースであり、安全性で知られるRust言語で構築された本番向けのサービスを提供しています。 Qdrantは、メタデータであるペイロードが付加された高次元ポイント(ポイントはベクトル埋め込みのこと)を保存、検索、管理するために設計されたユーザーフレンドリーなAPIを備えています。これらのペイロードは有用な情報となり、検索の精度向上およびユーザーへの洞察を提供します。Chromaなど他のベクトルデータベースに精通している方であれば、ペイロードはメタデータに似ており、ベクトルに関する情報を含んでいます。

Rustで書かれていることにより、Qdrantは高負荷下でも高速で信頼性のあるベクトルストアとなっています。他のデータベースとの違いは、Qdrantが提供するクライアントAPIの数です。現在、QdrantはPython、TypeScript/JavaScript、Rust、およびGoをサポートしています。QdrantはベクトルインデックスにHSNW(階層ナビゲーション小世界グラフ)を使用しており、コサイン、ドット、ユークリッドなどの多くの距離尺度を備えています。また、ボックスから推奨APIも利用できます。

Qdrantの用語を知る

Qdrantをスムーズに始めるためには、Qdrantベクトルデータベースで使用される用語/主なコンポーネントに慣れておくことが良い習慣です。

コレクション

コレクションは、各ポイントがベクトルとオプションのIDおよびペイロードを含む、名前付きのポイントのセットです。同じコレクション内のベクトルは、同じ次元を共有し、単一の選択したメトリックで評価されなければなりません。

距離メトリック

ベクトル同士の近さを測るために重要な距離メトリックは、コレクションの作成時に選択されます。Qdrantは次の距離メトリックを提供しています:ドット、コサイン、ユークリッド。

ポイント

Qdrant内の基本的なエンティティであるポイントは、ベクトル埋め込み、オプションのID、および関連するペイロードから構成されます。id:各ベクトル埋め込みの一意の識別子、ベクトル:データの高次元表現、構造化または非構造化の形式(画像、テキスト、ドキュメント、PDF、ビデオ、音声など)、ペイロード:ベクトルに関連するデータを含むオプションのJSONオブジェクトです。これはメタデータに似ており、検索プロセスでこれを使ってフィルタリングすることができます。

ストレージ

Qdrantは2つのストレージオプションを提供しています:

  • インメモリストレージ:すべてのベクトルをRAMに格納し、ディスクへのアクセスを最小限に抑えて速度を最適化します。
  • メモリマップストレージ:ディスク上のファイルにリンクされた仮想アドレススペースを作成し、速度と永続性の要件をバランスさせます。

これらは、Qdrantのすばやい開始に必要な主要な概念です。

Qdrant Cloud – 最初のクラスターを作成する

Qdrantは、ベクトルの格納と管理のためのスケーラブルなクラウドサービスを提供しています。クレジットカード情報なしで永久に無料の1GBクラスターも提供されています。このセクションでは、Qdrant Cloudでアカウントを作成し、最初のクラスターを作成するプロセスを進めます。

Qdrantウェブサイトにアクセスすると、上記のようなランディングページが表示されます。GoogleアカウントまたはGitHubアカウントでQdrantにサインアップすることができます。

ログイン後、上記の画面が表示されます。クラスターを作成するには、左のペインでダッシュボードの下にある「クラスター」オプションをクリックします。サインインしたばかりなので、クラスター数はゼロです。新しいクラスターを作成するには、「クラスターの作成」をクリックします。

今、クラスターに名前を付けることができます。無料のクラスターを提供するには、すべての構成が開始位置に設定されていることを確認してください。上記に表示されているプロバイダの1つと関連付けられたリージョンから1つを選択できます。

現在の構成を確認する

左側に現在の構成(0.5 vCPU、1GB RAM、4GBディスクストレージ)が表示されます。クラスターを作成するには、「作成」をクリックします。

新しく作成したクラスターにアクセスするには、APIキーが必要です。ダッシュボードのデータアクセスコントロールに移動して、新しいAPIキーを作成するには、「作成」ボタンをクリックします。

上記のように、APIを作成するために作成するクラスタを選択するドロップダウンメニューが表示されます。クラスタが1つしかないため、それを選択してOKボタンをクリックします。

上記に表示されているAPIトークンが表示されます。また、イメージの下部を見ると、クラスタに接続するためのコードスニペットも提供されています。

Qdrant – ハンズオン

このセクションでは、Qdrantベクトルデータベースを使用します。まず、必要なライブラリをインポートします。

!pip install sentence-transformers!pip install qdrant_client

最初の行は、sentence-transformer Pythonライブラリをインストールします。センテンストランスフォーマーライブラリは、文、テキスト、および画像の埋め込みを生成するために使用されます。このライブラリを使用して、異なる埋め込みモデルをインポートして埋め込みを作成することができます。次のステートメントは、Python用のqdrantクライアントをインストールします。では、クライアントを作成してみましょう。

from qdrant_client import QdrantClientclient = QdrantClient(    url="クラスタURL",    api_key="APIキー",)

QdrantClient

上記では、QdrantClientクラスをインポートして、先ほど作成したクラスタURLとAPIキーを指定してclientをインスタンス化しています。次に、埋め込みモデルを導入します。

# 埋め込みモデルを導入するfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')

上記のコードでは、SentenceTransformerクラスを使用してモデルをインスタンス化しています。使用した埋め込みモデルはall-mpnet-base-v2です。これは広く人気のある汎用のベクトル埋め込みモデルです。このモデルはテキストを入力して768次元のベクトルを出力します。データを定義しましょう。

# データdocuments = [    """Elephants, the largest land mammals, exhibit remarkable intelligence and \social bonds, relying on their powerful trunks for communication and various\ tasks like lifting objects \and gathering food.""",    """ Penguins, flightless birds adapted to life in the water, showcase strong \social structures and exceptional parenting skills. Their sleek bodies \enable efficient swimming, and they endure \harsh Antarctic conditions in tightly-knit colonies. """,    """Cars, versatile modes of transportation, come in various shapes and \sizes, from compact city cars to powerful sports vehicles, offering a \range of features for different preferences and \needs.""",    """Motorbikes, nimble two-wheeled machines, provide a thrilling and \liberating riding experience, appealing to enthusiasts who appreciate \speed, agility, and the open road.""",    """Tigers, majestic big cats, are solitary hunters with distinctive \striped fur. Their powerful build and stealthy movements make them \formidable predators, but their populations are threatened \due to habitat loss and poaching."""]

上記では、documentsという変数があり、5つの文字列のリスト(それぞれを単一のドキュメントと見なす)が含まれています。データの各文字列は特定のトピックに関連しています。一部のデータは要素に関連し、一部のデータは自動車に関連しています。データの埋め込みを作成しましょう。

# データの埋め込みembeddings = model.encode(documents)print(embeddings.shape)

モデルオブジェクトのencode()関数を使用して、データをエンコードします。エンコードするために、ドキュメントリストをencode()関数に直接渡し、結果のベクトル埋め込みをembeddings変数に格納します。埋め込みの形状を表示していますが、ここでは(5, 768)と表示されます。これは、5つのデータポイント、つまり5つのドキュメントがあり、各ドキュメントには768次元のベクトル埋め込みが作成されるためです。

コレクションの作成

今度は、コレクションを作成します。

from qdrant_client.http.models import VectorParams, Distanceclient.create_collection(    collection_name = "my-collection",    vectors_config = VectorParams(size=768, distance=Distance.COSINE))
  • コレクションを作成するためには、クライアントオブジェクトのcreate_collection()関数を使用します。「Collection_name」にはコレクション名「my-collection」を渡します
  • VectorParams: このqdrantのクラスは、ベクトルの設定(埋め込みサイズ、距離尺度など)を行います
  • Distance: このqdrantのクラスは、ベクトルのクエリ時に使用する距離尺度を定義します
  • 次に、vector_config変数に、ベクトルの埋め込みサイズ(786)と使用する距離尺度(COSINE)を設定します

ベクトル埋め込みの追加

コレクションを作成しました。これに対してベクトル埋め込みを追加します。

from qdrant_client.http.models import Batchclient.upsert (    collection_name = "my-collection",    points = Batch(        ids = [1,2,3,4,5],        payloads= [            {"category":"animals"},            {"category":"animals"},            {"category":"automobiles"},            {"category":"automobiles"},            {"category":"animals"}        ],        vectors = embeddings.tolist()    ))
  • qdrantにデータを追加するには、upsert()メソッドを呼び出し、コレクション名とポイントを渡します。先ほど学んだように、Pointはベクトル、オプションのインデックス、およびペイロードで構成されています。qdrantのBatchクラスを使用すると、1つずつではなくバッチでデータを追加することができます。
  • ids: ドキュメントにIDを付けています。現在、リストには5つのドキュメントがありますので、値の範囲を1から5に設定しています。
  • payloads: ペイロードには、ベクトルの詳細など、情報が含まれています。キーと値のペアで提供します。ここでは、各ドキュメントに対してカテゴリ情報を割り当てています。
  • vectors: ドキュメントのベクトル埋め込みです。これをnumpy配列からリストに変換して渡しています。

このコードを実行すると、ベクトル埋め込みがコレクションに追加されます。追加されたかどうかを確認するには、Qdrant Cloudが提供するクラウドダッシュボードにアクセスできます。以下の手順で確認できます:

ダッシュボードをクリックして新しいページを開きます。

これがqdrantダッシュボードです。ここで「my-collection」コレクションをクリックして、コレクションの中身を確認できます。

Qdrantクラウドでは、ポイント(ベクトル + ペイロード + ID)がクラスタ内のコレクションに実際に追加されていることが確認できます。次のセクションでは、これらのベクトルをクエリする方法について学びます。

Qdrant Vector Databaseのクエリ

このセクションでは、ベクトルデータベースをクエリし、結果をフィルタリングするためのフィルタを追加してみます。qdrantベクトルデータベースをクエリするためには、まずクエリベクトルを作成する必要があります。以下のように行います:

query = model.encode(['Animals live in the forest'])

クエリ埋め込み

上記のコードでquery埋め込みが作成されます。これを使用して、最も関連性の高いベクトル埋め込みをクエリします。

client.search(    collection_name = "my-collection",    query_vector = query[0],    limit = 4)

検索()クエリ

検索するには、クライアントオブジェクトのsearch()メソッドを使用し、以下を渡します:

  • Collection_name: コレクションの名前
  • query_vector: ベクトルストアで検索したいクエリベクトル
  • limit: search()関数が制限する検索結果の数

コードを実行すると、次の出力が生成されます:

クエリによって、トップに表示されるドキュメントは、カテゴリーが動物であることがわかります。したがって、検索は効果的であると言えます。次に、異なる結果が得られるように、別のクエリで試してみましょう。ベクトルはデフォルトでは表示または取得されないため、Noneに設定されています。

query = model.encode(['Vehicles are polluting the world'])client.search(    collection_name = "my-collection",    query_vector = query[0],    limit = 3)

今度は、に関連するクエリを与えましたが、ベクトルデータベースは関連するカテゴリ(自動車)のドキュメントを上位に正常に取得することができました。では、フィルタリングを行いたい場合はどうすればよいでしょうか?以下の方法で行うことができます:

from qdrant_client.http.models import Filter, FieldCondition, MatchValuequery = model.encode(['Animals live in the forest'])custom_filter = Filter(    must = [        FieldCondition(            key = "category",            match = MatchValue(                value="animals"            ),        )    ])
  • まず、クエリの埋め込み/ベクトルを作成しています。
  • qdrantライブラリからFilterFieldConditionMatchValueクラスをインポートしています。
  • Filter: フィルターオブジェクトを作成するために使用するクラスです。
  • FiledCondition: 検索をフィルタリングする内容を作成するためのクラスです。
  • MatchValue: qdrantベクトルデータベースにフィルタを適用するためのキーの値を指定するためのクラスです。

したがって、上記のコードでは、「カテゴリ」で「動物」と一致するキー「カテゴリ」を「マッチバリュー」に指定された値「動物」と一致するかどうかをチェックするFieldConditionを含むFilterを作成していることになります。これはシンプルなフィルタに対しては少し大きく見えますが、複数のキーでフィルタリングを行い、多くの情報を含むPayloadでフィルタリングしたい場合に、コードをより構造化するアプローチとなります。では、このフィルタを検索に使用してみましょう。

client.search(    collection_name = "my-collection",    query_vector = query[0],    query_filter = custom_filter,    limit = 4)

Query_filter

ここでは、query_filter変数にカスタムフィルターを設定しています。上位4つの一致ドキュメントを取得するために、limitを4に設定しています。クエリは動物に関連しています。コードを実行すると、次のような出力が生成されます:

出力では、動物のカテゴリーのみを選択するようにフィルタを設定したため、5つのドキュメントが存在しても上位3つの近傍ドキュメントのみを受け取りました。このように、ベクトル埋め込みをqdrantクラウドに保存し、これらの埋め込みベクトルに対してベクトル検索を実行し、最も近いドキュメントを取得し、出力をフィルタリングすることができます。

アプリケーション

以下のアプリケーションがQdrantベクトルデータベースを利用できます:

  • レコメンドシステム: Qdrantは高次元ベクトルを効率的にマッチングさせることができるため、ストリーミングサービス、eコマース、またはソーシャルメディアなどのプラットフォームでのパーソナライズされたコンテンツ推薦に適しています。
  • 画像およびマルチメディアの検索: Qdrantは画像やマルチメディアコンテンツを表すベクトルを処理できるため、画像データベースやマルチメディアアーカイブのための効果的な検索と取り出し機能を実装することができます。
  • 自然言語処理(NLP)アプリケーション: Qdrantのベクトルエンベディングのサポートは、大量のテキストデータセットを扱うアプリケーションにおいて、シーマンティックサーチ、ドキュメントの類似性マッチング、コンテンツ推奨などのNLPタスクに有用です。
  • 異常検知: Qdrantの高次元ベクトル検索は、異常検知システムで利用することができます。ベクトルを使って正常な振る舞いを表すものとの比較を通じて、ネットワークセキュリティや産業モニタリングなどの分野で異常を特定することができます。
  • 製品検索とマッチング: eコマースプラットフォームでは、製品の特徴を表すベクトルをマッチングすることにより、製品検索の能力を向上させることができます。これにより、ユーザーの好みに基づいた正確かつ効率的な製品推奨が可能となります。
  • ソーシャルネットワークでのコンテンツベースのフィルタリング: Qdrantのベクトル検索は、コンテンツベースのフィルタリングにおいてソーシャルネットワークで利用することができます。ベクトル表現の類似性に基づいて関連コンテンツを提供することで、ユーザーエンゲージメントを向上させることができます。

まとめ

データの効率的な表現への需要が高まる中、Qdrantは頑健で安全志向の言語であるRustで書かれたオープンソースの特徴豊かなベクトル類似性検索エンジンとして際立っています。Qdrantにはすべての人気のある距離メトリックスが含まれており、ベクトル検索をロバストな方法でフィルタリングする手段を提供しています。豊富な機能、クラウドネイティブアーキテクチャ、堅牢な用語を備えたQdrantは、ベクトル類似性検索技術の新時代への扉を開きます。この分野では新しい存在ですが、多くのプログラミング言語用のクライアントライブラリを提供し、サイズに合わせて効率的にスケーリングするクラウドも提供しています。

キーアウト

いくつかのキーアウトには以下があります:

  • Rustで作られたQdrantは、重い負荷下でも速度と信頼性を両立し、高性能なベクトルストアのためのベストチョイスです。
  • Qdrantの特徴的な点は、Python、TypeScript/JavaScript、Rust、Goの開発者向けのクライアントAPIのサポートです。
  • QdrantはHSNWアルゴリズムを活用し、Dot、Cosine、Euclideanなどのさまざまな距離メトリックスを提供し、開発者が自分の特定のユースケースに合わせてメトリックスを選択できるようにしています。
  • Qdrantはスケーラブルなクラウドサービスにシームレスに移行し、探査のためのフリーティアオプションを提供しています。クラウドネイティブアーキテクチャにより、データ量に関係なく最適なパフォーマンスを実現します。

よくある質問

この記事に表示されるメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more