Wählen Sie eine Suchstrategie für die EmbeddingList-Suche
EmbeddingList-Suchstrategien legen fest, wie Milvus einen approximativen Kandidatenindex für die EmbeddingList-Suche erstellt. Die Standardstrategie ist „ tokenann “. Sie können zu „ muvera “ oder „ lemur “ wechseln, wenn die Embedding-Liste groß ist, „TokenANN“ zu rechenintensiv ist oder eine gelernte/komprimierte Darstellung auf Zeilenebene besser geeignet ist. Das Endergebnis wird weiterhin durch das MaxSim-Reranking erzeugt, wenn „ emb_list_rerank “ aktiviert ist.
Warum es Suchstrategien gibt
„EmbeddingList“ ist für Zeilen konzipiert, die mehrere Vektoren enthalten, wie beispielsweise Token-Einbettungen in einem Textdokument, Patch-Einbettungen in einem visuellen Dokument oder Clip-Einbettungen in einem Video. Anstatt einen Abfragevektor mit einem Zeilenvektor zu vergleichen, vergleicht MaxSim eine Abfrage-Einbettungsliste mit einer Dokument-Einbettungsliste und aggregiert die besten Übereinstimmungen.
Dies bietet eine bessere Repräsentationskraft, doch ein exakter MaxSim-Vorgang ist bei großem Umfang rechenintensiv. Eine Brute-Force-MaxSim-Suche müsste die Abfragevektoren mit jedem Vektor in jeder Kandidatenzeile vergleichen. Das ist für die Suche im Produktivbetrieb in der Regel zu langsam.
| ### Problem – Jede Zeile kann viele Vektoren enthalten. – Exaktes MaxSim über alle Zeilen hinweg ist rechenintensiv. – Indexgröße und Suchlatenz können schnell ansteigen. | ### Strategie – Verwenden Sie eine approximative Abrufmethode in der ersten Stufe. – Rufen Sie mehr Kandidaten ab als die angeforderten Top-K. – Ordnen Sie die Kandidaten mit exaktem MaxSim neu. |
|---|
In diesem Sinne ist „ emb_list_strategy “ in erster Linie eine Strategie zur Indexerstellung und Kandidatenauswahl. Sie wird beim Erstellen des Indexes konfiguriert und bestimmt, wie die ANN-Kandidatenmenge der ersten Stufe erzeugt wird. Suchzeitparameter wie „ retrieval_ann_ratio “ und „ emb_list_rerank “ steuern dann, wie viele Kandidaten abgerufen werden und ob eine MaxSim-Neureihung angewendet wird.
Verfügbare Strategien
| Strategie | Einheit zur Kandidatenauswahl | Was sie löst | Best-Fit | Wichtigster Kompromiss |
|---|---|---|---|---|
tokenann | Einzelne Vektoren innerhalb jeder Zeile | Behält die ursprünglichen Vektoren bei und vermeidet Kompressionsverluste. | Qualitätsorientierte Suche, kurze oder mittellange Einbettungslisten, Einbettungen mit hoher Unterscheidungskraft. | Größerer Index und höherer Aufwand beim Abruf von Kandidaten. |
muvera | Ein kodierter Vektor pro Zeile | Komprimiert eine Einbettungsliste ohne Training in eine FDE-Darstellung mit fester Dimension. | Längere Dokumente, Embeddings mit hoher Unterscheidungskraft, Fälle, in denen TokenANN zu ressourcenintensiv ist. | Die zufällige Projektion führt zu einem Approximationsverlust; die FDE-Dimension beeinflusst die Latenz. |
lemur | Ein gelernter Vektor pro Zeile | Lernt eine korpus-spezifische Komprimierung von Einbettungslisten zu festdimensionalen Zeilenvektoren. | Embeddings mit geringer Unterscheidungskraft, multimodale oder visuelle Dokumentensuche, große Einbettungslisten. | Erfordert Training und kann empfindlich auf die Korpusverteilung und Verzerrungen durch die Dokumentlänge reagieren. |
TokenANN
tokenann indiziert jeden Vektor in der Einbettungsliste. Während der Suche führt jeder Abfragevektor eine ANN-Abfrage durch, übereinstimmende Vektoren werden wieder zu ihren Zeilen zusammengefasst, und die resultierenden Zeilenkandidaten werden mit MaxSim neu gereiht.
Verwenden Sie TokenANN, wenn Qualität oberste Priorität hat. Es ist die genaueste Annäherung an die ursprüngliche MaxSim-Berechnung, da alle Vektoren im Index der ersten Stufe verfügbar bleiben.
Gut geeignet für: kurze Textabschnitte, Zeilen mit einer geringen oder moderaten Anzahl von Vektoren, starke semantische Trennung auf Token-Ebene, qualitätssensitive Baselines.
Weniger geeignet: sehr lange Dokumente, visuelle Seiten mit Tausenden von Patch-Vektoren, strenge Speicher- oder Latenzbeschränkungen.
Verhalten auf Elementebene: TokenANN kann Kandidaten aus einzelnen Vektoren abrufen, bevor diese wieder zu Zeilen aggregiert werden. Das endgültige Suchergebnis der „EmbeddingList“ liegt nach der MaxSim-Bewertung weiterhin auf Zeilenebene.
MUVERA
muvera kodiert jede Einbettungsliste mithilfe zufälliger Projektionen in einen Vektor fester Dimension. Dadurch wird die Suche in der ersten Stufe zu einer standardmäßigen Vektorsuche auf Zeilenebene. Die Kandidaten werden anschließend mit MaxSim neu gewichtet.
Verwenden Sie MUVERA, wenn TokenANN zu ressourcenintensiv ist, Sie aber auf einen Trainingsschritt verzichten möchten. Es stellt einen praktischen Mittelweg zwischen Qualität und Kosten dar.
Gut geeignet für: lange Textdokumente, Embedding-Räume mit hoher Unterscheidungskraft, Workloads, die eine geringere Indexgröße als bei TokenANN erfordern.
Weniger geeignet: Einbettungsräume mit geringer Unterscheidungskraft oder Fälle, in denen die FDE-Darstellung für das Latenzbudget zu hochdimensional wird.
Wichtige Parameter: „
muvera_num_projections“, „muvera_num_repeats“ und „muvera_seed“.
LEMUR
lemur trainiert ein Modell, um jede Einbettungsliste in eine Darstellung fester Dimension zu komprimieren. Die ANN-Suche der ersten Stufe läuft auf den gelernten Vektoren auf Zeilenebene, und die Kandidaten werden mit MaxSim neu gewichtet.
Verwenden Sie LEMUR, wenn der Trainingsaufwand für die gelernte Komprimierung gerechtfertigt ist. Es eignet sich gut für Einbettungsräume mit geringer Unterscheidungskraft und für die multimodale Suche, sollte jedoch anhand des Zielkorpus validiert werden, da es empfindlich auf die Verteilung der Dokumentlängen reagieren kann.
Gut geeignet: visuelle Dokumentensuche, multimodale Patch-Einbettungen, Einbettungsräume mit geringer Unterscheidungskraft, große Einbettungslisten, bei denen TokenANN nicht praktikabel ist.
Weniger geeignet: sich häufig ändernde Korpora, Embeddings mit hoher Unterscheidungskraft und stark verzerrten Dokumentlängen, Anwendungsfälle, bei denen die Trainingskosten inakzeptabel sind.
Wichtige Parameter: „
lemur_hidden_dim“, „lemur_num_train_samples“, „lemur_num_epochs“, „lemur_batch_size“, „lemur_learning_rate“, „lemur_seed“ und „lemur_num_layers“.
Standardverhalten und Konfiguration
Die Standardstrategie für „EmbeddingList“ in Knowhere ist „ tokenann “. Wenn Sie „ emb_list_strategy “ nicht angeben, verwendet Knowhere „TokenANN“. Zu den Standardwerten bei der Suche gehören „ retrieval_ann_ratio=3.0 “ und „ emb_list_rerank=true “.
Konfigurationselemente nach Strategie
Die folgende Tabelle listet die strategiespezifischen Konfigurationselemente auf. In Milvus werden Elemente zur Erstellungszeit üblicherweise beim Anlegen eines Indexes über die Map „ params “ übergeben. Wenn Sie serverseitige Standardwerte benötigen, sollten diese in der Milvus-Konfigurationsdatei im Abschnitt „ knowhere “ definiert werden.
| Strategie | Konfigurationselement | Stufe | Standard | Wann sollte es geändert werden |
|---|---|---|---|---|
tokenann | emb_list_strategy="tokenann" | Index-Erstellung | tokenann | Verwenden Sie diese Option explizit, wenn Sie das Standardverhalten bei der Elementvektor-Indizierung wünschen oder wenn DiskANN verwendet wird. |
muvera | emb_list_strategy="muvera" | Indexaufbau | tokenann | Verwenden Sie diese Option, wenn Sie eine zeilenbasierte, kodierte Abfrage ohne Training wünschen. |
muvera | muvera_num_projections | Indexaufbau | 4 | Steuert die Anzahl der SimHash-Projektionen. Höhere Werte erzeugen mehr Buckets und können die Kodierungsqualität verbessern, erhöhen jedoch die kodierte Dimensionalität. |
muvera | muvera_num_repeats | Indexaufbau | 7 | Steuert, wie viele unabhängige FDE-Kodierungen verkettet werden. Höhere Werte können die Robustheit verbessern, erhöhen jedoch den Index- und Suchaufwand. |
muvera | muvera_seed | Indexaufbau | 42 | Wird für reproduzierbare Zufallsprojektionen festgelegt, insbesondere bei Tests und Benchmark-Vergleichen. |
lemur | emb_list_strategy="lemur" | Indexaufbau | tokenann | Verwenden Sie diese Einstellung, wenn erwartet wird, dass die gelernte Komprimierung auf Zeilenebene besser funktioniert als die feste zufällige Projektion. |
lemur | lemur_hidden_dim | Indexaufbau | 256 | Steuert die Größe der komprimierten Darstellung. Erhöhen Sie diesen Wert für mehr Kapazität; verringern Sie ihn für geringeren Speicherbedarf und schnelleren Abruf. |
lemur | lemur_num_train_samples | Indexaufbau | 20000 | Erhöhen Sie diesen Wert, wenn der Korpus vielfältig ist und die gelernte Komprimierung unterangepasst ist; verringern Sie ihn nur für kleine Tests oder schnellere Erstellungen. |
lemur | lemur_num_epochs | Indexaufbau | 50 | Erhöhen Sie den Wert, wenn das Training noch nicht konvergiert ist; verringern Sie ihn, wenn die Erstellungszeit die wichtigste Einschränkung darstellt. |
lemur | lemur_batch_size | Indexaufbau | 512 | Passen Sie den Wert an den Trainingsdurchsatz und die Speicherauslastung an. |
lemur | lemur_learning_rate | Index-Erstellung | 0.001 | Anpassen, wenn das Training instabil ist oder zu langsam konvergiert. |
lemur | lemur_seed | Indexaufbau | 42 | Für reproduzierbare Trainingsläufe einstellen. |
lemur | lemur_num_layers | Indexaufbau | 2 | Erhöhen Sie diesen Wert nur, wenn der Korpus einen ausdrucksstärkeren Merkmalsextraktor benötigt und Sie sich zusätzliche Trainingskosten leisten können. |
| Alle Strategien | retrieval_ann_ratio | Suche | 3.0 | Erhöhen Sie diesen Wert, um mehr Kandidaten der ersten Stufe zu finden und den Recall zu verbessern; verringern Sie ihn, um die Latenz zu reduzieren. |
| Alle Strategien | emb_list_rerank | Suche | true | Für das MaxSim-Reranking aktiviert lassen. Nur für kontrollierte Experimente deaktivieren, bei denen die Qualität des ANN der ersten Stufe direkt gemessen wird. |
Konfigurieren der Strategie in Milvus
In Milvus wird die Strategie als Indexparameter übergeben, wenn ein Index für ein EmbeddingList-Feld erstellt wird, beispielsweise für ein StructArray-Vektor-Unterfeld.
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,
},
)
Für LEMUR geben Sie die LEMUR-Trainingsparameter in derselben „ params “-Zuordnung an.
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,
}
Konfigurieren der serverseitigen Standardeinstellungen in Milvus
Milvus kann Indexparameter auch aus „ milvus.yaml “ übernehmen. Der relevante Abschnitt ist „ knowhere “. Die Parameter sind nach Indextyp und -stufe organisiert und folgen dem Muster „ knowhere.<INDEX_TYPE>.<stage>.<parameter> “. Vom Benutzer angegebene Indexparameter haben Vorrang vor diesen Standardwerten.
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
Bevorzugen Sie indexspezifische Parameter für die Strategieauswahl. Ein Standardwert aus der Milvus-Konfigurationsdatei gilt allgemein für Indizes dieses Typs und dieser Stufe. Verwenden Sie die Parameter unter create_index, wenn verschiedene Sammlungen oder Felder unterschiedliche „EmbeddingList“-Strategien erfordern.
Konfigurieren Sie die Kandidatenauswahl zum Zeitpunkt der Suche
Die Strategie bestimmt, wie der Index aufgebaut wird. Legen Sie zum Zeitpunkt der Suche über retrieval_ann_ratio fest, wie viele Kandidaten der ersten Stufe vor dem MaxSim-Reranking abgerufen werden sollen. Höhere Werte verbessern in der Regel den Recall, erhöhen jedoch die Latenz.
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,
)
| Parameter | Stufe | Standard | Bedeutung |
|---|---|---|---|
emb_list_strategy | Indexaufbau | tokenann | Legt fest, wie EmbeddingList-Kandidaten indiziert und abgerufen werden. |
retrieval_ann_ratio | Suche | 3.0 | Erweiterungsfaktor für Kandidaten in der ersten ANN-Runde. |
emb_list_rerank | Suche | true | Legt fest, ob abgerufene Kandidaten mit MaxSim neu gewichtet werden sollen. |
Hinweise zur Kompatibilität: MUVERA und LEMUR unterstützen derzeit fp32-Daten in Knowhere. DiskANN unterstützt „EmbeddingList“ nur mit der TokenANN-Strategie. Wenn Sie andere Vektortypen als fp32 oder DiskANN verwenden, überprüfen Sie die Strategieunterstützung, bevor Sie die Standardeinstellung ändern.
So wählen Sie eine Strategie aus
Es gibt keine allgemein beste Strategie. Treffen Sie Ihre Wahl anhand der Länge der Einbettungsliste, der Unterscheidungskraft im Einbettungsraum, des Latenzbudgets, der Indexgröße und der Frage, ob Sie sich einen Trainingsschritt leisten können.
| Frage | Signal | Empfohlener Ausgangspunkt |
|---|---|---|
| Benötigen Sie eine hochwertige Baseline? | Sie möchten die beste praktische Annäherung ermitteln, bevor Sie die Kosten optimieren. | tokenann |
| Sind die Zeilen kurz oder haben sie eine moderate Anzahl an Vektoren? | Jede Zeile enthält eine geringe Anzahl von Token-, Patch- oder Clip-Vektoren. | tokenann |
| Ist TokenANN zu groß oder zu langsam? | Die Indexgröße oder die Latenz beim Abruf in der ersten Stufe stellt den Engpass dar. | muvera |
| Möchten Sie eine Komprimierung ohne Training? | Sie benötigen ein einfacheres Betriebsmodell und eine reproduzierbare Kodierung. | muvera |
| Weist der Einbettungsraum eine geringe Unterscheidungskraft auf? | ANN-Kandidaten auf Token-Ebene sind verrauscht, und die zufällige Projektion bewahrt nicht genügend Signal. | lemur |
| Ist die Arbeitslast visuell oder multimodal? | Zeilen enthalten viele Patch-Vektoren, und TokenANN ist zu rechenintensiv. | lemur oder muvera |
| Ist die Dokumentenlänge stark schiefverteilt? | Einige Zeilen enthalten weitaus mehr Vektoren als andere. | Beginnen Sie mit „ muvera “; überprüfen Sie „ lemur “ sorgfältig. |
Vorgeschlagener Bewertungsablauf
Beginnen Sie mit „
tokenann“ als Qualitäts-Baseline, sofern die Größe des Datensatzes dies zulässt.Führen Sie dieselben Abfragen mit „
muvera“ durch und vergleichen Sie Recall, nDCG, Latenz und Indexgröße.Probieren Sie „
lemur“ aus, wenn die Einbettungsliste groß ist, der Einbettungsraum verrauscht ist oder es sich um visuelle oder multimodale Workloads handelt.Optimieren Sie „
retrieval_ann_ratio“, bevor Sie zu viele Parameter bei der Erstellung ändern. Erhöhen Sie den Wert, wenn der Recall niedrig ist; verringern Sie ihn, wenn die Latenz zu hoch ist.Führen Sie die Validierung stets anhand repräsentativer Abfragen und Dokumentlängenverteilungen durch. Eine Strategie, die bei kurzen Texten funktioniert, funktioniert möglicherweise nicht bei visuellen Dokumenten oder Long-Tail-Korpora.
### Qualität an erster Stelle: Beginnen Sie mit „ tokenann “. Verwenden Sie diesen Wert als Basis für die Approximationsqualität von MaxSim. | ### Ausgewogen Probieren Sie „ muvera “ aus, wenn Sie geringere Kosten benötigen, ohne eine zusätzliche Trainingspipeline einzurichten. | ### Komprimiert Probieren Sie „ lemur “ aus, wenn eine gelernte Komprimierung auf Zeilenebene voraussichtlich eine bessere Leistung als eine feste zufällige Projektion erbringt. |
|---|
Für diesen Entwurf verwendete Referenzen
Milvus-Tests zu „
emb_list_strategy“, „retrieval_ann_ratio“ und „emb_list_rerank“.Die Behandlung von Milvus-Konfigurationsdateien für serverseitige Index-Standardwerte im Abschnitt „
knowhere“.Knowhere-Parameterdefinitionen für Standardwerte und unterstützte Strategienamen.
Knowhere-Kompatibilitätsprüfungen für die ausschließliche Unterstützung von fp32-basierten MUVERA/LEMUR sowie von DiskANN und TokenANN.
Interne Evaluierungsnotizen zum Vergleich von TokenANN, MUVERA und LEMUR für die MaxSim-Kandidatenauswahl.
Hinweis zur Veröffentlichung: Überprüfen Sie vor der externen Veröffentlichung, welche Parameter in der Zielversion von Milvus offiziell unterstützt werden und ob das Produkt alle Low-Level-Knowhere-Parameter oder nur eine kleinere, dokumentierte Teilmenge offenlegen möchte.