Milvusの新しい範囲検索で高度なレコメンデーション・エンジンを解き放つ
#はじめに
類似検索では、特に検索結果の品質と多様性のバランスを取る際に、開発者はしばしば制限の助けを必要とする。Milvusの新機能を紹介します:範囲検索です。この投稿では、Range Searchとは何か、従来のTop-K Searchと比較してどのような場合に使用すべきかを概説し、その技術的なアーキテクチャと使用ガイドを掘り下げます。
範囲検索とは?
Milvusの範囲検索は検索結果におけるベクトルの類似度を細かく制御することができ、関連するベクトルの距離範囲を指定することができます。この機能は、推薦システムにおける従来のKNN検索の限界に対処するものです。
どのような場合にTop-K検索ではなく範囲検索を選択するか?
従来のKNN検索には2つの根本的な欠点がある:
アンバランスな推薦:**類似しすぎているアイテムを推薦し、推薦の質に影響を与える可能性がある。例えば、スポーツニュースのアグリゲータは、同じサッカーの試合に関する複数の記事をユーザーに推薦してしまうかもしれない。これにより、多様なコンテンツが排除され、レコメンデーションが反復的に感じられ、魅力的でなくなる可能性がある。
Top-Kパラメーターの最大値は16,384であるため、大規模なデータクエリーとリソースの利用には問題がある。何百万もの商品からなるデータセットを照会するシナリオを考えてみよう。Top-Kの上限が16,384であることは、ユーザーが興味を持ちそうな何千もの関連商品を見逃す可能性があることを意味します。また、この大量のデータを処理・送信しようとするため、システム・リソースにも負担がかかります。
範囲検索はこれらの問題を解決します。ベクトル類似度の距離範囲を定義することで、バランスの取れた結果を得ることができます。radiusやオプションのrange_filterのようなパラメータを追加することで、より微妙なコントロールが可能になり、クエリー後のフィルタリングが不要になります。この微妙なコントロールにより、レンジサーチは検索結果の正確なコントロールを必要とするアプリケーションに最適です。
##範囲検索の技術的詳細
レンジ・サーチとは何か、そしてどのようなときに使うべきかを探ったところで、そのアーキテクチャとアルゴリズムに飛び込んでみよう。この探索は、その長所、限界、サードパーティライブラリとの統合についての重要な洞察を提供します。
Range Searchフローは、既存のSearchフローをベースに構築されており、上位レベルのほとんどのデータ経路を再利用しています。以下は、検索リクエストを受信した際に実行されるステップの概要である:
**SDKはradiusやrange_filterなどのパラメータを含むユーザー検索リクエストを受信する。
**プロキシは検索リクエストを受け取ると、SearchTaskを作成し、クエリノードに渡す。
Querynode to Segcore: クエリノードはSegcoreのSearchインターフェースをcgoコールで呼び出します。
Segcoreの解析: Segcoreはsearch_paramのパラメータを解析します。radiusパラメータが存在する場合、knowhere::RangeSearchを呼び出します。
Knowhere とサードパーティライブラリ: Knowhere (Milvus コアベクタ実行エンジン) は、インデックスタイプに基づいて、対応するサードパーティライブラリの range_search 関数に呼び出しをルーティングします。
我々がサポートする全てのサードパーティライブラリインデックスは、片側範囲検索を実行するように設定されています。「片側」とは、単一の'radius'パラメータのみを受け付け、その半径内のソートされていない結果をすべて返すことを意味します。以下の表は、異なるインデックス・タイプのRange Searchストラテジーの概要です。
| インデックスタイプ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | IDMAP / BIN_IDMAP|総当たり検索|IVF_xxx / SCF_xxx | IVF_xxx / SCANN / BIN_IVF_xxx
(updated)|中心点に最も近いバケットから検索を開始する。以下の条件のいずれかが満たされたときに検索を停止する:
1. すべてのバケツが検索された
2. 条件を満たすベクトルがバケツに見つからない
3. |
| HNSW
(自己開発)|最上位レイヤーから検索を開始し、ターゲットに最も近いベクトルを特定し、次のレイヤーに進む。最下層(1層目)の最近傍に到達するまで、このプロセスを層ごとに続ける。そこから、この最も近い近傍から始めて、すべての訪問点とその外側の近傍が目的の範囲外になるまで、幅優先探索(Breadth-First Search:BFS)を行う。|
| DISKANN|l_search=min_l_searchで開始する。各反復で l_search = 2 ㎟* l_search とする。以下の条件のいずれかが満たされたとき、探索を停止する:
1. 反復で返される結果の数がl_search / 2未満
2. l_search > max_l_search.
HAMMINGとJACCARDの両方のメトリック型は、バイナリ・データ型の範囲検索を完全にサポートしています。しかし、SUBSTRUCTURE/SUPERSTRUCTUREメトリック型は、そのセマンティクスが真/偽の値システムに基づいているため、範囲検索とは互換性がありません。浮動小数点型インデックスに関しては、L2、IP、COSINE メトリックを使用するものは範囲検索と完全に互換性があります。
以下の表に、範囲検索と互換性のある詳細なインデックスとメトリックス・タイプの概要を示します。
| L2|IP|COSINE|HAMMING|JACCARD|SUBSTRUCTURE|SUPERSTRUCTURE | ------------ | -- | -- | ------ | ------- | ------- | ------------ | -------------- |
| ivf_pq
| ディスキャン
Milvusでの範囲検索の使い方
Milvusで範囲検索を使用するには、検索リクエストの検索パラメータを変更する必要があります。サンプルPythonコードを含むステップバイステップガイドを以下に示します:
前提条件
Milvusがインストールされ、実行されていることを確認してください。
コレクションを作成し、インデックスを作成していることを確認する。
重要な範囲検索パラメータ
radius: これは、検索リクエストが範囲検索を実行するか、通常検索を実行するかを決定する必須パラメータです。
range_filter:**これはオプションのパラメータである。指定された場合、結果に対して二次的なフィルタリングを行います。指定されない場合、この関数は結果を直接返します。
これら2つのパラメータを設定することで、異なるアプリケーションのニーズに対して、範囲検索クエリの動作を微調整することができます。このことを念頭に置いて、いくつかのサンプルコードを見てみましょう。
default_index = {
"index_type":"HNSW"、
"metric_type":"L2",
「params":{"M":48,"efConstruction":500}
}
collection.create_index("float_vector", default_index)
search_params = { { "metric_type": { "M:48
"metric_type":"L2",
"limit":TOPK、
「params":{"ef":32,"range_filter":1.0,"radius":2.0}
}
res = collection.search(vectors[:nq], "float_vector", search_params, limit)
メトリクスに関する考察
レンジサーチの使い方を理解したところで、メトリックタイプがクエリに与える影響を考慮することが不可欠です。選択したメトリックタイプに応じて、以下の表で提案したようにRadiusをチェックする必要があります。
| メトリックタイプ|半径|類似|非類似 | ----------- | ----------- | ------- | ----------- | | L2|[0.0、inf]|0.0|inf|||IP|[-inf、inf | IP|[-inf,inf]|inf|-inf|-inf|-inf|-inf | コサイン|[-1.0, 1.0]|1.0|| -1.0||HAMMING
さらに、range_filterは以下のルールに従わなければならない:
L2/ハミング/ジャカードの場合、range_filter < radius
IP/コサインの場合、range_filter > radius
結論
Milvusの範囲検索はレコメンデーションエンジンに限らず、コンテンツマッチング、異常検知、NLP検索タスクなど、より幅広い分野で応用できます。radiusやrange_filterのようなパラメータを活用することで、これらの多様なユースケースに合わせてクエリを正確に調整することができます。
検索リクエストをコントロールする準備はできましたか?範囲検索は現在、Zilliz Cloudでパブリックプレビューが可能です。Zilliz Cloudベータ版にアップグレードするか、Milvus 2.3.xをダウンロードしてお試しください。皆様のご意見・ご感想が今後の改善の鍵となります。一緒にレンジサーチをより良いものにしていきましょう。
読み続けて

Will Amazon S3 Vectors Kill Vector Databases—or Save Them?
AWS S3 Vectors aims for 90% cost savings for vector storage. But will it kill vectordbs like Milvus? A deep dive into costs, limits, and the future of tiered storage.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.

How to Calculate the Total Cost of Your RAG-Based Solutions
In this guide, we’ll break down the main components of RAG costs and show you how to calculate these expenses using the Zilliz RAG Cost Calculator,



