Slide 1

Slide 1 text

2024.10.30 クラスメソッド株式会社 リテールアプリ共創部 岩田 智哉 Qdrantでベクトルデータベースに 入門してみよう

Slide 2

Slide 2 text

自己紹介 2 ● 産業支援グループ リテールアプリ共創部 マッハチーム ● 2018年5月入社 ● 大阪オフィス所属 ● 普段は主にサーバーサイドの開発に従事 ● 前十字靭帯再建手術リハビリ中 岩田 智哉

Slide 3

Slide 3 text

ベクトルデータべースとは 3 ● ベクトルデータの格納や検索を行うためのデータベース ○ 意味的に近いデータを検索できる ● 多次元の数値配列 = ベクトルデータ ○ ベクトルデータ... [1,2,3,4,5,6…] こういうやつ ● 生成AIの流行と共に耳にする機会が増えた ○ よくRAGで利用される

Slide 4

Slide 4 text

ざっくり理解するモデルとベクトル化 4 岩田 [182,80] 身長 体重 182 80 入力をベクトルに変換するのがモデル ベクトル化しても元の特徴は維持される

Slide 5

Slide 5 text

Qdrant(クワッドラント)とは 5 •OSSのベクトルデータベース •Dockerで簡単に起動可能 •Web UIが用意されている •REST APIで操作可能

Slide 6

Slide 6 text

QdrantのWeb UI 6

Slide 7

Slide 7 text

Qdrantのサンプルデータセット 7

Slide 8

Slide 8 text

最低限抑えておきたい概念 8 ● コレクション ● ポイント ○ ID ○ ベクトル ○ ペイロード https://raw.githubusercontent.com/ramonpzg/mlops-sydney-2023/main/images/qdrant_overview_high_level.png より引用

Slide 9

Slide 9 text

Qdrantを使いながら学ぶ ベクトルデータベースの概念 9

Slide 10

Slide 10 text

ベクトル間の類似度を測定するための指標 10 •ドット積 •コサイン類似度 •ユークリッド距離 •マンハッタン距離 ※Qdrantが対応している指標のみ抜粋

Slide 11

Slide 11 text

ベクトル間の類似度について考えてみる 11 以下の2次元ベクトルをサンプルに考えてみる [1, 3] [3, 3] [5, 1]

Slide 12

Slide 12 text

ドット積 12 ベクトルの内積を用いた指標 正規化されたデータに使う [1, 3] [3, 3] [5, 1] ⚫青と赤… (1×3) + (3×3) = 12 ⚫赤と黄… (3×5) + (3×1) = 18 ⚫青と黄… (1×5) + (3×1) = 8

Slide 13

Slide 13 text

コサイン類似度 13 ベクトル同士のコサイン値を用いた指標 [1, 3] [3, 3] [5, 1] ⚫青と赤… (略) = 0.894... ⚫赤と黄… (略) = 0.832... ⚫青と黄… (略) = 0.496...

Slide 14

Slide 14 text

ユークリッド距離 14 ベクトル間の直線的な最短距離 距離なので数値が小さいほうが類似度が高い [1, 3] [3, 3] [5, 1] ⚫青と赤… = 2 ⚫赤と黄… = 2.82 ⚫青と黄… = 4.47 (1 − 3)2+(3 − 3)2 (3 − 5)2+(3 − 1)2 (1 − 5)2+(3 − 1)2

Slide 15

Slide 15 text

マンハッタン距離 15 [1, 3] [3, 3] [5, 1] ⚫青と赤… |1-3| + |3-3| = 2 ⚫赤と黄… |3-5| + |3-1| = 4 ⚫青と黄… |1-5| + |3-1| = 6 ベクトル間を碁盤の目状に進んだ距離 距離なので数値が小さいほうが類似度が高い

Slide 16

Slide 16 text

Qdrantの基本操作を通じて 4つの指標を試してみる 16

Slide 17

Slide 17 text

コレクションの作成 17 • コレクション作成時のパラメータで指標を指定 • 検証用に各指標で合計4つのコレクションを作成

Slide 18

Slide 18 text

ポイントの投入 18 作成した各コレクションに サンプルのポイントを投入

Slide 19

Slide 19 text

各コレクションに対してSearch points APIを試してみる 19 • 各コレクションに対してSearch points APIを実行 • ベクトル[1,3]に類似するpointを検索 • スコアの違いを確認してみる

Slide 20

Slide 20 text

ドット積 20

Slide 21

Slide 21 text

コサイン類似度 21

Slide 22

Slide 22 text

ユークリッド距離 22

Slide 23

Slide 23 text

マンハッタン距離 23

Slide 24

Slide 24 text

ユースケースに合わせて 適切な指標を選択することが 重要 24

Slide 25

Slide 25 text

ベクトルの種類 25

Slide 26

Slide 26 text

ベクトルの種類 26 ● 密(Dense)ベクトル ● すべて or ほとんどの成分が0でない ● すべての成分を保持 ● 例: [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,0,1] ● 疎ベクトル(Sparse) ● ほとんどの成分が0 ● 非ゼロの成分のみ保持 ● 例: {“非ゼロの成分”:[0,10,15],”値”:[1,2,3]}

Slide 27

Slide 27 text

Hybrid Search 27 ● Qdrantは密ベクトルと疎ベクトル両方を組み合わせた Hybrid Searchが可能 ● 1つのPointに複数のVectorを保持できる ○ 密/疎ベクトルを登録 ○ ユークリッド/マンハッタン距離を指標とするベクトルを登録 ● Hybrid Searchでは以下のいずれかの方式でスコアを統合 ○ Reciprocal Rank Fusion(rrf) ○ Distribution-Based Score Fusion(dbsf)

