Freigeben über


Erstellen einer Vektorabfrage in Azure KI Search

Wenn Sie in der Azure KI-Suche einen Vektorindex haben, wird in diesem Artikel Folgendes erläutert:

In diesem Artikel wird REST zur Veranschaulichung verwendet. Nachdem Sie den grundlegenden Workflow verstanden haben, fahren Sie mit den Azure SDK-Codebeispielen im Repository azure-search-vector-samples fort, das End-to-End-Lösungen bereitstellt, die Vektorabfragen enthalten.

Sie können auch den Suchexplorer im Azure-Portal verwenden.

Voraussetzungen

Konvertieren einer Abfragezeichenfolgeneingabe in einen Vektor

Um ein Vektorfeld abfragen zu können, muss die Abfrage selbst ein Vektor sein.

Ein Ansatz zum Konvertieren der Textabfragezeichenfolge eines Benutzers oder einer Benutzerin in seine Vektordarstellung besteht darin, eine Einbettungsbibliothek oder API in Ihrem Anwendungscode aufzurufen. Als bewährte Methode sollten Sie immer dieselben Einbettungsmodelle zum Generieren von Einbettungen in die Quelldokumente verwenden. Sie finden Codebeispiele, die zeigen, wie Einbettungen im Repository für Azure-search-Vektorbeispiele generiert werden.

Ein zweiter Ansatz besteht darin, integrierte Vektorisierung zu verwenden, die jetzt allgemein verfügbar ist, damit Azure AI Search Ihre Abfragevektorisierungseingaben und -ausgaben verarbeitet.

Hier sehen Sie ein REST-API-Beispiel für eine Abfragezeichenfolge, die 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 lautet 202 für einen erfolgreichen Aufruf des bereitgestellten Modells.

Das embedding Feld im Textkörper der Antwort ist die Vektordarstellung der Abfragezeichenfolge input. Zu Testzwecken würden Sie den Wert des embedding Arrays vectorQueries.vector in eine Abfrageanforderung kopieren und dabei die syntax verwenden, die in den nächsten Abschnitten gezeigt wird.

Die tatsächliche Antwort auf diesen POST-Aufruf an das bereitgestellte Modell umfasst 1.536 Einbettungen. Aus Gründen der Lesbarkeit zeigt dieses Beispiel nur die ersten Vektoren an.

{
    "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 das Herstellen einer Verbindung mit einem Modell, für das Generieren von Einbettungen und die Behandlung der Antwort verantwortlich.

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-Preview migrieren, gibt es wesentliche Änderungen. Weitere Informationen finden Sie unter Upgrade auf die neueste REST-API.

2024-07-01 ist die stabile REST-API-Version von Search POST. Diese Version unterstützt:

  • vectorQueries ist das Konstrukt für die Vektorsuche.
  • vectorQueries.kind auf vector setzen, wenn die Eingabe ein Vektorarray ist, oder auf text, wenn die Eingabe eine Zeichenfolge ist und Sie über einen Vektorizer verfügen.
  • vectorQueries.vector ist die Abfrage (eine Vektordarstellung von Text oder bild).
  • vectorQueries.exhaustive (optional) ruft umfassende KNN zur Abfragezeit auf, auch wenn das Feld für HNSW indiziert ist.
  • vectorQueries.fields (optional) zielt auf bestimmte Felder für die Abfrageausführung ab (bis zu 10 pro Abfrage).
  • vectorQueries.weight (optional) gibt die relative Gewichtung der einzelnen Vektorabfragen an, die in Suchvorgängen enthalten sind. Weitere Informationen finden Sie unter Vector Weighting.
  • vectorQueries.k ist die Anzahl der zurückzugebenden Übereinstimmungen.

Im folgenden Beispiel ist der Vektor eine Darstellung dieser Zeichenfolge: "what Azure services support full text search". Die Abfrage zielt auf das contentVector Feld ab und gibt Ergebnisse zurück k . Der tatsächliche Vektor verfügt über 1.536 Einbettungen, die in diesem Beispiel zur Lesbarkeit gekürzt werden.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-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",
            "weight": 0.5,
            "k": 5
        }
    ]
}

