Einfache Vektorsuche mit StructArray

Auf dieser Seite können Sie eine Vektorsuche in Vektor-Unterfeldern innerhalb eines StructArray-Feldes durchführen. StructArray unterstützt zwei grundlegende Vektorsuchmodi: die EmbeddingList-Suche, bei der eine in jeder Entität gespeicherte Einbettungsliste ausgewertet wird, und die Suche auf Elementebene, bei der jedes Struct-Element unabhängig durchsucht wird.

Diese Seite verwendet die Sammlung „ tech_articles “ aus dem Abschnitt „Erstellen eines StructArray-Feldes“. Die Sammlung enthält ein StructArray-Feld namens „ chunks “. Jeder Chunk enthält Text, skalare Metadaten, ein Vektor-Unterfeld namens „ emb_list_vector “ mit einem Index für die EmbeddingList-Suche sowie ein Vektor-Unterfeld namens „ emb “ mit einem Index für die Suche auf Elementebene.

Bevor Sie beginnen

Stellen Sie sicher, dass das Sammlungsschema, die Daten und die Indizes bereits vorbereitet sind.

VoraussetzungWo dies vorzubereiten ist
Erstellen Sie ein StructArray-Feld, z. B. „ chunks “.Erstellen eines StructArray-Feldes
Fügen Sie Entitäten ein, deren Feld „ chunks “ Struct-Objekte enthält.Daten in „StructArray“-Felder einfügen
Erstellen Sie einen „ MAX_SIM* “-Index auf „ chunks[emb_list_vector] “ für die Suche in „EmbeddingList“.StructArray-Felder indizieren
Erstellen Sie einen regulären vektormetrischen Index auf „ chunks[emb] “ für die Suche auf Elementebene.StructArray-Felder indizieren

Warnung

Ein Vektorfeld oder Vektor-Teilfeld akzeptiert nur einen Index. Wenn Sie sowohl die „EmbeddingList“-Suche als auch die Suche auf Elementebene benötigen, erstellen Sie zwei separate Vektor-Teilfelder. Auf dieser Seite wird „ chunks[emb_list_vector] “ für die „EmbeddingList“-Suche indiziert und „ chunks[emb] “ für die Suche auf Elementebene.

Wählen Sie einen Suchmodus

Aspekt„EmbeddingList“-SucheSuche auf Elementebene
Ziel-Unterfeldchunks[emb_list_vector]chunks[emb]
AbfragedatenEine Einbettungsliste, die einen oder mehrere Vektoren enthält.Ein regulärer Vektor.
MetrikfamilieMAX_SIM*, wie z. B. MAX_SIM_COSINE.Reguläre Vektormetriken, wie z. B. „ COSINE “, „ IP “ oder „ L2 “.
Was ein Treffer darstelltEine übereinstimmende Entität, deren StructArray-Vektor-Unterfeld der Einbettungsliste der Abfrage ähnelt.Ein übereinstimmendes Struct-Element innerhalb des StructArray-Feldes.
Granularität der ErgebnisseEntitäts-Ebene.Struct-Element-Ebene.
OffsetNicht zutreffend.Gibt die Position des gefundenen Struct-Elements (ab Null) bei der Rückgabe an.
Typische VerwendungColBERT, ColPali und andere Retrieval-Muster mit später Interaktion.Retrieval auf Chunk-, Passage-, Clip-, Patch- oder Faktenebene.

Verwenden Sie die „EmbeddingList“-Suche, wenn die Abfrage selbst mehrere Vektoren enthält und das Ziel-StructArray-Vektor-Unterfeld mit einer „ MAX_SIM* “-Metrik indiziert ist. Das Ergebnis ist eine Übereinstimmung auf Entitätsebene.

from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])

results = client.search(
    collection_name="tech_articles",
    data=[query],
    anns_field="chunks[emb_list_vector]",
    limit=3,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
    ],
)

for hits in results:
    for hit in hits:
        print(hit["id"], hit["distance"], hit["entity"])

In diesem Suchmodus steuert „ limit “, wie viele Entitäten für jede Abfrage zurückgegeben werden. Die Ausgabe kann StructArray-Unterfelder enthalten, aber der Treffer selbst repräsentiert die übereinstimmende übergeordnete Entität und nicht ein bestimmtes Struct-Element.

Eine vollständige Anleitung im Stil von ColBERT oder ColPali finden Sie unter „Suche mit Einbettungslisten“. Diese Seite behandelt lediglich das grundlegende Suchverhalten von StructArray.

