Erstellen einer Vektorabfrage in Azure KI Search

Wenn Sie in Azure KI Search Vektorfelder zu einem Suchindex hinzugefügt haben, wird in diesem Artikel Folgendes erläutert:

In diesem Artikel wird REST zur Veranschaulichung verwendet. Codebeispiele in anderen Sprachen finden Sie im GitHub-Repository für Azure-Search-Vektorbeispiele für End-to-End-Lösungen, die Vektorabfragen enthalten.

Voraussetzungen

Tipp

Um schnell zu ermitteln, ob Ihr Index Vektoren hat, suchen Sie nach Feldern vom Typ Collection(Edm.Single), mit einem dimensions Attribut und einer vectorSearchProfile-Zuordnung.

Konvertieren einer Abfragezeichenfolgeneingabe in einen Vektor

Um ein Vektorfeld abzufragen, muss die Abfrage selbst ein Vektor sein. Ein Ansatz zum Konvertieren der Textabfragezeichenfolge eines Benutzers in seine Vektordarstellung besteht darin, eine Einbettungsbibliothek oder API in Ihrem Anwendungscode aufzurufen. Verwenden Sie als bewährte Methode immer dieselben Einbettungsmodelle, die zum Generieren von Einbettungen in die Quelldokumenteverwendet werden.

Sie finden Codebeispiele, die zeigen wie Einbettungen im Repository azure-search-vector-samples generiert werden.

Hier sehen Sie ein REST-API-Beispiel für einen Abfrage-String, der an eine Bereitstellung eines Azure OpenAI-Einbettungsmodells übermittelt wird:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Die erwartete Antwort ist 202 für einen erfolgreichen Aufruf des bereitgestellten Modells. Das Feld „Einbetten“ im Textkörper der Antwort ist die Vektordarstellung der Abfragezeichenfolge „input“. Zu Testzwecken würden Sie den Wert des Arrays „embedding“ in „vectorQueries.vector“ in einer Abfrage kopieren, wobei Sie die in den nächsten Abschnitten beschriebene Syntax verwenden.

Die eigentliche Antwort für diesen POST-Aufruf an das eingesetzte Modell enthält 1536 Einbettungen, die hier aus Gründen der Lesbarkeit auf die ersten paar Vektoren reduziert wurden.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

Bei diesem Ansatz ist Ihr Anwendungscode für die Verbindung mit einem Modell, das Generieren von Einbettungen und die Behandlung der Antwort verantwortlich.

Tipp

Testen Sie Abfrage mit integrierter Vektorisierung, die sich derzeit in der öffentlichen Vorschau befindet, damit Azure AI Search Ihre Abfragevektorisierungseingaben und -ausgaben verarbeitet.

Vektorabfrageanforderung

In diesem Abschnitt wird die grundlegende Struktur einer Vektorabfrage veranschaulicht. Sie können das Azure-Portal, REST-APIs oder die Azure-SDKs verwenden, um eine Vektorabfrage zu formulieren. Wenn Sie von 2023-07-01-Previewmigrieren, gibt es unterbrechungsfreie Änderungen. Details finden Sie unter Upgrade auf die neueste REST-API .

2023-11-01 ist die stabile REST-API-Version für Search POST. Diese Version unterstützt:

  • vectorQueries ist das Konstrukt für die Vektorsuche.
  • kind festgelegt, um vector festzulegen, dass es sich bei der Abfrage um ein Vektorarray handelt.
  • vector ist eine Abfrage (eine Vektordarstellung von Text oder ein Bild).
  • exhaustive (optional) ruft erschöpfende KNN zur Abfragezeit auf, auch wenn das Feld für HNSW indiziert ist.

Im folgenden Beispiel ist der Vektor eine Darstellung dieser Zeichenfolge: „Welche Azure-Dienste unterstützen die Volltextsuche“. Die Abfrage zielt auf das contentVector-Feld ab. Die Abfrage gibt Ergebnisse zurück k. Der tatsächliche Vektor verfügt über 1536 Einbettungen, sodass er in diesem Beispiel zur Lesbarkeit gekürzt wird.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Vektorabfrageantwort

In Azure AI Search bestehen Abfrageantworten standardmäßig aus allen retrievable Feldern. Es ist jedoch üblich, Suchergebnisse auf eine Teilmenge von retrievable Feldern zu beschränken, indem sie sie in einer select Anweisung auflisten.

