milvus-logo
LFAI
Home
  • Benutzerhandbuch

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 von hybrid_search zurückgegeben werden. Bei einer hybriden Suche werden die endgültigen Ergebnisse durch die Kombination und das Reranking der Ergebnisse aus mehreren ANNSearchRequest 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, kann WeightedRanker(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 erstellten AnnSearchRequest Instanzen entsprechen.
  • Verwenden Sie Reciprocal Rank Fusion (RFF)

    # Alternatively, use RRFRanker for reciprocal rank fusion reranking
    from pymilvus import RRFRanker
    
    rerank = RRFRanker()
    

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) und RRFRanker().

    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.

Übersetzt vonDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?