Verwenden Sie die Suche auf Elementebene, wenn jedes Struct-Element unabhängig an der Vektorsuche teilnehmen soll. Die Abfrage ist ein regulärer Vektor, und das Zielvektor-Unterfeld muss mit einer regulären Vektormetrik indiziert sein.

query_vector = [0.19, 0.24, 0.30, 0.37]

results = client.search(
    collection_name="tech_articles",
    data=[query_vector],
    anns_field="chunks[emb]",
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "chunks[text]",
        "chunks[section]",
        "chunks[page]",
        "chunks[quality_score]",
    ],
)

for hits in results:
    for hit in hits:
        print(
            "doc_id:", hit["id"],
            "distance:", hit["distance"],
            "offset:", hit.get("offset"),
            "entity:", hit["entity"],
        )

Bei der Suche auf Elementebene repräsentiert jeder Treffer ein übereinstimmendes „Struct“-Element. Der Wert „ offset “ ist die nullbasierte Position dieses Elements im „StructArray“-Feld. Dieselbe Entität kann mehrmals vorkommen, wenn mehr als ein „Struct“-Element mit der Abfrage übereinstimmt. Der Wert „ limit “ bezieht sich auf Elementtreffer, nicht auf eindeutige übergeordnete Entitäten.

Ergebnisse interpretieren

Ergebniselement„EmbeddingList“-SucheSuche auf Elementebene
idPrimärschlüssel der übereinstimmenden Entität.Primärschlüssel der Entität, die das übereinstimmende Struct-Element enthält.
distance oder WertScore oder Abstand zwischen der Abfrage-Einbettungsliste und der gespeicherten Einbettungsliste.Score oder Abstand zwischen dem Abfragevektor und dem Vektor des übereinstimmenden Struct-Elements.
offsetNicht zutreffend.Nullbasierte Position des übereinstimmenden Struct-Elements bei der Rückgabe.
Wiederholte PrimärschlüsselBei einer einzelnen Abfrage nicht zu erwarten, da die Ergebnisse auf Entitätsebene vorliegen.Möglich, da mehrere Struct-Elemente in derselben Entität übereinstimmen können.
Angeforderte StructArray-AusgabefelderWerden von der übereinstimmenden Entität zurückgegeben.Werden mit der von der Ziel-API und dem SDK unterstützten Trefferform auf Elementebene zurückgegeben.

Häufige Fehler

  • Verwendung von „ chunks.emb “ anstelle der erforderlichen Syntax für den Unterfeldpfad „ chunks[emb] “.

  • Verwendung einer „EmbeddingList“-Abfrage für ein Vektor-Unterfeld, das mit einer regulären Vektormetrik indiziert ist.

  • Verwendung einer regulären Vektorabfrage für ein Vektor-Unterfeld, das mit einer „ MAX_SIM* “-Metrik indiziert ist.

  • Die Erwartung, dass die Suche auf Elementebene mit „ limit “ ebenso viele eindeutige übergeordnete Entitäten zurückgibt. Es werden Elementtreffer zurückgegeben.

  • Die Erwartung, dass die „EmbeddingList“-Suche einen bestimmten Element-Offset zurückgibt. Es werden Übereinstimmungen auf Entitätsebene zurückgegeben.

  • Wiederverwendung eines Vektor-Teilfelds für beide Suchmodi. Verwenden Sie separate Vektor-Teilfelder, da jedes Vektor-Teilfeld nur einen Index akzeptiert.

Nächste Schritte

  1. Um die Suche auf Elementebene durch skalare Bedingungen einzuschränken, lesen Sie „Gefilterte Suche mit StructArray“.

  2. Informationen zur Suche anhand von Score- oder Abstandsgrenzen finden Sie unter „Bereichssuche mit StructArray“.

  3. Um nach einer Suche auf Elementebene höchstens ein Ergebnis pro übergeordneter Entität zurückzugeben, lesen Sie „Gruppierte Suche mit StructArray“.

  4. Um die StructArray-Suche mit anderen Vektorsuchen zu kombinieren, lesen Sie „Hybride Suche mit StructArray“.

  5. Informationen zu unterstützten Datentypen, Metriken, Filtern und versionsspezifischen Beschränkungen finden Sie unter „StructArray-Beschränkungen“.

Übersetzt vonDeepL

Verwaltetes Milvus kostenlos testen

Zilliz Cloud ist unkompliziert, basiert auf Milvus und ist 10-mal schneller.

Loslegen
Feedback

War diese Seite hilfreich?