Hybride Suche
Seit Milvus 2.4 haben wir die Unterstützung für mehrere Vektoren und eine hybride Suche eingeführt, was bedeutet, dass Benutzer mehrere Vektorfelder (bis zu 10) in eine einzige Sammlung einbringen können. Diese Vektoren in verschiedenen Spalten repräsentieren unterschiedliche Facetten von Daten, die aus verschiedenen Einbettungsmodellen stammen oder verschiedenen Verarbeitungsmethoden unterzogen wurden. Die Ergebnisse der hybriden Suchvorgänge werden mit Hilfe von Reranking-Strategien wie Reciprocal Rank Fusion (RRF) und Weighted Scoring integriert. Mehr über Reranking-Strategien erfahren Sie unter Reranking.
Diese Funktion ist besonders nützlich in umfassenden Suchszenarien, z. B. bei der Identifizierung der ähnlichsten Person in einer Vektorbibliothek auf der Grundlage verschiedener Attribute wie Bilder, Stimme, Fingerabdrücke usw.
In diesem Tutorial werden Sie lernen, wie man:
Mehrere
AnnSearchRequest
Instanzen für Ähnlichkeitssuchen auf verschiedenen Vektorfeldern erstellen;eine Reranking-Strategie zu konfigurieren, um Suchergebnisse aus mehreren
AnnSearchRequest
Instanzen zu kombinieren und zu ranken;Verwenden Sie die
hybrid_search()
Methode, um eine hybride Suche durchzuführen.
Die Codeschnipsel auf dieser Seite verwenden das PyMilvus ORM-Modul zur Interaktion mit Milvus. Codeschnipsel mit dem neuen MilvusClient SDK werden bald verfügbar sein.
Vorbereitungen
Bevor Sie eine hybride Suche starten, stellen Sie sicher, dass Sie eine Sammlung mit mehreren Vektorfeldern haben. Derzeit sieht Milvus eine Voreinstellung von vier Vektorfeldern pro Sammlung vor, die durch Änderung der proxy.maxVectorFieldNum-Konfiguration auf maximal zehn erweitert werden kann.
Nachfolgend ein Beispiel für die Erstellung einer Sammlung mit dem Namen test_collection
mit zwei Vektorfeldern, filmVector
und posterVector
, und das Einfügen von zufälligen Entitäten in diese Sammlung.
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import random
# Connect to Milvus
connections.connect(
host="127.0.0.1", # Replace with your Milvus server IP
port="19530"
)
# Create schema
fields = [
FieldSchema(name="film_id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="filmVector", dtype=DataType.FLOAT_VECTOR, dim=5), # Vector field for film vectors
FieldSchema(name="posterVector", dtype=DataType.FLOAT_VECTOR, dim=5)] # Vector field for poster vectors
schema = CollectionSchema(fields=fields,enable_dynamic_field=False)
# Create collection
collection = Collection(name="test_collection", schema=schema)
# Create index for each vector field
index_params = {
"metric_type": "L2",
"index_type": "IVF_FLAT",
"params": {"nlist": 128},
}
collection.create_index("filmVector", index_params)
collection.create_index("posterVector", index_params)
# Generate random entities to insert
entities = []
for _ in range(1000):
# generate random values for each field in the schema
film_id = random.randint(1, 1000)
film_vector = [ random.random() for _ in range(5) ]
poster_vector = [ random.random() for _ in range(5) ]
# create a dictionary for each entity
entity = {
"film_id": film_id,
"filmVector": film_vector,
"posterVector": poster_vector
}
# add the entity to the list
entities.append(entity)
collection.insert(entities)
Schritt 1: Erstellen mehrerer AnnSearchRequest-Instanzen
Eine hybride Suche verwendet die hybrid_search()
API, um mehrere ANN-Suchanfragen in einem einzigen Aufruf durchzuführen. Jede AnnSearchRequest
repräsentiert eine einzelne Suchanfrage für ein bestimmtes Vektorfeld.
Das folgende Beispiel erstellt zwei AnnSearchRequest
Instanzen, um individuelle Ähnlichkeitssuchen für zwei Vektorfelder durchzuführen.
from pymilvus import AnnSearchRequest
# Create ANN search request 1 for filmVector
query_filmVector = [[0.8896863042430693, 0.370613100114602, 0.23779315077113428, 0.38227915951132996, 0.5997064603128835]]
search_param_1 = {
"data": query_filmVector, # Query vector
"anns_field": "filmVector", # Vector field name
"param": {
"metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
"params": {"nprobe": 10}
},
"limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_1 = AnnSearchRequest(**search_param_1)
# Create ANN search request 2 for posterVector
query_posterVector = [[0.02550758562349764, 0.006085637357292062, 0.5325251250159071, 0.7676432650114147, 0.5521074424751443]]
search_param_2 = {
"data": query_posterVector, # Query vector
"anns_field": "posterVector", # Vector field name
"param": {
"metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
"params": {"nprobe": 10}
},
"limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_2 = AnnSearchRequest(**search_param_2)
# Store these two requests as a list in `reqs`
reqs = [request_1, request_2]
Parameter:
AnnSearchRequest
(Objekt)Eine Klasse, die eine ANN-Suchanfrage darstellt. Jede hybride Suche kann jeweils 1 bis 1.024
ANNSearchRequest
Objekte enthalten.data
(Liste)Der Abfragevektor, der in einem einzelnen
AnnSearchRequest
gesucht werden soll. Derzeit akzeptiert dieser Parameter eine Liste, die nur einen einzigen Abfragevektor enthält, z. B.[[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]
. In Zukunft wird dieser Parameter erweitert, um mehrere Abfragevektoren zu akzeptieren.anns_field
(Zeichenkette)Der Name des Vektorfeldes, das in einem einzelnen
AnnSearchRequest
verwendet werden soll.param
(dict)Ein Wörterbuch mit Suchparametern für eine einzelne
AnnSearchRequest
. Diese Suchparameter sind identisch mit denen für eine Einzelvektorsuche. Weitere Informationen finden Sie unter Suchparameter.limit
(int)Die maximale Anzahl der Suchergebnisse, die in eine einzelne
ANNSearchRequest
aufgenommen werden sollen.Dieser Parameter wirkt sich nur auf die Anzahl der Suchergebnisse aus, die innerhalb eines einzelnen
ANNSearchRequest
zurückgegeben werden, und entscheidet nicht über die endgültigen Ergebnisse, die bei einem Aufruf vonhybrid_search
zurückgegeben werden. Bei einer hybriden Suche werden die endgültigen Ergebnisse durch die Kombination und das Reranking der Ergebnisse aus mehrerenANNSearchRequest
Instanzen bestimmt.
Schritt 2: Konfigurieren Sie eine Reranking-Strategie
Nachdem Sie AnnSearchRequest
Instanzen erstellt haben, konfigurieren Sie eine Reranking-Strategie, um die Ergebnisse zu kombinieren und neu zu ordnen. Derzeit gibt es zwei Optionen: WeightedRanker
und RRFRanker
. Weitere Informationen zu Ranking-Strategien finden Sie unter Reranking.
Gewichtetes Scoring verwenden
Die
WeightedRanker
wird verwendet, um den Ergebnissen aus jeder Vektorfeldsuche mit bestimmten Gewichten eine Bedeutung zuzuweisen. Wenn Sie einige Vektorfelder gegenüber anderen bevorzugen, kannWeightedRanker(value1, value2, ..., valueN)
dies in den kombinierten Suchergebnissen widerspiegeln.from pymilvus import WeightedRanker # Use WeightedRanker to combine results with specified weights # Assign weights of 0.8 to text search and 0.2 to image search rerank = WeightedRanker(0.8, 0.2)
Wenn Sie
WeightedRanker
verwenden, beachten Sie Folgendes:- Jeder Gewichtungswert reicht von 0 (am wenigsten wichtig) bis 1 (am wichtigsten) und beeinflusst die endgültige aggregierte Punktzahl.
- Die Gesamtzahl der in
WeightedRanker
angegebenen Gewichtungswerte sollte der Anzahl der von Ihnen erstelltenAnnSearchRequest
Instanzen entsprechen.
Verwenden Sie Reciprocal Rank Fusion (RFF)
# Alternatively, use RRFRanker for reciprocal rank fusion reranking from pymilvus import RRFRanker rerank = RRFRanker()
Schritt 3: Führen Sie eine hybride Suche durch
Mit den AnnSearchRequest
Instanzen und der eingestellten Rangordnungsstrategie verwenden Sie die hybrid_search()
Methode, um die hybride Suche durchzuführen.
# Before conducting hybrid search, load the collection into memory.
collection.load()
res = collection.hybrid_search(
reqs, # List of AnnSearchRequests created in step 1
rerank, # Reranking strategy specified in step 2
limit=2 # Number of final search results to return
)
print(res)
Parameter:
reqs
(Liste)Eine Liste von Suchanfragen, wobei jede Anfrage ein
ANNSearchRequest
Objekt ist. Jede Anfrage kann einem anderen Vektorfeld und einem anderen Satz von Suchparametern entsprechen.rerank
(Objekt)Die für die hybride Suche zu verwendende Rangfolgestrategie. Mögliche Werte:
WeightedRanker(value1, value2, ..., valueN)
undRRFRanker()
.Weitere Informationen zu Ranking-Strategien finden Sie unter Reranking.
limit
(int)Die maximale Anzahl der Endergebnisse, die bei der hybriden Suche zurückgegeben werden sollen.
Die Ausgabe ist ähnlich wie die folgende:
["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]
Limits
Normalerweise sind in jeder Sammlung standardmäßig bis zu 4 Vektorfelder erlaubt. Sie haben jedoch die Möglichkeit, die Konfiguration von
proxy.maxVectorFieldNum
so anzupassen, dass die maximale Anzahl von Vektorfeldern in einer Sammlung auf maximal 10 Vektorfelder pro Sammlung erweitert wird. Siehe Proxy-bezogene Konfigurationen für weitere Informationen.Unvollständig indizierte oder geladene Vektorfelder in einer Sammlung führen zu einem Fehler.
Derzeit kann jede
AnnSearchRequest
in einer hybriden Suche nur einen Abfragevektor enthalten.
FAQ
In welchem Szenario ist die hybride Suche zu empfehlen?
Die hybride Suche ist ideal für komplexe Situationen, die eine hohe Genauigkeit erfordern, insbesondere wenn eine Entität durch mehrere, unterschiedliche Vektoren dargestellt werden kann. Dies gilt für Fälle, in denen dieselben Daten, wie z. B. ein Satz, durch verschiedene Einbettungsmodelle verarbeitet werden oder wenn multimodale Informationen (wie Bilder, Fingerabdrücke und Stimmabdrücke einer Person) in verschiedene Vektorformate umgewandelt werden. Durch die Zuweisung von Gewichtungen für diese Vektoren kann ihr kombinierter Einfluss die Wiederauffindbarkeit erheblich steigern und die Effizienz der Suchergebnisse verbessern.
Wie normalisiert ein gewichteter Ranker die Abstände zwischen verschiedenen Vektorfeldern?
Ein gewichteter Ranker normalisiert die Abstände zwischen Vektorfeldern anhand der jedem Feld zugewiesenen Gewichte. Er berechnet die Wichtigkeit jedes Vektorfeldes entsprechend seiner Gewichtung und gibt den Feldern mit höherer Gewichtung den Vorrang. Es ist ratsam, für alle ANN-Suchanfragen denselben metrischen Typ zu verwenden, um Konsistenz zu gewährleisten. Diese Methode stellt sicher, dass Vektoren, die als wichtiger eingestuft werden, einen größeren Einfluss auf das Gesamtranking haben.
Ist es möglich, alternative Ranker wie Cohere Ranker oder BGE Ranker zu verwenden?
Derzeit werden nur die angebotenen Ranker unterstützt. Für künftige Updates ist die Aufnahme weiterer Ranker geplant.
Ist es möglich, mehrere hybride Suchvorgänge gleichzeitig auszuführen?
Ja, die gleichzeitige Ausführung von mehreren hybriden Suchoperationen wird unterstützt.
Kann ich das gleiche Vektorfeld in mehreren AnnSearchRequest-Objekten verwenden, um hybride Suchvorgänge durchzuführen?
Technisch ist es möglich, dasselbe Vektorfeld in mehreren AnnSearchRequest-Objekten für hybride Suchvorgänge zu verwenden. Es ist nicht notwendig, mehrere Vektorfelder für eine hybride Suche zu verwenden.