こんにちは。
Acroquestのデータサイエンスチーム「YAMALEX」に所属する@shin0higuchiです😊
YAMALEXチームでは、コンペティションへの参加や自社製品開発、技術研究などに日々取り組んでいます。
はじめに
近年、RAG(Retrieval-Augmented Generation)の台頭などを背景に、ベクトル検索の重要性が増しています。
ベクトル検索は、テキストや画像などの高次元データをベクトル空間に埋め込み、類似度に基づいて検索を行う技術です。
これにより、従来のキーワード検索では捉えきれなかった、意味的な類似性に基づいた検索が可能になります。
(RAGでElasticsearchのベクトル検索を利用するやり方については、こちらの記事で紹介していますので是非ご覧ください)
acro-engineer.hatenablog.com
一方で、ベクトル検索を扱うためのプロダクトやサービスも増えており、選択肢に迷う方も多いのではないでしょうか。ベクトル検索時のオプションなどもサービスによって異なります。
特に最近ではベクトル検索のパフォーマンスやリソース効率を向上させるための様々なオプションが登場しており、その中でも「ベクトル量子化」や「バイナリベクトル」は、リソース使用量削減や検索速度向上に寄与する技術として注目されています。
本記事では、ベクトル検索に利用する検索エンジンとして有力な選択肢の一つであるElasticsearchに焦点を当て、ベクトル量子化やバイナリベクトルといったオプションとその効果について、具体的な設定方法を交えながら解説します。
Elasticsearchにおけるベクトル検索
Elasticsearchは、全文検索エンジンとして広く知られていますが、バージョン7.x以降、Dense Vector型をサポートし、ベクトル検索機能を強化しています。
Dense Vectorは、高次元のベクトルデータを格納するためのデータ型です。
Elasticsearch Dense Vector ドキュメント: Elasticsearch Dense Vector ドキュメント
ベクトル検索のアルゴリズム
ElasticsearchでDense Vectorを扱う際には、近似最近傍(ANN)検索アルゴリズムを利用します。現在はHNSWと呼ばれるアルゴリズムを利用可能です。
HNSW (Hierarchical Navigable Small World)は高速な近似最近傍探索アルゴリズムの一つです。グラフベースのデータ構造を用いて、効率的に類似ベクトルを検索します。
リソース削減のためのオプション:ベクトル量子化とバイナリベクトル
ベクトル検索のパフォーマンスとリソース効率はトレードオフの関係にあります。Elasticsearchでは、このトレードオフを調整するためのオプションとして、ベクトル量子化とバイナリベクトルを提供しています。
| オプション | 説明 | メリット | デメリット | 推奨されるユースケース |
| ベクトル量子化 | ベクトルの各次元をより少ないビット数で表現する手法。Elasticsearchでは、float (32ビット) の代わりに 8bit, 4bit, 1bit の量子化をおこなうことができます。 | ストレージサイズとメモリ使用量を大幅に削減。クエリ性能も向上する可能性があります。 | 精度が低下する可能性があります。 | ストレージコストとメモリ使用量を削減したい場合、ある程度の精度と性能のバランスを求める場合。 |
| バイナリベクトル | ベクトルの各次元を0または1の値で表現する手法。ハミング距離などを用いて高速な類似度計算が可能です。 | 計算時間および、ディスク・メモリ使用量を大きく削減。ハミング距離など、バイナリベクトルに特化した高速な距離計算が可能。 | floatを利用する場合に比べて精度が低下する。また、バイナリベクトルを生成するための専用のEmbeddingモデルが必要になる。 | 精度を多少犠牲にしてもストレージやメモリの使用量を大幅に抑えたい場合、高速な検索が必要な場合。 |
バイナリベクトルの詳細
バイナリベクトル(Bit ベクトル)は、ベクトル検索の効率を大幅に向上させる可能性を秘めた技術です。
www.elastic.co
- 仕組み: バイナリベクトルは、元のベクトル(通常は浮動小数点数のベクトル)の各次元を、閾値に基づいて0または1に変換します。
- 距離計算: バイナリベクトル間の類似度計算には、ハミング距離(ビットが異なる箇所の数)が用いられます。これらは、浮動小数点数ベクトル間のコサイン類似度やユークリッド距離の計算よりもはるかに高速です。
生成方法
量子化/バイナリ化によるメリットと注意点
ベクトル量子化およびバイナリ化は、Dense Vectorのストレージ効率とクエリ性能を向上させる強力な手段ですが、導入にあたっては以下のメリットと注意点を理解しておく必要があります。
メリット:
- ストレージコストの削減: インデックスサイズを大幅に削減し、ディスクストレージのコストを低減できます。
- メモリ使用量の削減: ベクトルデータがメモリに乗りやすくなるため、メモリ使用量を削減し、Elasticsearchクラスタの安定性を向上させます。
- クエリ性能の向上: 量子化/バイナリ化されたベクトルに対する演算は高速になるため、クエリ性能の向上が期待できます。
注意点:
JMTEBデータによる測定
JMTEB (Japanese Massive Text Embedding Benchmark)と呼ばれる、Embeddingの精度を評価するベンチマークが存在します。
github.com
JMTEBでは日本語の各種オープンデータを利用した5つのタスクを通してEmbeddingモデルを評価します。
今回は、一部のデータセットを利用して、量子化オプションを変更した場合にどの程度ディスク使用量や精度に影響が出るのかを見てみましょう。
Cohereが提供するEmbedding APIを利用すると、一般的なFloatのEmbeddingの他、バイナリEmbeddingも利用することができます。
検証では、CohereのEmbeddingモデルを利用して、以下の3パターンのベクトルをElasticsearchに登録し、比較をしてみます。
- floatベクトルをElasticsearchのデフォルト設定 (8bit 量子化)にしたもの
- floatベクトルをElasticsearchでビット量子化 (bbq) したもの
- バイナリベクトルをElasticsearchの bit オプションを利用して登録したもの
参考:
www.elastic.co
インデックスサイズ/正解率
以下に、各オプションを付けてElasticsearchに取り込んだ際のインデックスサイズと、
データセットで事前に定義された正答をどれだけの率で当てられたかを示します
今回利用したデータセットでは検索クエリ404件に対して、正解ドキュメントが1件ずつ定義されています。正解率の指標としてはprecsionとnDCGの2つ計測しています。
- precision@1: 正解すべきドキュメントが1位としてヒットした率
- nDCG@10: 10位までの中に、正解すべきドキュメントがどの程度ランクインしたかの指標。正解すべきドキュメントが上位に来るほどスコアが高くなる。
| 種別 | インデックスサイズ | 正解率(precision@1) | nDCG@10 |
| float | 9.1mb | 84.41% | 0.9108 |
| 量子化(bbq) | 8.7mb | 83.66% | 0.9024 |
| バイナリベクトル | 2.6mb | 81.19% | 0.8889 |
やはり、floatでそのまま扱う方が精度は良いのですが、他の手法ではインデックスサイズを小さくしつつ、精度も1~3%程度の低下にとどまっており、そこまで著しく低下していないことが分かります。
近年ではリランクとの組み合わせなどで精度を担保する戦略もあるので、本稿で紹介したオプションは実用に値するものだと思います。
当然、データセットによって精度の低下幅などは異なるので事前の検証を推奨しますが、是非積極的に活用してみてください。
今回の記事はここまでとなります。
最後までお読みいただきありがとうございました。
Acroquest Technologyでは、キャリア採用を行っています。
- Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- マイクロサービス、DevOps、最新のOSSやクラウドサービスを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。