上位10件を取ってから条件で絞ると、条件に合う上位10件のうち87.8%を取りこぼしました。
先に絞ってから探せば取りこぼしは0件です。比較の回数はほぼ同じでした。
2種類の索引を組み合わせられます。組み合わせないと、順番の違いがそのまま取りこぼしになります。
Qdrantは、2種類の索引を組み合わせます。公式はQdrantの重要な特徴は、ベクトルの索引と従来型の索引を効果的に組み合わせることであると述べています。
組み合わせないとどうなるのか。順番を変えて実際に探して数えました。
文書 20000件。部署5種・年度7種の条件を持つ 問い 300件。条件に合う文書の中から上位 10件を取りたい やり方 1問の比較 取れた件数 取りこぼし 取りこぼし率 探してから絞る(上位10) 20000件 366件 2634件 87.8% 探してから絞る(上位100) 20000件 1126件 1874件 62.5% 探してから絞る(上位1000) 20000件 3000件 0件 0.0% 絞ってから探す 20571件 3000件 0件 0.0% 条件に合う文書は1問あたり平均 571件。全体の 2.9%
上位10件を取ってから絞ると、取れたのは366件です。2,634件を取りこぼしました。
条件に合う文書が全体の2.9%しかないためです。上位10件の中に、条件に合うものがほとんど入りません。
上位1000件まで広げれば0件になります。ただし100倍の件数を取り出して捨てることになります。
先に絞る形なら、比較は20,571件でほとんど変わりません。取りこぼしも0件です。
この順番の問題は絞り込み検索の記事でも扱っていて、条件に合う割合が小さいほど深刻になります。
上位を広げるより、先に絞るほうが確実で軽い。
A key feature of Qdrant is the effective combination of vector and traditional indexes.原文Qdrant 公式ドキュメント「Indexing」 この内容の有効期限2027-02-18
使う索引は1種類です。効き方は枝の数と探索の幅で決まり、幅のほうが強く効きます。
Qdrantが使う密なベクトルの索引は1種類です。公式はQdrantは現在、密なベクトルの索引としてHNSWだけを使うと述べています。
1種類なので、設定の効き方が要点になります。実際に組み立てて測りました。
登録 20,000件(64次元)・上位10件・問い合わせ 200回
全探索 1回あたり 5450 マイクロ秒
1点あたりの枝 探索の幅 再現率 走査件数 1回あたり 全探索比 枝の総数
4本 16 5.7% 120件 50 μs 109.4倍 128,759本
4本 64 16.6% 336件 141 μs 38.7倍 128,759本
8本 16 8.9% 240件 84 μs 65.1倍 269,218本
8本 64 22.7% 617件 226 μs 24.1倍 269,218本
16本 16 10.4% 478件 167 μs 32.7倍 568,782本
16本 64 33.7% 1,050件 408 μs 13.4倍 568,782本
枝を4本から16本に増やしても、幅が16なら再現率は5.7%から10.4%までです。
幅を16から64に広げると、同じ枝16本で33.7%になります。幅のほうが強く効きました。
枝の総数は128,759本から568,782本へ4.4倍になります。これは作るときと持っておくときの費用です。
探索の幅は、問い合わせのたびに払う費用です。払う場所が違うので、分けて決めることになります。
この再現率の水準は、この計測の条件によるものです。設定の意味そのものは近似最近傍の再現率の記事で扱いました。
Qdrant currently only uses HNSW as a dense vector index.原文Qdrant 公式ドキュメント「Indexing」 この内容の有効期限2027-02-18
索引の作り方は1つではありません。分けて絞る形では、分ける数と見る数で決まります。
Qdrantが使う索引は、決まった数理の型に沿って作られます。公式はベクトルの索引とは、特定の数理の型を通じてベクトルの上に組み立てられたデータ構造であると述べています。
型が違えば効き方も違います。分けて絞る形を実際に組んで比べました。
登録 20,000件(64次元)・上位10件・問い合わせ 200回 全探索 1回あたり 5418 マイクロ秒 組の数 見る組 再現率 走査件数 1回あたり 全探索比 16組 1組 86.7% 1,372件 430 μs 12.6倍 16組 4組 100.0% 4,624件 1384 μs 3.9倍 16組 8組 100.0% 9,638件 3149 μs 1.7倍 16組 16組 100.0% 20,000件 7090 μs 0.8倍 64組 1組 34.1% 319件 139 μs 38.9倍 64組 4組 88.2% 1,261件 454 μs 11.9倍 64組 8組 100.0% 2,484件 854 μs 6.3倍 64組 16組 100.0% 4,897件 1823 μs 3.0倍 256組 1組 15.8% 94件 68 μs 79.9倍 256組 4組 46.5% 373件 159 μs 34.0倍 256組 8組 70.6% 742件 278 μs 19.5倍 256組 16組 96.0% 1,405件 530 μs 10.2倍
16組に分けて1組だけ見れば、再現率86.7%で12.6倍の速さです。粗く分けるほど1組が大きくなります。
256組では1組で15.8%しか取れません。16組まで見て96.0%、そのとき10.2倍でした。
16組で4組を見ると100.0%・3.9倍、64組で8組を見ても100.0%・6.3倍です。細かく分けたほうが速く同じ再現率に届きました。
つまり分け方は、細かいほうが有利になる範囲があります。ただし細かくすると、1組しか見ない場合の再現率は落ちます。
3つの計測はいずれも手元で書いた模型で、実際のQdrantを動かしたものではありません。64次元・2万件という規模は実運用より小さく、再現率の水準はそのままあてはまりません。条件に合う文書の割合2.9%も置いた値です。分けて絞る形の実装も簡単なもので、実際の製品が使っている手法とは違います。ここで見せているのは、絞る順番だけで取りこぼしが変わるという点と、探索の幅のほうが枝の数より強く効くという点の2つです。
A vector index is a data structure built on vectors through a specific mathematical model.原文Qdrant 公式ドキュメント「Indexing」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る