RAG・検索基盤

ベクタシャーディングとは|比較を半分に減らしたのに、再現率が6ポイント上がった

ベクタシャーディングで何が変わるのか分割数はどう決めるのか同じ計算量ならどの組み合わせが得か

2万件を8個に分けて1個だけ探すと、比較は2529件で済みます。再現率は30.5%でした。

128個に分けて8個探すと、比較は1379件と少ないのに再現率は36.8%です。

この記事の要点

  • 8個に分けて1個探すと30.5%
  • 128個に分けて8個なら36.8%
  • 比較件数は2529件と1379件
  • 全部探せば100.0%

分けた時点で、上位10件の3割しか取り戻せなくなる

比較件数は分けた割合まで減ります。再現率はそれより速く落ちます。

ベクタシャーディングは、索引を分けて問いに近い一部だけを探す仕組みです。出典もこの動きを説明しています。

その説明は索引はベクトルをリストに分け、問いのベクトルに最も近い一部のリストを探すというものです。

計測に使った条件

文書2万件を64次元のベクトルで作りました。似た文書が40個の塊にまとまるようにしています。

問い300件で上位10件を取ります。全件を見た場合の上位10件を正解とし、そのうち何件を取り戻せたかを再現率としました。

分割数と探す数を動かす

text
シャード数  探すシャード  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割です。減り方が計算量より速いことになります。

近いものが隣のシャードに落ちているためです。塊の境目にある文書ほど、この取りこぼしに当たります。

比較を減らすと、再現率はそれより速く落ちる。

単位: %8個探す(比較100%)100%4個探す(比較50.1%)76.5%2個探す(比較25.1%)50.1%1個探す(比較12.6%)30.5%文書2万件・問い300件での実測。値は全件を見たときの上位10件を取り戻せた割合。
図1 ── 8個に分けたときの比較と再現率
出典pgvector README(IVFFlat の節)2026-08-18 確認
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件で、全件と変わりません。

出典も探す数の効き方を値を大きくすると速度と引き換えに再現率が上がると書いています。リスト数と同じにすれば、厳密な探索と変わらなくなります。

同じ計算量なら、細かく分けて多く探すほうが当たる。

単位: %32個で4個(2540件)42.7%128個で8個(1379件)36.8%8個で1個(2529件)30.5%32個で2個(1285件)27.2%文書2万件・問い300件での実測。括弧内は1問あたりの比較件数。
図2 ── 比較件数をそろえたときの再現率
出典pgvector README(IVFFlat の節)2026-08-18 確認
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%が足りないなら、探す数を増やして表を引き直します。

別の作り方と比べる

同じ近似でも、作り方によって性格が変わります。出典はこの方式を構築が速くメモリ使用量も少ないが、問い合わせ性能は劣ると位置づけています。

作り直しが頻繁なら、この方式の速さが効きます。同期パイプラインの記事では、作り直しと差分投入の分かれ目を測っています。

分割数は作るとき、探す数は問い合わせのたび。

充足 2 / 4全件を見たときの上位を保存している正解がないと、分けたあとの再現率を測れない許せる再現率の下限を決めている下限がないと、探す数をどこまで減らせるか判断できない粗く分けて1つだけ探している同じ比較件数でも、細かく分けた場合より12ポイント低い分割数を後から変えるつもりでいる分割数は索引を作るときに決まり、変えるには作り直しが要る文書2万件・問い300件での実測にもとづく。
図3 ── 決める前の点検項目
余談 この計測での注意

ベクトルは式で作った64次元の点です。実際の埋め込みは次元も分布も違い、塊の分かれ方も明確ではありません。シャードの中心も、塊の中心を少しずらして置いたもので、実装が使う手法とは異なります。ここで見せているのは、同じ比較件数でも分け方によって再現率が変わるという関係です。

出典pgvector README(IVFFlat の節)2026-08-18 確認
It has faster build times and uses less memory than HNSW, but has lower query performance
原文pgvector README(IVFFlat の節) この内容の有効期限2027-02-18

よくある質問

索引を分けると精度は落ちますか
落ちます。この計測では8個に分けて1個だけ探すと、全件を見た場合の上位10件のうち30.5%しか取り戻せませんでした。
分割数は少ないほうがよいですか
同じ比較件数なら細かいほうが有利でした。8個で1個探す30.5%に対し、128個で8個探すと36.8%です。
探すシャードを増やせば戻りますか
戻ります。この計測では8個のうち8個すべてを探すと100.0%になりました。比較件数も全件と同じです。
分割数の目安はありますか
件数の平方根あたりから始めるのが一般的です。この計測の2万件なら141個前後にあたります。

まとめ

  • 索引を分けて一部だけ探す
  • 分けた時点で再現率は落ちる
  • 同じ計算量なら細かく分けて多く探す
  • 全部探せば分けない場合と同じ

今日から始められること

  1. 全件を見たときの上位を正解として保存する
  2. 分割数と探す数を変えて再現率を測る
  3. 業務で許せる再現率の下限を決める
  4. その下限を満たす最小の比較件数を選ぶ

実務で組んだベクタシャーディングのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る