「(ベクター)インデックスの隠れた世界」

『(ベクター)インデックスの秘密の世界』

常に知りたかったが、尋ねることを恐れた(ベクトル)インデックスについてのすべて。

ChatGPTの公開以来、LLM、RAG、ベクトルデータベースに関する新しいコンテンツがない日はほとんどありません。テクノロジーの世界はLLMの可能性で騒々しく、これが私たちの生活を変える最新のテクノロジーであると見なされています。それは一部の人々にとっては最善の方法であり、他の人々にとっては最悪の方法です。それと並んで、従来の知識の状況に適応するための動的な解決策として、検索補完生成(RAG)が登場しました。しかし、その背後には重要なプレーヤーがいます:ベクトルインデックスとデータベースです。

LLM、RAG、ベクトルデータベースの話題は盛り上がっていますが、これらのイノベーションを支える(ベクトル)インデックスはあまり知られていません。この記事では、インデックスの概念を解説し、広範なコレクション内の情報を簡単に見つけるためのインデックスの働きを理解するお手伝いをします。

1. インデックスとは何ですか?

私たち全員がこんな状況に出くわしたことがあります。友達の家に会いに行くことになりました。彼女が教えてくれた情報は「メトロタウン地区に住んでいます」というだけです。言われたメトロタウン地区に到着すると:

Photo by Manson Yim on Unsplash

そうですね、助けがなければ時間がかかりますよね!もし入り口に地図があったらなぁ…

これがインデックスの全体像です:人々(またはデータ)の位置を迅速に見つける方法です。

イエローページは、人々の名前に基づいて彼らの住まいを見つけるためのインデックスです。

インデックスはデータの取得速度を改善するために作られたデータ構造です。つまり、何を探しているかを迅速に見つけるために情報を整理する方法です。

データはキーを使用してインデックス化されます。順序はキーに基づいており、複数のキーを使用することもできます。イエローページでは、最初のキーが姓で、2番目のキーが名前です。

インデックスは必ずしもすべてのデータを保管するわけではありません。それは全データ内で特定のデータの位置を迅速に特定してアクセスするために使用される重要な部分に焦点を当てるだけです。

本の最後にあるインデックスは良い例です:それは単語を使用してページを見つける方法を示しており、各単語をページ番号にマップします。センテンス自体ではありません。

インデックスは検索エンジンとデータベースの基盤です:データの検索操作の効率と速度を向上させる重要な役割を果たします。

データをどのように整理するかの選択は重要であり、文脈によって異なります。

例として、イエローページの例で、もしインデックスが電話番号で組織され、名前が知っている場合、住所を見つけることはかなり困難です!

情報はそこにあります。結局は見つけることができますが、必要な時間がさえぎることでしょう。一方で、イエローページを使用すると、ページを一目で見るだけで、後ろを見る必要があるのか前を見る必要があるのかがわかります!辞書式順序により、おおよそ対数的な検索が可能です。それがインデックスの選択の重要性です。

一般的に、インデックスには非常に具体的な目的があります:データの迅速な挿入または取得、あるいは範囲クエリ(「今年の5月1日から8月15日までの間のデータをすべて取得」など)のようなより特殊なクエリを実行するために設計される場合があります。最適化する操作の選択によって、インデックスの形状が決まります。

オンライントランザクション処理(OLTP)とオンライン分析処理(OLAP)データベースの主な違いは、最適化したい操作の選択です:OLTPは行に対する操作に焦点を当てています(エントリの更新など)、一方、もう一方は列に対する操作に焦点を当てています(平均を計算するなど)。両方のデータベースが同じインデックスを使用しないのは、同じ操作を目指していないためです。

1.1 インデックスとデータ構造の違いは何ですか?

💡データ構造とは、コンピュータ内のデータを効率的にアクセスおよび操作できるように組織化して保存する方法です。このように説明すると、インデックスとデータ構造の違いは見えにくいことがありますが、実際にはどのような違いがあるのでしょうか? インデックスは、データの挿入、検索、ソート、フィルタリングに焦点を当てています。データ構造はより汎用的です。

インデックスはデータ構造を使用して構築されますが、通常はデータ自体を保存しません。

映画のデータベースを考えてみると、インデックスが更新されるたびに大きなファイルを移動したくありません。ファイルそのものではなく、ファイルへのポインタを保存します。ポインタは、ディスク上のファイルのアドレスと見なすことができます。

インデックスの一般的な概念についての理解ができたので、数値の例に焦点を当ててみましょう。次は一般的な数値インデックスのいくつかです:

  • 逆インデックス
  • ハッシュインデックス
  • Bツリー
  • 局所的に感知するハッシング(LSH)。