Antwort der Vektorabfrage

In Azure KI-Suche 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.

Bei einer Vektorabfrage sollten Sie sorgfältig prüfen, ob Sie Vektorfelder in einer Antwort benötigen. Vektorfelder sind nicht lesbar. Wenn Sie also eine Antwort auf eine Webseite pushen, sollten Sie nicht Vektorfelder auswählen, die das Ergebnis darstellen. Wenn die Abfrage beispielsweise für contentVector ausgeführt wird, können Sie stattdessen content zurückgeben.

Wenn Sie Vektorfelder im Ergebnis verwenden möchten, sehen Sie hier ein Beispiel für die Antwortstruktur. contentVector ist ein Array von Zeichenfolgen mit Einbettungen, die in diesem Beispiel zur Lesbarkeit gekürzt werden. Die Suchbewertung gibt die Relevanz an. Andere Nichtvektorfelder werden aus Kontextgründen einbezogen.

{
    "@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 für die Pixelwiederholung zurückgegeben werden, in diesem Fall drei. Vektorabfragen geben immer Ergebnisse zurück k , sofern mindestens k Dokumente vorhanden sind, auch wenn einige Dokumente eine schlechte Ähnlichkeit aufweisen. Dies liegt daran, dass der Algorithmus alle k nächsten Nachbarn des Abfragevektors findet.

  • Der Vektorsuchalgorithmus bestimmt die @search.score.

  • Felder in Suchergebnissen sind entweder alle retrievable Felder oder Felder in einer select Klausel. Bei der Ausführung von Vektorabfragen erfolgt der Abgleich 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.

Mehrere Vektorfelder

Sie können die vectorQueries.fields Eigenschaft auf mehrere Vektorfelder festlegen. Die Vektorabfrage wird für jedes Vektorfeld ausgeführt, das Sie in der fields Liste angeben. Sie können bis zu 10 Felder angeben.

Stellen Sie beim Abfragen mehrerer Vektorfelder sicher, dass jedes Element Einbettungen aus dem gleichen Einbettungsmodell enthält. Die Abfrage sollte auch aus dem gleichen Einbettungsmodell generiert werden.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-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. Diese Art von Abfrage wird häufig mit Modellen wie CLIP für die multimodale Suche verwendet, wobei dasselbe Modell sowohl Text als auch Bilder vektorisieren kann.

Das folgende Abfragebeispiel sucht sowohl in myImageVector als auch in myTextVector nach Ähnlichkeit und sendet zwei entsprechende Abfrageeinbettungen, die jeweils parallel ausgeführt werden. Das Ergebnis dieser Abfrage wird mithilfe der reziprokierten Rangfusion (RRF) bewertet.

  • 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 einbezogen 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
        }
    ]
}

Suchindizes können keine Bilder speichern. Angenommen, Ihr Index enthält ein Feld für die Bilddatei, die Suchergebnisse enthalten eine Kombination aus Text und Bildern.

Abfrage mit integrierter Vektorisierung

Dieser Abschnitt zeigt eine Vektorabfrage, die die integrierte Vektorisierung aufruft, um eine Text- oder Bildabfrage in einen Vektor zu konvertieren. Wir empfehlen die stabile REST-API 2024-07-01, den Suchexplorer oder neuere Azure SDK-Pakete für dieses Feature.

Eine Voraussetzung ist ein Suchindex, der einen Vektorisierer konfiguriert und einem Vektorfeld zugewiesen hat. Der Vektorisierer stellt Verbindungsinformationen zu einem einbettenden Modell bereit, das zur Abfragezeit verwendet wird.

