萌えハッカーニュースリーダー

2025/03/26 17:10 Sharding Pgvector

出典: https://pgdog.dev/blog/sharding-pgvector
hakase
博士

やあ、ロボ子。今日はpgvectorのシャーディングについて話すのじゃ。

roboko
ロボ子

シャーディングですか、博士。データ量が増えた時のための技術ですね。

hakase
博士

そうじゃ!pgvectorはPostgresでembeddingsを扱うのに便利じゃが、データが増えるとインデックス構築が大変になるのじゃ。

roboko
ロボ子

pgvectorにはHNSWとIVFFlatの2種類のインデックスがあるんでしたね。HNSWは高速だけど構築が遅く、IVFFlatは構築が速いけど検索が遅い、と。

hakase
博士

その通り!特にデータ量が増えると、ホットな領域がメモリに乗り切らなくなって検索が遅くなるのが問題じゃ。

roboko
ロボ子

そこでシャーディングの出番ですね。記事によると、IVFFlatはK-meansでembeddingsをグループ化するからシャーディングに向いている、と。

hakase
博士

そうじゃ!検索時には、クエリパラメータに基づいて適切なホストを選ぶのじゃ。

roboko
ロボ子

HuggingFaceのデータセットを使ったテストでは、Wikipediaの記事のembeddingsを作成し、scikit-learnでcentroidsを計算したんですね。

hakase
博士

ふむ。シャーディング関数は `shards = pick(min(l2_distance(vector, centroids)) mod shards, probes)` とのことじゃ。デフォルトでは`probes`は`sqrt(centroids)`に設定されるんじゃな。

roboko
ロボ子

このテストでは、1シャードだと96%のクエリで結果が得られ、16シャードだとすべてのクエリで何らかの結果が得られたんですね。

hakase
博士

ほう、なかなか興味深い結果じゃな。IVFFlatを使わない場合は、すべてのシャードに均等にデータを分割して、すべてのシャードにクエリを送信する方法もあるみたいじゃ。

roboko
ロボ子

近くのcentroidsを同じシャードに「bin pack」するという改善策もあるんですね。

hakase
博士

そうそう。PgDogというPostgresのシャーディングのためのオープンソースプロジェクトもあるらしいぞ。PgDogではシャーディングにIVFFlatを使うが、各シャードはIVFFlat、HNSW、またはインデックスなしを選べるのがミソじゃ。

roboko
ロボ子

今後のステップとしては、コサイン類似度などの距離アルゴリズムの追加や、SIMD命令を使ったL2距離計算の高速化が挙げられていますね。

hakase
博士

ふむ、シャーディングは奥が深いぞ。ロボ子、今日は良い勉強になったのじゃ。

roboko
ロボ子

はい、博士。私もシャーディングについて理解が深まりました。ところで博士、今日の夕食は何にしましょうか?

hakase
博士

うむ、夕食か。そうじゃな…今日は特別に、シャーディングされたお寿司🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣🍣はいかがかの?

roboko
ロボ子

…それは、ただお寿司をたくさん並べただけでは…?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search