インデックスの動作原理をよりよく理解するために、最も基本的なインデックスである逆インデックスを探ってみましょう。

1.2 逆インデックス

逆インデックスは、検索エンジンで使用される標準的なインデックスです。

情報の位置を迅速に見つけることを目的として設計されており、取り出し時間を最適化します。

要するに、逆インデックスは内容を場所にマッピングします。まるで本の索引のようなものです。それは、特徴的な情報に対応するデータをマップするためによく使用されます。

たとえば、同じ建物に住んでいる人を知りたいとします。

まず、各名前について建物を持つテーブルが必要です(アリスを見つけるのに役立つテーブルです):

このテーブルは、新しい人が地区に到着したり出て行ったりするときに更新されます。

このテーブルで建物Bに住んでいる人を見つけたい場合、テーブル全体を繰り返し処理する必要があります。

技術的には可能ですが、テーブルのサイズに比例して計算時間が線形に増加するため、スケールしないでしょう。

地区にあるアパートの数を考えてみてください。一つずつプロフィールをチェックして建物Bに住んでいる全ての人を見つける場合、時間がかかります!

別の解決策は、逆インデックスを使用することです。建物がキーとなり、そこに住んでいる人々と接続されるようなテーブルを維持します:

このテーブルは前のテーブルと同時に維持されます。新しい人を追加または削除するコストは以前よりわずかに高くなりますが、取得時間はほとんどゼロに縮小されます!

建物Bに住んでいる人を見つけるには、単純にこのテーブルの「Building B」という行にアクセスすればよいのです。

逆電話検索は電話番号の逆インデックスです!

実際には、逆インデックスは(ユーザー、興味)のような単純なペア以上の複雑なデータを操作するため、少し複雑です。インデックスは通常、ハッシュテーブルとして保存されます。

相対的な単純さにもかかわらず、逆インデックスは検索エンジンで最も一般的に使用されるインデックスの一つです。

1.3 インデックスとデータベース

データベースはインデックスの上に構築されます。インデックスはデータベース内のデータのポインタや参照を格納することで、データの取得を強化します。実際のデータは保存されず、データに迅速にアクセスする手段として機能し、クエリのパフォーマンスを大幅に向上させます。

データベースはインデックス以上のものであり、データ管理の包括的なシステムです。実際のデータを保存し、整理し、管理し、データの整合性を保ち、トランザクションを処理し、インデックス以外のさまざまな機能を提供することで、データの保存と操作の中心的なハブとなります。インデックスはデータベース内でデータの取得を高速化しますが、データベースはデータの保存、管理、取得のための完全なエコシステムとして機能します。

簡単に言うと、インデックスはデータベース内の目的のデータへの案内板のようなものです。対照的に、データベースは実際のデータが存在する保管庫であり、そのデータを管理および操作するための様々なツールや機能が備わっています。

使用ケースによっては、全体のデータベースではなく、オーバーレイやデータ管理だけが必要な場合もありますが、これはコストがかかるかもしれません。

2. ベクトルインデックスとベクトルデータベース

2.1 ベクトルインデックスとは何ですか?

要するに、ベクトルインデックスは、キーがベクトルであるインデックスです

逆引きインデックスの例では、キーは単語(趣味や名前)でした。ベクトルインデックスでは、ベクトルを操作します。つまり、固定サイズの数値のシーケンスです。

サイズが4の2つのベクトル。

わかりました、わかりました、あなたが言っているのが聞こえます。「数学が苦手で、ベクトルを使いたくない」と言っていますね。

心配しないでください、ベクトルインデックスを理解するためには数学が得意である必要はありません。

知っておく必要があるのは、ベクトルを使用することで、強力で最適化された操作に依存できるということです。

最初の質問は「あなたたちのベクトルに魅力的な点は何ですか?」と思われるかもしれません。

例えば、あなたはついにアリスの家にたどり着きましたが、今度は何か食べる場所を探しています。最も近いレストランを見つけたいかもしれません。レストランのリストを探して、レストラン、専門料理、住所のテーブルを手に入れます。以下は見つけられる情報です:

これは役に立たなさそうですね。一つひとつ住所を読みながらどれだけ近いかを手動で評価するしかありません。最も近い場所をランキング付けを自動化しようとしてみることもできますが、生の住所を基に距離を計算することは難しいです(2つの通りが近くにあっても、異なる名前を持っているかもしれません)。

しかし、ここで各レストランの正確な緯度と経度を表すGPS位置のテーブルがあると想像してみてください。

各位置は2次元ベクトルです。これらのベクトルを使用すると、簡単な(そして高速な)数学的操作で自分の場所からの距離を簡単に計算できます。そして、一番近い場所、つまりあなたから最も近い場所をすばやく取得できます!