Berücksichtigen Sie in einer Vektorabfrage sorgfältig, ob Sie Felder in einer Antwort vektorieren müssen. Vektorfelder sind nicht lesbar. Wenn Sie also eine Antwort auf eine Webseite pushen, sollten Sie nicht Vektorfelder auswählen, die für das Ergebnis repräsentativ sind. Wenn die Abfrage beispielsweise ausgeführt wird, können Sie stattdessen contentVectorzurückgeben content .

Wenn Sie Vektorfelder im Ergebnis verwenden möchten, finden Sie hier ein Beispiel für die Antwortstruktur. contentVector ist ein Zeichenfolgenarray von Einbettungen, die hier aus Platzgründen gekürzt werden. Die Suchbewertung gibt die Relevanz an. Andere Nichtvectorfelder sind für den Kontext enthalten.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Die wichtigsten Punkte:

  • k bestimmt, wie viele Ergebnisse der nächsten Nachbarn zurückgegeben werden, in diesem Fall drei. Vektorabfragen liefern immer k-Ergebnisse, vorausgesetzt, dass zumindest k Dokumente vorhanden sind, selbst wenn die Dokumente sich nur wenig ähneln, da der Algorithmus nur die k Pixelwiederholungen für den abgefragten Vektor ermittelt.

  • Dies @search.score wird durch den Vektorsuchalgorithmusbestimmt.

  • Felder in Suchergebnissen sind entweder alle retrievable Felder oder Felder in einer select Klausel. Bei der Ausführung von Vektorabfragen erfolgt die Übereinstimmung allein für Vektordaten. Eine Antwort kann jedoch ein beliebiges retrievable Feld in einem Index enthalten. Da es keine Möglichkeit zum Decodieren eines Vektorfeldergebnisses gibt, ist die Einbeziehung von Nichtvektortextfeldern für ihre lesbaren Werte hilfreich.

Vektorabfrage mit Filter

Eine Abfrageanforderung kann eine Vektorabfrage und einen Filterausdruck enthalten. Filter gelten für filterable Text- und numerische Felder und sind nützlich, um Suchdokumente basierend auf Filterkriterien ein- oder auszuschließen. Obwohl ein Vektorfeld nicht selbst gefiltert werden kann, kann eine Abfrage Filter für andere Felder im selben Index angeben.

In neueren API-Versionen können Sie einen Filtermodus festlegen, um Filter vor oder nach der Vektorabfrageausführung anzuwenden. Einen Vergleich der einzelnen Modus und der erwarteten Leistung basierend auf der Indexgröße finden Sie unter Filter in Vektorabfragen.

Tipp

Wenn Sie keine Quellfelder mit Text oder numerischen Werten haben, suchen Sie nach Dokumentmetadaten, z. B. „LastModified“ oder „CreatedBy“, die in einem Metadatenfilter nützlich sein könnten.

2023-11-01 ist die stabile Version für diese API. Es bietet Folgendes:

  • vectorFilterMode für prefilter (Standard) oder postfilter Filterungsdmethoden.
  • filter stellt die Kriterien bereit.

Im folgenden Beispiel ist der Vektor eine Darstellung dieser Abfragezeichenfolge: „Welche Azure-Dienste unterstützen die Volltextsuche“. Die Abfrage zielt auf das contentVector-Feld ab. Der tatsächliche Vektor verfügt über 1536 Einbettungen, sodass er in diesem Beispiel zur Lesbarkeit gekürzt wird.

Die Filterkriterien werden auf ein filterbares Textfeld (category in diesem Beispiel) angewendet, bevor die Vektorabfrage von der Suchmaschine ausgeführt wird.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Mehrere Vektorfelder

Sie können die Eigenschaft „vectorQueries.fields“ auf mehrere Vektorfelder festlegen. Die Vektorabfrage wird für jedes Vektorfeld ausgeführt, das Sie in der fields Liste angeben. Stellen Sie beim Abfragen mehrerer Vektorfelder sicher, dass jedes Element Einbettungen aus demselben Einbettungsmodell enthält und dass die Abfrage auch aus dem gleichen Einbettungsmodell generiert wird.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Mehrere Vektorabfragen