Der Suchexplorer unterstützt die integrierte Vektorisierung zur Abfragezeit. Wenn Ihr Index Vektorfelder enthält und über einen Vektorisierer verfügt, können Sie die integrierte Text-zu-Vektor-Konvertierung verwenden.

  1. Melden Sie sich beim Azure-Portal an, und suchen Sie Ihren Suchdienst.

  2. Wählen Sie im linken Menü "Suchverwaltungsindizes>" und dann Ihren Index aus.

  3. Wählen Sie die Registerkarte " Vektorprofile " aus, um zu bestätigen, dass Sie über einen Vektorizer verfügen.

    Screenshot: Vektorisierereinstellung in einem Suchindex

  4. Wählen Sie die Registerkarte "Such-Explorer " aus. Mithilfe der Standardabfrageansicht können Sie eine Textzeichenfolge in die Suchleiste eingeben. Der integrierte Vektorisierer konvertiert Ihre Zeichenfolge in einen Vektor, führt die Suche aus und gibt Ergebnisse zurück.

    Alternativ können Sie Ansicht>JSON-Ansicht auswählen, um die Abfrage anzuzeigen oder zu ändern. Wenn Vektoren vorhanden sind, richtet der Suchexplorer automatisch eine Vektorabfrage ein. Mit der JSON-Ansicht können Sie Felder für die Verwendung in der Suche und Antwort auswählen, Filter hinzufügen und erweiterte Abfragen erstellen, z. B. Hybridabfragen. Um ein JSON-Beispiel anzuzeigen, wählen Sie in diesem Abschnitt die Registerkarte "REST-API" aus.

Anzahl der bewerteten Ergebnisse in einer Vektorabfrageantwort

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

Wenn Sie mit der Volltextsuche vertraut sind, wissen Sie, dass Sie null Ergebnisse erwarten, wenn der Index keinen Begriff oder Ausdruck enthält. In der Vektorsuche identifiziert der Suchvorgang jedoch die nächsten Nachbarn und gibt immer Ergebnisse zurück k , auch wenn die nächsten Nachbarn nicht so ähnlich sind. Es ist möglich, Ergebnisse für unsinnige oder offthematische Abfragen zu erhalten, 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 es keine näheren gibt. Daher kann eine Antwort ohne aussagekräftige Ergebnisse weiterhin Ergebnisse zurückgeben k , aber die Ähnlichkeitsbewertung jedes Ergebnisses wäre niedrig.

Ein Hybridansatz , der die Volltextsuche enthält, kann dieses Problem mindern. Eine weitere Lösung besteht darin, einen Mindestschwellenwert für die Suchbewertung festzulegen, aber nur, wenn es sich bei der Abfrage um eine reine Einzelvektorabfrage handelt. Hybridabfragen sind nicht für Mindestschwellenwerte geeignet, da die RRF-Bereiche wesentlich kleiner und veränderlicher sind.

Abfrageparameter, die sich auf die Ergebnisanzahl auswirken, umfassen:

  • "k": n Ergebnisse für nur Vektorabfragen.
  • "top": n Ergebnisse für Hybridabfragen, die einen search Parameter enthalten.

Sowohl k als auch top sind optional. Wenn nicht angegeben, beträgt die Standardanzahl der Ergebnisse in einer Antwort 50. Sie können top und skip auf die -Seite festlegen, um weitere Ergebnisse anzuzeigen, oder die Standardeinstellung ändern.

In einer Vektorabfrage verwendete Bewertungsalgorithmen

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

  • Die Ähnlichkeitsmetrik.
  • RRF, wenn mehrere Gruppen von Suchergebnissen vorhanden sind.

Ähnlichkeitsmetrik

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

Azure OpenAI-Einbettungsmodelle verwenden die Kosinusähnlichkeit. Wenn Sie also Azure OpenAI-Einbettungsmodelle verwenden, ist cosine die empfohlene Metrik. Weitere unterstützte Bewertungsmetriken sind euclidean und dotProduct.

RRF

Mehrere Sätze werden erstellt, wenn die Abfrage auf mehrere Vektorfelder ausgerichtet ist, mehrere Vektorabfragen parallel ausgeführt wird oder eine Hybridlösung der Vektor- und Volltextsuche mit oder ohne semantische Rangfolge ist.

Während der Abfrageausführung kann eine Vektorabfrage nur auf einen internen Vektorindex abzielen. Für mehrere Vektorfelder und mehrere Vektorabfragen generiert die Suchmaschine 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.The output is a set of ranked results for each query, which are fused using RRF. Weitere Informationen finden Sie unter Relevanzbewertung mithilfe der reziprozien Rangfusion.

Vektorgewichtung

