EmbeddingList 検索戦略の選択
EmbeddingList検索戦略は、MilvusがEmbeddingList検索用の近似候補インデックスをどのように構築するかを決定します。デフォルトの戦略はtokenann です。EmbeddingListの規模が大きい場合、TokenANNの計算コストが高すぎる場合、または学習済み/圧縮された行レベルの表現の方が適している場合は、muvera またはlemur に切り替えることができます。emb_list_rerank が有効になっている場合、最終結果は依然としてMaxSimによる再ランク付けによって生成されます。
検索戦略が存在する理由
EmbeddingListは、テキスト文書内のトークン埋め込み、画像文書内のパッチ埋め込み、動画内のクリップ埋め込みなど、複数のベクトルを含む行を対象として設計されています。MaxSimは、1つのクエリベクトルと1つの行ベクトルを比較するのではなく、クエリ埋め込みリストと文書埋め込みリストを比較し、最も一致度の高いものを集約します。
これにより表現力は向上しますが、大規模な環境では厳密なMaxSimの計算コストが高くなります。ブルートフォース方式のMaxSim検索では、クエリベクトルを候補となる各行のすべてのベクトルと比較する必要があります。これは通常、本番環境での検索には遅すぎます。
| ### 問題点 - 各行には多数のベクトルが含まれる可能性がある。 - すべての行に対して厳密なMaxSimを実行すると計算コストが高くなる。 - インデックスのサイズと検索のレイテンシが急速に増加する可能性がある。 | ### 戦略 - 第1段階の検索には近似手法を使用する。 - 要求されたトップKよりも多くの候補を抽出する。 - 正確なMaxSimを用いて候補を再ランク付けする。 |
|---|
この意味で、emb_list_strategy は主にインデックス構築および候補抽出の戦略である。これはインデックス構築時に設定され、第1段階のANN候補セットがどのように生成されるかを決定する。その後、retrieval_ann_ratio やemb_list_rerank といった検索時のパラメータによって、抽出される候補の数や、MaxSimによる再ランク付けが適用されるかどうかが制御される。
利用可能な戦略
| 戦略 | 候補取得ユニット | 解決対象 | ベストフィット | 主なトレードオフ |
|---|---|---|---|---|
tokenann | 各行内の個々のベクトル | 元のベクトルを保持し、圧縮による損失を回避できる。 | 品質を優先した検索、短・中程度の埋め込みリスト、識別性の高い埋め込み。 | インデックスが大きくなり、候補の検索コストが高くなる。 |
muvera | 行ごとに1つのエンコード済みベクトル | 学習を行わずに、埋め込みリストを固定次元のFDE表現に圧縮します。 | より長いドキュメント、識別力の高い埋め込み、TokenANN が負荷が大きすぎる場合。 | ランダム投影により近似損失が生じる。FDE の次元はレイテンシに影響する。 |
lemur | 行ごとに1つの学習済みベクトル | 埋め込みリストから固定次元の行ベクトルへの、コーパス固有の圧縮を学習する。 | 識別度の低い埋め込み、マルチモーダルまたは視覚的文書検索、大規模な埋め込みリスト。 | トレーニングが必要であり、コーパスの分布や文書長バイアスに敏感になる可能性がある。 |
TokenANN
tokenann 埋め込みリスト内のすべてのベクトルにインデックスを付与します。検索時には、各クエリベクトルに対してANN検索を実行し、一致したベクトルを行単位に集約し、その結果得られた行候補をMaxSimを用いて再ランク付けします。
品質を最優先する場合は、TokenANN を使用してください。第1段階のインデックスですべてのベクトルを保持するため、元の MaxSim 計算に最も近い近似となります。
適しているケース:短いテキストチャンク、ベクトル数が少ないまたは中程度の行、トークンレベルでの意味的な分離が明確な場合、品質を重視するベースライン。
あまり適さないケース:非常に長い文書、数千のパッチベクトルを含むビジュアルページ、メモリやレイテンシの制約が厳しい場合。
要素レベルの挙動:TokenANNは、個々のベクトルから候補を取得し、それらを行に集約し直すことができます。MaxSimによるスコアリング後の最終的なEmbeddingListの検索結果は、依然として行レベルとなります。
MUVERA
muvera は、ランダム投影を用いて各埋め込みリストを固定次元のベクトルにエンコードします。これにより、第1段階の検索は標準的な行レベルのベクトル検索となります。その後、候補はMaxSimを用いて再ランク付けされます。
TokenANNの処理負荷が高すぎるが、トレーニングステップは省きたい場合にMUVERAを使用します。これは、品質とコストのバランスが取れた実用的な中間的な選択肢です。
適しているケース:長文ドキュメント、識別能力の高い埋め込み空間、TokenANNよりもインデックスサイズを小さくする必要があるワークロード。
適さないケース:識別度の低い埋め込み空間、またはFDE表現の次元数が遅延許容範囲を超えてしまう場合。
重要なパラメータ:
muvera_num_projections、muvera_num_repeats、およびmuvera_seed。
LEMUR
lemur は、各埋め込みリストを固定次元の表現に圧縮するモデルを学習させます。第1段階のANN検索は学習済みの行レベルベクトルに対して実行され、候補はMaxSimを用いて再ランク付けされます。
学習による圧縮がトレーニングコストに見合う場合にLEMURを使用してください。識別度の低い埋め込み空間やマルチモーダル検索では良好な性能を発揮しますが、文書長分布の影響を受けやすいため、対象コーパスに対して検証を行う必要があります。
適している用途:ビジュアル・ドキュメント検索、マルチモーダルパッチ埋め込み、識別度の低い埋め込み空間、TokenANNが実用的でない大規模な埋め込みリスト。
あまり適さない用途:頻繁に変化するコーパス、文書長が著しく偏っている高識別度の埋め込み空間、トレーニングコストが許容できないワークロード。
重要なパラメータ:
lemur_hidden_dim、lemur_num_train_samples、lemur_num_epochs、lemur_batch_size、lemur_learning_rate、lemur_seed、およびlemur_num_layers。
デフォルトの動作と設定
Knowhere のデフォルトの EmbeddingList 戦略はtokenann です。emb_list_strategy を指定しない場合、Knowhere は TokenANN を使用します。検索時のデフォルトには、retrieval_ann_ratio=3.0 およびemb_list_rerank=true が含まれます。
戦略ごとの設定項目
次の表に、戦略ごとの設定項目を一覧表示します。Milvusでは、通常、インデックス作成時にparams マップを通じてビルド時の設定項目が渡されます。サーバー側のデフォルト設定が必要な場合は、Milvusの設定ファイル内のknowhere セクションで定義する必要があります。
| 戦略 | 設定項目 | ステージ | デフォルト | 変更が必要な場合 |
|---|---|---|---|---|
tokenann | emb_list_strategy="tokenann" | インデックスの構築 | tokenann | デフォルトの要素ベクトルインデックス作成動作を適用したい場合や、DiskANN を使用する場合は、明示的に使用してください。 |
muvera | emb_list_strategy="muvera" | インデックス構築 | tokenann | トレーニングを行わずに、行レベルのエンコードされた検索を行いたい場合に使用します。 |
muvera | muvera_num_projections | インデックスの構築 | 4 | SimHash の投影数を制御します。値が大きいほどバケット数が増え、エンコーディング品質が向上する可能性がありますが、エンコード後の次元数は増加します。 |
muvera | muvera_num_repeats | インデックスの構築 | 7 | 連結される独立したFDEエンコーディングの数を制御します。値を大きくすると堅牢性が向上する可能性がありますが、インデックス作成および検索のコストが増加します。 |
muvera | muvera_seed | インデックス構築 | 42 | 特にテストやベンチマーク比較において、再現性のあるランダムな射影を行うために設定します。 |
lemur | emb_list_strategy="lemur" | インデックス構築 | tokenann | 学習済み行レベル圧縮が、固定ランダム投影よりも優れた性能を発揮すると予想される場合に使用します。 |
lemur | lemur_hidden_dim | インデックス構築 | 256 | 圧縮後の表現サイズを制御します。容量を増やすには値を大きくし、メモリ使用量を減らして検索速度を向上させるには値を小さくします。 |
lemur | lemur_num_train_samples | インデックスの構築 | 20000 | コーパスが多様で、学習された圧縮が過小適合している場合は値を大きくします。値を下げるのは、小規模なテストや構築速度の向上の場合に限ります。 |
lemur | lemur_num_epochs | インデックス構築 | 50 | 学習が収束していない場合は値を大きくし、構築時間が主な制約となる場合は値を小さくします。 |
lemur | lemur_batch_size | インデックス構築 | 512 | トレーニングのスループットとメモリ使用量に合わせて調整してください。 |
lemur | lemur_learning_rate | インデックス構築 | 0.001 | トレーニングが不安定な場合や収束が遅すぎる場合は調整する。 |
lemur | lemur_seed | インデックスの構築 | 42 | トレーニングの実行結果を再現可能にするために設定します。 |
lemur | lemur_num_layers | インデックスの構築 | 2 | コーパスにより表現力の高い特徴量抽出器が必要であり、かつ追加の学習コストを許容できる場合にのみ、この値を増加させてください。 |
| すべての戦略 | retrieval_ann_ratio | 検索 | 3.0 | 第1段階の候補をより多く取得してリコール率を向上させる場合は増加させ、レイテンシを低減させる場合は減少させます。 |
| すべての戦略 | emb_list_rerank | 検索 | true | MaxSimによる再ランク付けを行う場合は有効のままにしておきます。第1段階のANNの品質を直接測定する制御された実験の場合にのみ無効にしてください。 |
Milvus での戦略の設定
Milvus では、StructArray ベクトルサブフィールドなどの EmbeddingList フィールドにインデックスを作成する際、この戦略がインデックスパラメータとして渡されます。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="clips[clip_embedding]",
index_type="HNSW",
metric_type="MAX_SIM_COSINE",
params={
"M": 16,
"efConstruction": 96,
"emb_list_strategy": "muvera",
"muvera_num_projections": 4,
"muvera_num_repeats": 7,
"muvera_seed": 42,
},
)
LEMUR の場合、同じ `params ` マップ内に LEMUR のトレーニングパラメータを指定してください。
params={
"M": 16,
"efConstruction": 96,
"emb_list_strategy": "lemur",
"lemur_hidden_dim": 256,
"lemur_num_train_samples": 20000,
"lemur_num_epochs": 50,
"lemur_batch_size": 512,
"lemur_learning_rate": 0.001,
"lemur_seed": 42,
"lemur_num_layers": 2,
}
Milvusでのサーバーサイドのデフォルト設定
Milvusでは、milvus.yaml からインデックスパラメータを設定することも可能です。関連するセクションはknowhere です。パラメータは、knowhere.<INDEX_TYPE>.<stage>.<parameter> というパターンに従い、インデックスのタイプとステージごとに整理されています。ユーザーが指定したインデックスパラメータは、これらのデフォルト設定よりも優先されます。
knowhere:
enable: true
HNSW:
build:
emb_list_strategy: muvera
muvera_num_projections: 4
muvera_num_repeats: 7
muvera_seed: 42
search:
retrieval_ann_ratio: 3.0
emb_list_rerank: true
戦略の選択には、インデックスごとのパラメータを優先してください。Milvusの設定ファイルのデフォルト値は、そのタイプおよびステージのインデックス全体に広く適用されます。異なるコレクションやフィールドで異なるEmbeddingList戦略が必要な場合は、create_index のパラメータを使用してください。
検索時の候補取得の設定
この戦略は、インデックスの構築方法を決定します。検索時には、retrieval_ann_ratio を使用して、MaxSim による再ランク付けの前に、第 1 ステージの候補をいくつ取得するかを制御します。通常、この値を高く設定するとリコール率は向上しますが、レイテンシは増加します。
results = client.search(
collection_name=collection_name,
data=[query_embedding_list],
anns_field="clips[clip_embedding]",
search_params={
"metric_type": "MAX_SIM_COSINE",
"params": {
"ef": 64,
"retrieval_ann_ratio": 3.0,
"emb_list_rerank": True,
},
},
limit=10,
)
| パラメータ | ステージ | デフォルト | 意味 |
|---|---|---|---|
emb_list_strategy | インデックス構築 | tokenann | EmbeddingList の候補がどのようにインデックス化され、取得されるかを選択します。 |
retrieval_ann_ratio | 検索 | 3.0 | ANNの第1ラウンドにおける候補の拡張係数。 |
emb_list_rerank | 検索 | true | MaxSim を使用して、検索された候補の再ランク付けを行うかどうか。 |
互換性に関する注意事項:MUVERA および LEMUR は現在、Knowhere での fp32 データをサポートしています。DiskANN は、TokenANN 戦略でのみ EmbeddingList をサポートしています。fp32 以外のベクトル型や DiskANN を使用する場合は、デフォルトを変更する前に、戦略のサポート状況を確認してください。
戦略の選び方
普遍的に最良の戦略というものはありません。埋め込みリストの長さ、埋め込み空間の識別能力、レイテンシの許容範囲、インデックスのサイズ、およびトレーニングステップの実施が可能かどうかに基づいて選択してください。
| 質問 | シグナル | 推奨される出発点 |
|---|---|---|
| 高品質なベースラインが必要ですか? | コストを最適化する前に、実用上最良の近似値を測定したい場合。 | tokenann |
| ベクトル数の行は少ないですか、それとも中程度ですか? | 各行に含まれるトークン、パッチ、またはクリップベクトルの数は少ないですか? | tokenann |
| TokenANNが大きすぎる、あるいは処理が遅すぎるでしょうか? | インデックスのサイズや第1段階の検索レイテンシがボトルネックとなっています。 | muvera |
| トレーニングを行わずに圧縮を行いたいですか? | よりシンプルな運用モデルと再現性のあるエンコーディングが必要です。 | muvera |
| 埋め込み空間の識別力が低いですか? | トークンレベルのANN候補にはノイズが多く、ランダム投影では十分な信号が保持されません。 | lemur |
| ワークロードは視覚的か、それともマルチモーダルか? | 行には多くのパッチベクトルが含まれており、TokenANNは計算コストが高すぎます。 | lemur あるいはmuvera |
| 文書の長さに大きな偏りがありますか? | 一部の行には、他の行よりもはるかに多くのベクトルが含まれています。 | まずはmuvera から始め、lemur を慎重に検証してください。 |
推奨される評価ワークフロー
データセットのサイズが許す場合は、品質のベースラインとして
tokenannから開始してください。muveraを使用して同じクエリを実行し、リコール、nDCG、レイテンシ、およびインデックスサイズを比較してください。埋め込みリストが大きい場合、埋め込み空間にノイズが多い場合、またはワークロードがビジュアルまたはマルチモーダルである場合は、
lemurを試してみてください。ビルド時のパラメータを大幅に変更する前に、
retrieval_ann_ratioを調整してください。リコール率が低い場合は値を大きくし、レイテンシが高すぎる場合は値を小さくしてください。常に、代表的なクエリや文書長分布を用いて検証を行ってください。短いテキストで有効な戦略でも、視覚的ドキュメントやロングテールコーパスでは機能しない場合があります。
### 品質優先 まず `tokenann` から始めてください。これを MaxSim の近似品質のベースラインとして使用してください。 | ### バランス重視 トレーニングパイプラインを追加せずにコストを抑えたい場合は、muvera を試してみてください。 | ### 圧縮:学習された行レベルの圧縮が、固定のランダムプロジェクションよりも優れた性能を発揮する可能性が高い場合は、lemur を試してみてください。 |
|---|
本草案で使用した参考文献
emb_list_strategy、retrieval_ann_ratio、およびemb_list_rerankに関する Milvus のテスト。Milvusのサーバーサイドインデックスのデフォルト設定に関する設定ファイルの取り扱いについては、「
knowhere」セクションを参照してください。デフォルト値およびサポートされる戦略名に関する Knowhere パラメータ定義。
fp32 専用の MUVERA/LEMUR および DiskANN TokenANN のみのサポートに関する Knowhere の互換性チェック。
MaxSim 候補の検索における TokenANN、MUVERA、および LEMUR を比較した内部評価ノート。
公開に関する注意:外部に公開する前に、対象の Milvus リリースでどのパラメータが公式にサポートされているか、また、その製品がすべての低レベルの Knowhere パラメータを公開するつもりなのか、それとも文書化されたごく一部のサブセットのみを公開するつもりなのかを確認してください。