Die Vektorsuche mit mehreren Abfragen sendet mehrere Abfragen über mehrere Vektorfelder in Ihrem Suchindex. Ein gängiges Beispiel für diese Abfrageanforderung ist die Verwendung von Modellen wie CLIP für eine mehr modale Vektorsuche, bei der dasselbe Modell Bild- und Nicht-Bildinhalte vektorisieren kann.

Das folgende Abfragebeispiel sucht nach Ähnlichkeiten in myImageVector und myTextVector, sendet jedoch jeweils zwei unterschiedliche Abfrageeinbettungen, die jeweils parallel ausgeführt werden. Diese Abfrage erzeugt ein Ergebnis, das mithilfe der reziproziierten Rangfusion (RRF) bewertet wird.

  • vectorQueries stellt ein Array von Vektorabfragen bereit.
  • vector enthält die Bildvektoren und Textvektoren im Suchindex. Jede Instanz ist eine separate Abfrage.
  • fields gibt an, welches Vektorfeld als Ziel verwendet werden soll.
  • k ist die Anzahl der Übereinstimmungen an Pixelwiederholungen, die in Ergebnisse eingeschlossen werden sollen.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Suchergebnisse enthalten eine Kombination aus Text und Bildern, vorausgesetzt, Ihr Suchindex enthält ein Feld für die Bilddatei (ein Suchindex speichert keine Bilder).

Abfrage mit integrierter Vektorisierung (Vorschau)

Dieser Abschnitt zeigt eine Vektorabfrage, die das neue integrierte Vektorisierungsvorschaufeature aufruft, das eine Textabfrage in einen Vektor konvertiert. Verwenden Sie die 2023-10-01-Preview REST-API oder ein aktualisiertes Beta-Azure SDK-Paket.

Eine Voraussetzung ist ein Suchindex, in dem eine Vektorisierung konfiguriert und einem Vektorfeld zugewiesen wurde. Die Vektorisierung stellt Verbindungsinformationen zu einem einbettenden Modell bereit, das zur Abfragezeit verwendet wird.

Abfragen stellen Textzeichenfolgen anstelle von Vektoren bereit:

  • text muss auf kind festgelegt werden.
  • text muss eine Textzeichenfolge aufweisen. Sie wird an die Vektorisierung übergeben, die dem Vektorfeld zugewiesen ist.
  • fields ist das zu durchsuchende Vektorfeld.

Hier ist ein einfaches Beispiel für eine Abfrage, die zur Abfragezeit vektorisiert wird. Die Textzeichenfolge wird vektorisiert und dann zum Abfragen des descriptionVector-Felds verwendet.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Hier ist eine Hybridabfrage mit integrierter Vektorisierung von Textabfragen. Diese Abfrage umfasst mehrere Abfragevektorfelder, mehrere Nichtvektorfelder, einen Filter und eine semantische Rangfolge. Auch hier sind die Unterschiede die kind Vektorabfrage und die text-Zeichenfolge anstelle vector.

In diesem Beispiel macht die Suchmaschine drei Vektorisierungsaufrufe an die Vektorisierer, die descriptionVector, synopsisVector und authorBioVector im Index zugewiesen sind. Die resultierenden Vektoren werden verwendet, um Dokumente für ihre jeweiligen Felder abzurufen. Die Suchmaschine führt auch eine Stichwortsuche in der search Abfrage aus, "Mystery Novel set in London".

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

Die bewerteten Ergebnisse aus allen vier Abfragen werden mit der RRF-Rangfolge verknüpft. Sekundäre semantische Rangfolge wird über die fusioniertenSuchergebnisse aufgerufen, aber nur für die searchFields, um Ergebnisse zu erhöhen, die semantisch an "search":"mystery novel set in London" ausgerichtet sind.

Hinweis

Vektorisierungen werden während der Indizierung und Abfrage verwendet. Wenn Sie keine Datenblöcke und Vektorisierung im Index benötigen, können Sie Schritte wie das Erstellen eines Indexers, eines Skillsets und einer Datenquelle überspringen. In diesem Szenario wird die Vektorisierung nur zur Abfragezeit verwendet, um eine Textzeichenfolge in eine Einbettung zu konvertieren.

Anzahl der bewerteten Ergebnisse in einer Vektorabfrageantwort