Slide 28

Slide 28 text

Reciprocal Rank Fusion 28 ● クエリの結果に対して逆順位スコアを割り当てる ● 逆順位スコア = 1 ÷ (順位 + 定数) ■ Qdrantでは定数 = 2.0、順位は0から計算 ■ 順位が1位なら逆順位スコアは0.5となる https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/reciprocal_rank_fusion.rs#L11-L17

Slide 29

Slide 29 text

Reciprocal Rank Fusionの計算例 29 クエリ1 クエリ2 ポイント クエリ1 クエリ2 合計 青 1÷ (0 + 2.0) = 0.5 1÷ (0 + 2.0) = 0.5 1.0 赤 1÷ (1 + 2.0) = 0.333... 1÷ (2 + 2.0) = 0.25 0.5833... 黄色 1÷ (2 + 2.0) = 0.25 1÷ (1 + 2.0) = 0.333... 0.5833... スコアの大小は計算結果に影響しない 逆順位スコアは同じ

Slide 30

Slide 30 text

Distribution-Based Score Fusion 30 ● クエリ結果のスコアを正規化 ● 正規化した後の各スコアを融合させる ○ Qdrantでは標準偏差を使って正規化した後の合計値を採用 https://github.com/qdrant/qdrant/blob/9c20e9e27960228019b4606f137ca82b42fc3e66/lib/segment/src/common/score_fusion.rs#L10-L31

Slide 31

Slide 31 text

Distribution-Based Score Fusionの計算例 31 クエリ1 クエリ2 スコアの大小が計算結果に影響する ポイント クエリ1 クエリ2 合計 青 0.311… ※詳細はのちほど 0.308... 0.619... 赤 0.625... 0.577... 1.203... 黄色 0.562... 0.613... 1.176... 元のスコアの大小が正規化後のスコアにも影響

Slide 32

Slide 32 text

Qdrantで Hybrid Searchしてみる 32

Slide 33

Slide 33 text

Hybrid Searchで使うサンプルデータ 33 [0, 0] [5, 5] [8, 0] 比較対象 ユークリッド マンハッタン 青と青 0 0 青と赤 7.071… 10 青と黄色 8 8 指標によってランク&スコアが変化するデータを用意 ユークリッド マンハッタン 青からの距離 青 → 赤 → 黄色 青 → 黄色 → 赤

Slide 34

Slide 34 text

ユークリッド/マンハッタン距離を利用するコレクションの作成 34 ユークリッド/マンハッタン距離を利用する2次元のベクトルを作成

Slide 35

Slide 35 text

テスト用のPointを投入 35

Slide 36

Slide 36 text

Hybrid Searchを実行(RRF) 36 ポイント ユークリッド距離 マンハッタン距離 合計 青 1÷ (0 + 2.0) = 0.5 1÷ (0 + 2.0) = 0.5 1.0 赤 1÷ (1 + 2.0) = 0.333... 1÷ (2 + 2.0) = 0.25 0.5833... 黄色 1÷ (2 + 2.0) = 0.25 1÷ (1 + 2.0) = 0.333... 0.5833...

Slide 37

Slide 37 text

Hybrid Searchを実行(DBSF) 37

Slide 38

Slide 38 text

DBSFの計算-1 38 ユークリッド距離 マンハッタン距離 青 0 0 赤 10 7.071... 黄色 8 8 平均 6 5.023... 標準偏差 5.291... 4.375... 平均 – (3 * 標準偏差) ※min -9.874... -8.102... 平均 + (3 * 標準偏差) ※max 21.874... 18.149... • 各クエリごとに平均値、標準偏差を算出

Slide 39

Slide 39 text

DBSFの計算-2 39 ユークリッド距離 マンハッタン距離 合計 スコア (スコア-min)÷(max-min) スコア (スコア-min) ÷(max-min) 青 0 0.311... 0 0.308... 0.619... 赤 10 0.625... 7.071... 0.577... 1.203... 黄色 8 0.562... 8 0.613... 1.176... • 算出した値を使ってスコアを正規化 • 各クエリの正規化されたスコアを合計

Slide 40

Slide 40 text

DBSFの計算(ソースコード) 40 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#L96-L109

Slide 41

Slide 41 text

Hybrid Searchを実行(DBSF) 41 スコア 赤 1.203... 黄色 1.176... 青 0.619...

Slide 42

Slide 42 text

まとめ 42

Slide 43

Slide 43 text

まとめ 43 ● Qdrantはベクトルデータベースの入門にオススメ ● ベクトルデータベースの基礎的な概念を学んでから Qdrantを触ることで理解が深まります!!

Slide 44

Slide 44 text

参考 44 Home - Qdrant https://qdrant.tech/documentation/ ベクトルデータベースとは何ですか?|包括的なベクトルデータベースのガイド | Elastic https://www.elastic.co/jp/what-is/vector-database ベクトル距離メトリック https://docs.oracle.com/cd/G11854_01/vecse/vector-distance-metrics.html ベクトル距離関数から選択し、ベクトル エンベディングの類似度を測定する | Spanner | Google Cloud https://cloud.google.com/spanner/docs/choose-vector-distance-function?hl=ja ハイブリッド検索のスコアリング (RRF) - Azure AI Search | Microsoft Learn https://learn.microsoft.com/ja-jp/azure/search/hybrid-search-ranking