Slide 1

Slide 1 text

pgvector 0.6.0 以降の進化について ざっくり取り上げてみる 第 47 回 PostgreSQL アンカンファレンス@オンライン  2024/7/1 まつひさ(hmatsu47)

Slide 2

Slide 2 text

自己紹介 松久裕保(@hmatsu47) ● https://qiita.com/hmatsu47 ● 現在のステータス: ○ 名古屋で Web インフラのお守り係をしています ○ #pgunconf ゆるふわ勢 ○ 昨年の第 43 回以来、11 ヶ月ぶりの発表参加です 2

Slide 3

Slide 3 text

本日のネタ ● 以下の 2 つの(不人気)記事の内容を取り上げます ○ 象使いのための pgvector 入門 (3) 0.6.0 〜 0.7.0 追加機能につ いて https://qiita.com/hmatsu47/items/8cdafc093fcda793e863 ○ pgvector 0.7.0 でバイナリインデックス&量子化を試してみた https://zenn.dev/hmatsu47/articles/pgvector070-binaryvector 3

Slide 4

Slide 4 text

pgvector おさらい(去年まで) ● PostgreSQL をベクトル対応するための拡張機能 https://github.com/pgvector/pgvector ○ RAG やセマンティック検索でよく使用される ● インデックスとして IVFFlat・HNSW をサポート ○ HNSW のほうが高性能 ■ 0.5.0 で HNSW がサポートされた 4

Slide 5

Slide 5 text

2024 年前半の pgvector(主な機能追加) ● 0.6.0 で HNSW インデックスのパラレルビルドに対応 ○ CPU コアが多いサーバーでのインデックス作成高速化 ● 0.7.0 で半精度・バイナリ(ビット)ベクトルに対応 ○ 16 ビット浮動小数点数と 1 ビットのベクトルに対応 ■ (それぞれ)インデックスも対応 ■ ビット量子化とハミング距離・ジャッカード距離に対応(バイナリベクトル向け) ○ その他、疎ベクトルとサブベクトルインデックス化にも対応 5

Slide 6

Slide 6 text

2024 年前半の pgvector(主な機能追加) ● 0.6.0 で HNSW インデックスのパラレルビルドに対応 ○ CPU コアが多いサーバーでのインデックス作成高速化 ● 0.7.0 で半精度・バイナリ(ビット)ベクトルに対応 ○ 16 ビット浮動小数点数と 1 ビットのベクトルに対応 ■ (それぞれ)インデックスも対応 ■ ビット量子化とハミング距離・ジャッカード距離に対応(1 ビットベクトル向け) ○ その他、疎ベクトルとサブベクトルインデックス化にも対応 6

Slide 7

Slide 7 text

ビット量子化インデックスを試してみた(1/2) ● AWS オレゴンリージョンで以下を使ってテスト ○ RDS for PostgreSQL 16.3(db.m6g.large) ○ Titan Text Embeddings V2(1024 次元・正規化あり) ● 使ったデータはこちら ○ https://huggingface.co/datasets/takaaki-inada/databricks-dolly-15k-ja-zundamon ■ 2024/5/22 時点・トークンサイズ等制限に掛からない約 4,600 件 ■ 質問文(instruction)と回答(output)をそれぞれ個別の行として登録 ■ 埋め込みベクトルは 32 ビット float 値でデータ行に登録 7

Slide 8

Slide 8 text

ビット量子化インデックスを試してみた(2/2) ● インデックスの作成時間と検索時間・検索結果を比較 ○ インデックスなし(内積) ○ 32 ビット float 値の HNSW インデックスを作成して検索(同上) ○ ビット量子化して作成したインデックスを Re-rank 検索 8

Slide 9

Slide 9 text

Re-rank 検索とは?(ざっくり) ● 一度検索して得た「候補」を別手法で順位づけ ○ 例)低負荷・低精度の手法で粗く絞り込み→その中から高精度の 手法で順位づけ or 最適値選択する ■ 例 1 : ビット量子化したインデックスから 20 件絞り込み→20 件の中から 32 ビット精度で最近傍の 5 件を選択 ■ 例 2 : 32 ビット精度のまま次元数を圧縮(削減)したインデックスから 20 件 絞り込み→20 件の中から最近傍の 5 件を選択 9

Slide 10

Slide 10 text

