2万件を8個に分けて1個だけ探すと、比較は2529件で済みます。再現率は30.5%でした。
128個に分けて8個探すと、比較は1379件と少ないのに再現率は36.8%です。
比較件数は分けた割合まで減ります。再現率はそれより速く落ちます。
ベクタシャーディングは、索引を分けて問いに近い一部だけを探す仕組みです。出典もこの動きを説明しています。
その説明は索引はベクトルをリストに分け、問いのベクトルに最も近い一部のリストを探すというものです。
文書2万件を64次元のベクトルで作りました。似た文書が40個の塊にまとまるようにしています。
問い300件で上位10件を取ります。全件を見た場合の上位10件を正解とし、そのうち何件を取り戻せたかを再現率としました。
シャード数 探すシャード 1問あたりの比較 全件比 再現率 8個 1個 2529件 12.6% 30.5% 8個 2個 5024件 25.1% 50.1% 8個 4個 10023件 50.1% 76.5% 8個 8個 20008件 100.0% 100.0% 32個 1個 661件 3.3% 15.9% 32個 2個 1285件 6.4% 27.2% 32個 4個 2540件 12.7% 42.7% 32個 8個 5043件 25.2% 64.4% 128個 1個 284件 1.4% 8.5% 128個 2個 441件 2.2% 15.1% 128個 4個 755件 3.8% 23.8% 128個 8個 1379件 6.9% 36.8%
8個に分けて1個だけ探すと、比較は全件の12.6%まで減ります。ところが再現率は30.5%です。
比較を8分の1にしたのに、取り戻せたのは3割です。減り方が計算量より速いことになります。
近いものが隣のシャードに落ちているためです。塊の境目にある文書ほど、この取りこぼしに当たります。
比較を減らすと、再現率はそれより速く落ちる。
An IVFFlat index divides vectors into lists, and then searches a subset of those lists that are closest to the query vector.原文pgvector README(IVFFlat の節) この内容の有効期限2027-02-18
粗く分けて1つだけ探すのが最も損です。同じ計算量なら、細かく分けて多く探します。
ベクタシャーディングで見落としやすいのが、同じ比較件数でも組み合わせによって再現率が変わる点です。表を横断して見ます。
比較が2500件前後になる行が2つあります。8個で1個探す2529件と、32個で4個探す2540件です。
再現率は30.5%と42.7%でした。ほぼ同じ計算量で、12ポイントの差が付いています。
比較が1300件前後でも同じ向きです。32個で2個探すと1285件で27.2%、128個で8個探すと1379件で36.8%です。
1つのシャードだけを探すと、選び方を1回しか間違えられません。外したら、その問いは丸ごと落ちます。
細かく分けて複数を探せば、外しても次の候補が拾います。同じ件数を見るなら1か所からまとめて取るより、何か所かに散らしたほうが当たります。
8個のうち8個すべてを探すと、再現率は100.0%です。比較件数も2万8件で、全件と変わりません。
出典も探す数の効き方を値を大きくすると速度と引き換えに再現率が上がると書いています。リスト数と同じにすれば、厳密な探索と変わらなくなります。
同じ計算量なら、細かく分けて多く探すほうが当たる。
A higher value provides better recall at the cost of speed原文pgvector README(IVFFlat の節) この内容の有効期限2027-02-18
2つの値は役割が違います。分割数は作るときに、探す数は問い合わせのたびに決まります。
ベクタシャーディングでは分割数と探す数の2つを決めます。決めるときも、変えられる時期も別です。
分割数は索引を作るときに決まります。目安としてよく使われるのは件数の平方根です。
この計測の2万件なら141個前後にあたります。128個の行が、その目安に近い位置です。
分割数を変えるには作り直しが要ります。データが増えたら引き直す前提で考えます。
探す数は問い合わせのたびに変えられます。重い問いだけ多く探すといった使い方ができます。
決め方は、業務で許せる再現率の下限からです。128個の索引で36.8%が足りないなら、探す数を増やして表を引き直します。
同じ近似でも、作り方によって性格が変わります。出典はこの方式を構築が速くメモリ使用量も少ないが、問い合わせ性能は劣ると位置づけています。
作り直しが頻繁なら、この方式の速さが効きます。同期パイプラインの記事では、作り直しと差分投入の分かれ目を測っています。
分割数は作るとき、探す数は問い合わせのたび。
ベクトルは式で作った64次元の点です。実際の埋め込みは次元も分布も違い、塊の分かれ方も明確ではありません。シャードの中心も、塊の中心を少しずらして置いたもので、実装が使う手法とは異なります。ここで見せているのは、同じ比較件数でも分け方によって再現率が変わるという関係です。
It has faster build times and uses less memory than HNSW, but has lower query performance原文pgvector README(IVFFlat の節) この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る