2025/03/26 17:10 Sharding Pgvector

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

…それは、ただお寿司をたくさん並べただけでは…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