Re-rank 検索とは?(ざっくり) ● 一度検索して得た「候補」を別手法で順位づけ ○ 例)低負荷・低精度の手法で粗く絞り込み→その中から高精度の 手法で順位づけ or 最適値選択する ■ 例 1 : ビット量子化したインデックスから 20 件絞り込み→20 件の中から 32 ビット精度で最近傍の 5 件を選択 ■ 例 2 : 32 ビット精度のまま次元数を圧縮(削減)したインデックスから 20 件 絞り込み→20 件の中から最近傍の 5 件を選択 10

Slide 11

Slide 11 text

0. データ投入 ● GitHub リポジトリにある Python スクリプトを使用 https://github.com/hmatsu47/pgvector070-test/blob/main/app_titan2_re_rank_ bin_index_text.py 11

Slide 12

Slide 12 text

1. インデックスがない状態でベクトル検索(1/2) ● ↓の質問文(instruction)に近い回答(output)を抽出 12 postgres=> SELECT id, data FROM rerank_test WHERE id = 100000; -[ RECORD 1 ]---------------------------------------------------------- id | 100000 data | ヴァージン・オーストラリア航空はいつから運航を開始したのですか? Time: 139.100 ms

Slide 13

Slide 13 text

1. インデックスがない状態でベクトル検索(2/2) 13 postgres=> SELECT id, (embedding <#> (SELECT embedding FROM rerank_test WHERE id = 100000)) * -1 AS inner_product, data FROM rerank_test WHERE id < 100000 ORDER BY inner_product DESC LIMIT 5; -[ RECORD 1 ]-+--------------------------------------------------------------------------------------… id | 0 inner_product | 0.7999640703201294 data | ヴァージン・オーストラリア航空( Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とする … -[ RECORD 2 ]-+--------------------------------------------------------------------------------------… id | 3355 inner_product | 0.4171184301376343 data | N.V. Virgin Express S.A.は、ヴァージン・グループ内に誕生したベルギーの航空会社なのだ。ブリュッセ … -[ RECORD 3 ]-+--------------------------------------------------------------------------------------… id | 6819 inner_product | 0.2454237937927246 data | OA形は、ボールドウィン機関車製作所がニュージーランドのウェリントン&マナワツ鉄道( WMR)のために製作し… -[ RECORD 4 ]-+--------------------------------------------------------------------------------------… id | 1540 inner_product | 0.22488926351070404 data | 橋が架かる前、サンフランシスコと現在のマリン郡を結ぶ唯一の実用的な近道は、サンフランシスコ湾の一角を船 … -[ RECORD 5 ]-+--------------------------------------------------------------------------------------… id | 3120 inner_product | 0.22459137439727783 data | Oy Air Finlandは、フィンランドのヴァンターにあるヘルシンキ空港を本社・拠点とする航空会社で、休暇先 … Time: 173.794 ms

Slide 14

Slide 14 text

2. 32 ビットインデックス(HNSW)を作成 14 postgres=> CREATE INDEX ON rerank_test USING hnsw (embedding vector_ip_ops); CREATE INDEX Time: 9103.665 ms (00:09.104)

Slide 15

Slide 15 text

3. 32 ビットインデックス(HNSW)で検索 15 postgres=> SELECT id, (embedding <#> (SELECT embedding FROM rerank_test WHERE id = 100000)) * -1 AS inner_product, data FROM rerank_test WHERE id < 100000 ORDER BY inner_product DESC LIMIT 5; -[ RECORD 1 ]-+--------------------------------------------------------------------------------------… id | 0 inner_product | 0.7999640703201294 data | ヴァージン・オーストラリア航空( Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とする … -[ RECORD 2 ]-+--------------------------------------------------------------------------------------… id | 3355 inner_product | 0.4171184301376343 data | N.V. Virgin Express S.A.は、ヴァージン・グループ内に誕生したベルギーの航空会社なのだ。ブリュッセ … -[ RECORD 3 ]-+--------------------------------------------------------------------------------------… id | 6819 inner_product | 0.2454237937927246 data | OA形は、ボールドウィン機関車製作所がニュージーランドのウェリントン&マナワツ鉄道( WMR)のために製作し… -[ RECORD 4 ]-+--------------------------------------------------------------------------------------… id | 1540 inner_product | 0.22488926351070404 data | 橋が架かる前、サンフランシスコと現在のマリン郡を結ぶ唯一の実用的な近道は、サンフランシスコ湾の一角を船 … -[ RECORD 5 ]-+--------------------------------------------------------------------------------------… id | 3120 inner_product | 0.22459137439727783 data | Oy Air Finlandは、フィンランドのヴァンターにあるヘルシンキ空港を本社・拠点とする航空会社で、休暇先 … Time: 175.982 ms インデックスなしのケースとほぼ変わらず(データ行数が少ないため?)

Slide 16

Slide 16 text

4. ビット量子化インデックス(HNSW)を作成 16 ● 先に作成した 32 ビットインデックスを削除してから作成 postgres=> DROP INDEX rerank_test_embedding_idx; DROP INDEX Time: 152.619 ms postgres=> CREATE INDEX ON rerank_test USING hnsw ((binary_quantize(embedding)::bit(1024)) bit_hamming_ops); CREATE INDEX Time: 3356.522 ms (00:03.357) インデックス作成所要時間が半分以下に

Slide 17

Slide 17 text

5. ビット量子化インデックス使用の Re-rank 検索 17 postgres=> SELECT id, (embedding <#> (SELECT embedding FROM rerank_test WHERE id = 100000)) * -1 AS inner_product, data FROM (SELECT * FROM rerank_test WHERE id < 100000 ORDER BY binary_quantize(embedding)::bit(1024) <~> (SELECT binary_quantize(embedding)::bit(1024) FROM rerank_test WHERE id = 100000) LIMIT 20) ORDER BY inner_product DESC LIMIT 5; -[ RECORD 1 ]-+--------------------------------------------------------------------------------------… id | 0 inner_product | 0.7999640703201294 data | ヴァージン・オーストラリア航空( Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点とする … -[ RECORD 2 ]-+--------------------------------------------------------------------------------------… id | 3355 inner_product | 0.4171184301376343 data | N.V. Virgin Express S.A.は、ヴァージン・グループ内に誕生したベルギーの航空会社なのだ。ブリュッセ … -[ RECORD 3 ]-+--------------------------------------------------------------------------------------… id | 6819 inner_product | 0.2454237937927246 data | OA形は、ボールドウィン機関車製作所がニュージーランドのウェリントン&マナワツ鉄道( WMR)のために製作し… -[ RECORD 4 ]-+--------------------------------------------------------------------------------------… id | 1540 (中略) -[ RECORD 5 ]-+--------------------------------------------------------------------------------------… id | 3120 (中略) Time: 140.448 ms 少しだけ検索所要時間が短縮

Slide 18

Slide 18 text

6. ビット量子化インデックスで検索(非 Re-rank) 18 postgres=> SELECT id, (binary_quantize(embedding)::bit(1024) <~> (SELECT binary_quantize(embedding)::bit(1024) FROM rerank_test WHERE id = 100000)) AS humming_distance, data FROM rerank_test WHERE id < 100000 ORDER BY humming_distance LIMIT 5; -[ RECORD 1 ]----+-----------------------------------------------------------------------------------… id | 0 humming_distance | 224 data | ヴァージン・オーストラリア航空( Virgin Australia Airlines Pty Ltd)はオーストラリアを拠点と … -[ RECORD 2 ]----+-----------------------------------------------------------------------------------… id | 3355 humming_distance | 385 data | N.V. Virgin Express S.A.は、ヴァージン・グループ内に誕生したベルギーの航空会社なのだ。ブリュッ … -[ RECORD 3 ]----+-----------------------------------------------------------------------------------… id | 5003 humming_distance | 419 data | エアバスA380は、エアバス社が開発・製造した大型ワイドボディー旅客機なのだ。世界最大の旅客機であり、 … -[ RECORD 4 ]----+-----------------------------------------------------------------------------------… id | 65 humming_distance | 426 data | イギリス領ヴァージン諸島( BVI)、通称ヴァージン諸島は、カリブ海にあるイギリス海外領土で、プエルトリ … -[ RECORD 5 ]----+-----------------------------------------------------------------------------------… id | 5206 (中略) Time: 139.787 ms Re-rank 検索と順位が変化・検索所要時間の差はわずか

Slide 19

Slide 19 text

まとめ ● pgvector 0.6.0 以降、性能向上や容量削減向けの機能が 追加でリリースされている ○ HNSW インデックスのパラレルビルド対応 ○ 半精度・バイナリ(ビット)ベクトル対応 ■ インデックスも対応 ■ ビット量子化とハミング距離・ジャッカード距離に対応 ● データ量が多くなったときに効果が発揮される 19