Eine Vektorabfrage gibt den k-Parameter an, der festlegt, wie viele Übereinstimmungen in den Ergebnissen zurückgegeben werden. Die Suchmaschine gibt immer k Übereinstimmungen zurück. Wenn k die Anzahl der Dokumente im Index größer ist, bestimmt die Anzahl der Dokumente die Obergrenze, die zurückgegeben werden kann.

Wenn Sie mit der Volltextsuche vertraut sind, wissen Sie, dass Sie null Ergebnisse erwarten, wenn der Index keinen Ausdruck oder Ausdruck enthält. Bei der Vektorsuche identifiziert die Suche jedoch die Pixelwiederholungen. Sie gibt immer k Ergebnisse zurück, auch wenn die Pixelwiederholungen sich nicht stark ähneln. Es ist also möglich, Ergebnisse für unsinnige oder themenfremde Abfragen abzurufen, insbesondere, wenn Sie keine Eingabeaufforderungen zum Festlegen von Begrenzungen verwenden. Weniger relevante Ergebnisse haben eine schlechtere Ähnlichkeitsbewertung, aber sie sind immer noch die „nächstgelegenen“ Vektoren, wenn nichts näher ist. Daher kann eine Antwort ohne aussagekräftige Ergebnisse weiterhin Ergebnisse zurückgeben k, aber die Ähnlichkeitsbewertung jedes Ergebnisses wäre niedrig.

Ein hybrider Ansatz, der die Volltextsuche enthält, kann dieses Problem mindern. Eine weitere Entschärfung besteht darin, einen Mindestschwellenwert für den Score der Suche festzulegen, jedoch nur, wenn die Abfrage eine reine Einzelvektorabfrage ist. Hybride Abfragen sind nicht für Mindestschwellenwerte geeignet, da die RRF-Bereiche viel kleiner und volatiler sind.

Abfrageparameter, die die Ergebnisanzahl beeinflussen, sind unter anderem:

  • "k": n-Ergebnisse für Nur-Vektorabfragen
  • "top": n Ergebnisse für Hybridabfragen, die einen Parameter „search“ enthalten

Sowohl „k“ als auch „top“ sind optional. Nicht angegeben, die Standardanzahl der Ergebnisse in einer Antwort ist 50. Sie können „top“ und „skip“ festlegen, um weitere Ergebnisse zu durchlaufen oder den Standardwert zu ändern.

Bewertungsalgorithmen, die in einer Vektorabfrage verwendet werden

Die Rangfolge der Ergebnisse wird durch eine der folgenden Methoden berechnet:

  • Ähnlichkeitsmetrik
  • Reziprozimale Rangfusion (RRF), wenn mehrere Sätze von Suchergebnissen vorhanden sind.

Ähnlichkeitsmetrik

Die im Indexabschnitt vectorSearch für eine Vektorabfrage angegebene Ähnlichkeitsmetrik. Gültige Werte sind cosine, euclidean und dotProduct.

Azure OpenAI-Einbettungsmodelle verwenden kosinusgleichheit, wenn Sie also Azure OpenKI-Einbettungsmodelle verwenden, ist cosine die empfohlene Metrik. Weitere unterstützte Bewertungsmetriken sind euclidean und dotProduct.

Verwenden von RRF

Mehrere Sets werden erstellt, wenn die Abfrage auf mehrere Vektorfelder abzielt, mehrere Vektorabfragen parallel ausgeführt werden oder wenn die Abfrage eine Mischung aus Vektor- und Volltextsuche ist, mit oder ohne semantisches Ranking.

Während der Abfrageausführung kann eine Vektorabfrage nur auf einen internen Vektorindex abzielen. Für mehrere Vektorfelder und mehrere Vektorabfragengeneriert die Suchmaschine also mehrere Abfragen, die auf die jeweiligen Vektorindizes jedes Felds abzielen. Die Ausgabe ist eine Reihe von bewerteten Ergebnissen für jede Abfrage, die mit RRF fusioniert werden. Weitere Informationen finden Sie unter Relevanzbewertung mithilfe der reziprozien Rangfusion (RRF).

Nächste Schritte

Überprüfen Sie als nächsten Schritt Vektorabfragecodebeispiele in Python, C# oder JavaScript.