Fügen Sie einen weight-Abfrageparameter hinzu, um die relative Gewichtung der einzelnen Vektorabfragen anzugeben, die in Suchvorgängen enthalten sind. Dieser Wert wird verwendet, wenn die Ergebnisse mehrerer Bewertungslisten, die von zwei oder mehr Vektorabfragen in derselben Anforderung oder aus dem Vektorteil einer Hybridabfrage erstellt werden, kombiniert werden.

Der Standardwert ist 1,0, und der Wert muss eine positive Zahl größer als 0 sein.

Gewichtungen werden beim Berechnen der RRF-Bewertungen jedes Dokuments verwendet. Die Berechnung ist ein Multiplikator des Werts weight mit dem Bewertungsergebnis des Dokuments innerhalb seines jeweiligen Resultsets.

Das folgende Beispiel enthält eine Hybridabfrage mit zwei Vektorabfragezeichenfolgen und einer Textzeichenfolge. Den Vektorabfragen werden Gewichtungen zugewiesen. Die erste Abfrage ist 0,5 bzw. die Hälfte der Gewichtung, wodurch die Wichtigkeit in der Anforderung reduziert wird. Die zweite Vektorabfrage ist doppelt so wichtig.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-07-01

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_first_vector_field", 
          "k": 10, 
          "weight": 0.5 
        },
        { 
          "kind": "vector", 
          "vector": [4.0, 5.0, 6.0], 
          "fields": "my_second_vector_field", 
          "k": 10, 
          "weight": 2.0
        } 
      ], 
      "search": "hello world" 
    } 

Die Vektorgewichtung gilt nur für Vektoren. Die Textabfrage in diesem Beispiel "hello world"weist eine implizite neutrale Gewichtung von 1,0 auf. Bei einer Hybridabfrage können Sie jedoch die Wichtigkeit von Textfeldern durch Festlegen von maxTextRecallSize erhöhen oder verringern.

Festlegen von Schwellenwerten zum Ausschließen von Ergebnissen mit niedriger Bewertung (Vorschauversion)

Da die Suche nach Pixelwiederholungen immer die angeforderten k Nachbarn liefert, ist es möglich, dass Sie bei der Erfüllung der Anforderung an die Anzahl k der Suchergebnisse auch mehrere Treffer mit niedriger Bewertung erhalten. Um Suchergebnisse mit niedriger Bewertung auszuschließen, können Sie einen threshold Abfrageparameter hinzufügen, der Ergebnisse basierend auf einer Mindestbewertung filtert. Die Filterung erfolgt vor der Verknüpfung der Ergebnisse aus verschiedenen Abrufmengen.

Dieser Parameter befindet sich in der Vorschau. Wir empfehlen die REST-API-Version 2024-05-01-Preview .

In diesem Beispiel werden alle Übereinstimmungen, die unter 0,8 liegen, von Vektorsuchergebnissen ausgeschlossen, auch wenn die Anzahl der Ergebnisse unterschreitet k.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-preview 
    Content-Type: application/json 
    api-key: [admin key] 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my-cosine-field", 
          "threshold": { 
            "kind": "vectorSimilarity", 
            "value": 0.8 
          } 
        }
      ]
    }

MaxTextSizeRecall für die Hybridsuche (Vorschauversion)

Vektorabfragen werden häufig in Hybridkonstrukten verwendet, die Nichtvektorfelder enthalten. Wenn Sie feststellen, dass BM25-bewertete Ergebnisse in einem Hybridabfrageergebnis über- oder unterrepräsentiert sind, können Sie maxTextRecallSize festlegen, um die BM25-bewerteten Ergebnisse, die für die Hybridbewertung bereitgestellt wurden, zu verringern oder zu erhöhen.

Sie können diese Eigenschaft nur in Hybridanforderungen festlegen, die beide search und vectorQueries Komponenten enthalten.

Dieser Parameter befindet sich in der Vorschau. Wir empfehlen die REST-API-Version 2024-05-01-Preview .

Weitere Informationen finden Sie unter Festlegen von maxTextRecallSize – Erstellen einer Hybridabfrage.

Nächste Schritte

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