Classmethod AI Talks(CATs) #6 「Qdrantでベクトルデータベースに入門してみよう」というタイトルで登壇しました #catalks

Classmethod AI Talks(CATs) #6 「Qdrantでベクトルデータベースに入門してみよう」というタイトルで登壇しました #catalks

Clock Icon2024.10.31

リテールアプリ共創部@大阪の岩田です。

2024/10/30(水)に開催されたClassmethod AI Talks(CATs) #6 生成AIサービス開発の実践 - 周辺技術を基礎から応用までキャッチアップ!にて「Qdrantでベクトルデータベースに入門してみよう」というタイトルで登壇させていただきました。

このブログでは登壇内容をかいつまんで紹介させていただきます。

ベクトルデータベースとは

ベクトルデータベースはベクトルデータの格納や検索に特化したデータベースで、意味的に近しいデータを検索できるのが特徴です。ベクトルデータベース自体は昔からある技術ですが、生成AIの流行と共に注目度が上がっている技術です。

ベクトルデータベースの概要

モデルとベクトル化の概要

Qdrantの概要

QdrantはOSSのベクトルデータベースです。Qdrantの概要については以下のブログが参考になります。

https://dev.classmethod.jp/articles/qdrant-first-step/

Dockerで簡単に起動できる、Web UIを備えているといった特徴からベクトルデータベースの入門にオススメなデータベースです。

Qdrantで利用可能な指標

ベクトルデータベースを利用すると検索条件に指定したデータと意味的に近しいデータが検索できるのですが、この「意味的に近しい」というのはどういうことでしょうか?この類似度を表す指標がいくつかあり、Qdrantでは4つの指標が利用可能です。これらの指標をユースケースに合わせて使い分けることが重要です。

各指標について詳細を説明していきます。

ドット積

まずドット積です。こちらはベクトルの内積を用いた指標です。

ドット積の解説

Qdrantのソースコードでいうとこの辺りに実装されています。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/spaces/simple.rs#L237-L239

※この指標は正規化されたデータに対して使う指標なので、この計算例は本来良くない例です。

コサイン類似度

続いてベクトル同士のコサイン値を用いた指標であるコサイン類似度です。

コサイン類似度の解説

計算ロジックはこの辺り。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/spaces/simple.rs#L228-L235

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/spaces/simple.rs#L174-L176

前処理を行ってからドット積を計算するような流れになります。

ユークリッド距離

次はベクトル間の直線的な最短距離を利用するユークリッド距離です。

ドット積とコサイン類似度は計算結果の数値が大きいほど類似しているという指標でしたが、ユークリッド距離と後述するマンハッタン距離は「距離」を用いた指標なので計算結果が小さいほど類似していることになります。

ユークリッド距離の解説

計算ロジックはこの辺り。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/spaces/simple.rs#L214-L219

マンハッタン距離

最後にマンハッタン距離です。将棋の飛車のようなイメージですね。

マンハッタン距離の解説

計算ロジックはこの辺り。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/spaces/simple.rs#L221-L226

ベクトルの種類

ベクトルには密ベクトルと疎ベクトルの2種類があります。どちらが優れているというものではなく、それぞれメリット・デメリットがあるので、要件に応じた適切なベクトルを利用することが重要です。

ベクトルの種類

ベクトルには密ベクトルと疎ベクトルがあるという話をしましたが、1つのポイントでこれらのベクトルを併用可能です。ポイント:ベクトルは1:1ではなく1:Nということですね。

また、密・疎ベクトルに限らず、マンハッタン距離を利用するベクトルとユークリッド距離を利用するベクトル両方を1つのポイントに登録するといった使い方も可能です。

1つのポイントに対して複数のベクトルを登録した場合は各ベクトルに対してクエリを実行し、その実行結果を統合して最終的な結果として採用するHybrid Searchというものがあります。

Hybrid Search

Hybrid Searchでは各クエリで算出されたスコアを統合するためのアルゴリズムとしてRRFとDBSFが選択可能です。それぞれの詳細について解説します。

Reciprocal Rank Fusion(RRF)

RRFはクエリの結果に対して逆順位スコアを割り当てるアルゴリズムです。RRFは各クエリを実行した結果の「順位」を利用するアルゴリズムで、各クエリのスコアは統合後のスコアに影響を与えません。例を見ながら考えていきましょう。

RRFの説明

この図は右に行くほどスコアが高いということを表しています。クエリ1の赤とクエリ2の黄色を比較すると、クエリ2の黄色の方が右に位置している=スコアが高いのですが、計算後の逆順位スコアは両方とも0.33...となります。

RRFの特徴

ロジックはこの辺りです。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/reciprocal_rank_fusion.rs#L12-L53

Distribution-Based Score Fusion(DBSF)

もう1つのアルゴリズムがDBSFです。こちらは各クエリの結果を正規化して融合させるアルゴリズムです。RRFとは異なり各クエリのスコアの大小が統合後のスコアにも影響を与えます。

DBSFの説明

この例だとクエリ1の赤とクエリ2の黄色は両方とも各クエリの中ではスコアが1位になっていますが、スコアの大小でいうとクエリ1の赤の方が大きくなっています。DBSFでスコアを正規化するとクエリ1の赤はスコアが0.625となり、クエリ2の黄色を正規化した0.613よりも大きなスコアとなります。

DBSFの特徴

DBSFの計算例-1

DBSFの計算例-2

計算ロジックはこの辺りです。

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/score_fusion.rs#L23-L30

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/score_fusion.rs#L149-L164

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/score_fusion.rs#L126-L145

https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/score_fusion.rs#L96-L109

Qdrantは入門にオススメ!!

ここまでベクトルデータベースに関する基礎的な概念について説明してきました。QdrantはOSSなので実際のソースコードを見ながら勉強した概念について理解を深めることができます。ぜひQdrantを触ってベクトルデータベースに入門してみてください。

登壇資料

まとめ

今回登壇駆動でベクトルデータベースやQdrantについて学んでみたのですが、QdrantがOSSで開発されているというのは学習用に非常に有用だと感じました。DBSFの計算ロジックなど色々と調べてもなかなかピンとこなかったのですが、Qdrantのソースコードを読むことで理解が深まりました。

Qdrantのソースコードを読む → EXCEL等を使って自分でスコアを計算してみる → 実際にQdrantにデータを登録&クエリして答え合わせする

という一連のプロセスを楽しみながら学ぶことができました。

ぜひ皆さんもQdrantを触ってみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.