これで簡単に一番近いレストランを見つけることができます!

興味深い点は、テーブルを直接ベクトル(この例ではGPS位置)でインデックスすることで、最小距離のエントリを見つけるのに非常に高速化できることです。

ベクトルインデックスは、与えられたベクトルに対して最も近い、または最も類似したベクトルを効率的に取得するために設計された特殊なインデックスです。これらのインデックスは、最も類似したベクトルを効率的に特定するために最適化された数学的操作に依存しています。

この例では、使用された距離は一般的な距離ですが、余弦類似度メトリックなど、すべての既存の距離や類似度に対してインデックスがあります。

局所性鋭敏ハッシュ化(LSH)は、データセット内のk個の最も類似したデータポイントを見つけるために最も広く使用されており、さまざまな距離や類似度で機能します。

「それは素晴らしいけれど、私はデータベースでベクトルを使用していません。」

それが興奮するところです:何でもベクトルに変換することができます。

単純にバイナリ表現を取ると効率が悪いため、データの特性を保持する表現を見つけることが重要です。

ベクトルインデックスを使用して、異なる情報をベクトルとして表現し、システムの効率を向上させるのは標準的な手法となっています。ベクトル化は芸術となっています。

たとえば、画像データセットを持っており、与えられた画像に最も類似した画像を見つけるデータベースが必要な場合、画像のSIFT記述子を使用できます。

2.2 ベクトルインデックスとベクトルデータベースの違いは何ですか?

ベクトルインデックスとベクトルデータベースの違いは、インデックスとデータベースの違いと同じです:インデックスは単にデータの位置を素早く見つけるためのものであり、ベクトルデータベースはベクトルインデックスを使用して検索クエリを高速に実行するだけでなく、データを格納および維持し、追加の操作と特性を提供します。

ベクトルインデックスについて学んだ今、なぜLLMとRAGに関する議論でもベクトルインデックスについて話されるのか不思議に思うかもしれません。その理解には、まず迅速に説明しましょう。RAG、つまり検索拡張生成(Retrieval Augmented Generation)とは何かです。AGは、LLMsの固有の制限の1つである限られた知識を巧妙に回避するための方法として機能します。

LLMsは、彼らがトレーニングされたデータにしか気づいていません。彼らの知識を増やすための1つのテクニックは、プロンプトエンジニアリングであり、追加のデータをクエリプロンプトに統合することです。「このデータ{データ}を使用して、この質問に答えてください:{質問}」。

効果的であるが、このアプローチは新たな課題に直面している。プロンプトのサイズだけでなく、含めるデータが増えれば増えるほど、クエリのコストも高くなる。

これを克服するために、検索拡張生成では最も類似したデータのみを挿入することでデータの量を制限するため、ベクトルインデックスが重要な役割を果たします!

以下にその動作方法が示されています:

まず、すべてのドキュメントは、LLMsを使用してベクトルに変換されます(1)。具体的には、LLMのエンコーダー部分が使用されます。

これらのベクトルは、ベクトルインデックスに基づいてドキュメントをインデックス付けするために使用されます(2)。

クエリを行う際には、クエリがLLMを使用してベクトル化されます(3)。その結果のベクトルは、ベクトルインデックスでクエリされ、最も類似したドキュメントが取得されます(4)。これらのドキュメントは、プロンプトエンジニアリングを使用してクエリに回答するために使用されます(5)。

以上です!

おわかりいただけるように、LLMと同様に、ベクトルインデックスはRAGsにおいても中核的な位置を占めています。

一部の人々は、ベクトルインデックスの代わりにベクトルデータベースを使用することを好むかもしれません。それは1つのデータを複数のアプリケーションで再利用したい場合には問題ありません。ただし、検索効率や各アプリケーションのインデックス定義の柔軟性が主な関心事である場合、単一のベクトルインデックスは通常、より単純で迅速に展開できます。

結論

ここまで読み進めた勇敢な方々におめでとうございます!LLMsとRAGsについての情熱的な議論に参加するための基礎知識を身につけたと信じます。

インデックスはデータの検索において中心的な役割を果たしています。データの検索は、データテクノロジーの重要なコンポーネントである可能性がありますので、インデックス、ベクトルインデックスを含むものについて理解することは非常に重要です。

もっと高度なインデックスについて学びたい場合は、私のLSHに関する記事を読んでみることをお勧めします。もっと実践的なものを学びたくて、リアルタイムの検索拡張生成(RAG)を体験してみたい場合は、LLM-appを探索してみてください。そこでは、これらの技術の力を直接体験することができます。

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