Erstellen einer Hybridabfrage in Azure AI Search

Die Hybridsuche kombiniert eine oder mehrere Stichwortabfragen mit einer oder mehreren Vektorabfragen in einer einzigen Suchanforderung. Die Abfragen werden parallel ausgeführt. Die Ergebnisse werden mithilfe der Reciprocal Rank Fusion (RRF) nach neuen Suchbewertungen zusammengeführt und neu angeordnet, um ein einzelnes bewertetes Resultset zurückzugeben.

In den meisten Fällen, so zeigen Benchmarktests, liefern hybride Abfragen mit semantischer Rangfolge die relevantesten Ergebnisse.

Verwenden Sie zum Definieren einer Hybridabfrage die REST-API 2023-11-01, 2023-10-01-preview-, 2024-03-01-preview, Search Explorer im Azure-Portal oder neuere Versionen der Azure SDKs.

Voraussetzungen

Hybridabfrage im Suchexplorer ausführen

  1. Stellen Sie im Suchexplorer sicher, dass die API-Version 2023-10-01-preview oder höher ist.

  2. Wählen Sie unter AnsichtJSON-Ansicht aus.

  3. Ersetzen Sie die Standardabfragevorlage durch eine hybride Abfrage, wie z. B. die in Zeile 539 beginnende Abfrage für das Vektorschnellstartbeispiel. Aus Platzgründen wird der Vektor in diesem Artikel abgeschnitten.

    Eine Hybridabfrage verfügt über eine Textabfrage, die in searchangegeben ist, und eine Vektorabfrage, die unter vectorQueries.vector angegeben ist.

    Die Textabfrage und die Vektorabfrage sollten gleichwertig sein oder zumindest nicht in Konflikt stehen. Wenn die Abfragen unterschiedlich sind, haben Sie nicht den Vorteil von Hybrid.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Klicken Sie auf Suchen.

Hybridabfrageanforderung (REST-API)

Eine Hybridabfrage kombiniert die Textsuche und die Vektorsuche, bei welcher der search-Parameter eine Abfragezeichenfolge verwendet und vectorQueries.vector die Vektorabfrage verwendet. Die Suchmaschine führt Volltext- und Vektorabfragen parallel aus. Die Vereinigungsmenge aller Übereinstimmungen wird mithilfe von Reciprocal Rank Fusion (RRF) ausgewertet und ein einzelnes Resultset wird in der Antwort zurückgegeben.

Die Ergebnisse werden in Nur-Text zurückgegeben, einschließlich Vektoren in Feldern, die als retrievable gekennzeichnet sind. Da numerische Vektoren in Suchergebnissen nicht nützlich sind, wählen Sie andere Felder im Index als Proxy für die Vektorüberstimmung aus. Wenn ein Index beispielsweise die Felder „descriptionVector“ und „descriptionText“ enthält, kann die Abfrage für „descriptionVector“ übereinstimmen, aber das Suchergebnis kann „descriptionText“ anzeigen. Verwenden Sie den select-Parameter, um nur lesbare Felder in den Ergebnissen anzugeben.

Das folgende Beispiel zeigt eine Hybridabfragekonfiguration.

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}}
{
    "vectorQueries": [{
        "vector": [
            -0.009154141,
            0.018708462,
            . . . 
            -0.02178128,
            -0.00086512347
        ],
        "fields": "DescriptionVector",
        "kind": "vector",
        "exhaustive": true,
        "k": 10
    }],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": "10"
}

Die wichtigsten Punkte:

  • Die Vektorabfragezeichenfolge wird über die Eigenschaft vectorQueries.vector angegeben. Die Abfrage wird für das Feld „DescriptionVector“ ausgeführt. Legen Sie kind auf „Vektor“ fest, um den Abfragetyp anzugeben. Legen Sie optional exhaustive auf „true“ fest, um den vollständigen Inhalt des Vektorfelds abzufragen.

  • Die Schlüsselwortsuche wird durch die Eigenschaft search angegeben. Dies wird parallel zur Vektorabfrage ausgeführt.

  • k bestimmt, wie viele Übereinstimmungen von Pixelwiederholungen mit der Vektorabfrage zurückgegeben und dem RRF-Bewerter bereitgestellt werden.

  • top bestimmt, wie viele Übereinstimmungen in der Antwort insgesamt zurückgegeben werden. In diesem Beispiel enthält die Antwort 10 Ergebnisse, vorausgesetzt, es gibt mindestens 10 Übereinstimmungen in den zusammengeführten Ergebnissen.

Hybridsuche mit Filter

In diesem Beispiel wird ein Filter hinzugefügt, der auf die filterable Nichtvektorfelder des Suchindex angewendet 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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Die wichtigsten Punkte:

  • Filter werden auf den Inhalt von filterbaren Feldern angewendet. In diesem Beispiel ist das Feld „ParkingIncluded“ ein boolescher Wert und wird im Indexschema als filterable markiert.

  • In Hybridabfragen können Filter vor der Abfrageausführung angewendet werden, um die Abfrageoberfläche zu reduzieren, oder nach der Abfrageausführung, um Ergebnisse zu kürzen. "preFilter" ist die Standardoption. Um postFilter zu verwenden, legen Sie den Filterverarbeitungsmodus fest, wie in diesem Beispiel gezeigt.

  • Wenn Sie Abfrageergebnisse nachträglich filtern, ist die Anzahl der Ergebnisse möglicherweise kleiner als „top-n“.

Wenn Sie die semantische Rangfolge aktiviert haben und Ihre Indexdefinition eine semantische Konfiguration beinhaltet, können Sie eine Abfrage formulieren, die Vektorsuche sowie Stichwortsuche mit semantischer Rangfolge über die zusammengeführten Ergebnisse umfasst. Optional können Sie Beschriftungen und Antworten hinzufügen.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Die wichtigsten Punkte:

  • Die semantische Bewertung akzeptiert bis zu 50 Ergebnisse aus der zusammengeführten Antwort. Legen Sie „k“" und „top“ auf 50 fest, um beide Abfragen gleich darzustellen.

  • „queryType“ und „semanticConfiguration“ sind erforderlich.

  • „captions“ und „answers“ sind optional. Werte werden aus dem ausführlichen Text in den Ergebnissen extrahiert. Eine Antwort wird nur zurückgegeben, wenn die Ergebnisse Inhalte mit den Merkmalen einer Antwort auf die Abfrage enthalten.

Semantische Hybridsuche mit Filter

Dies ist die letzte Abfrage in der Sammlung. Es handelt sich um dieselbe semantische Hybridabfrage wie im vorherigen Beispiel, jedoch mit einem Filter.

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}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Die wichtigsten Punkte:

  • Der Filtermodus kann sich auf die Anzahl der Ergebnisse auswirken, die für die semantische Neusortierung verfügbar sind. Als bewährte Methode empfiehlt es sich, dem semantischen Sortierer die maximale Anzahl von Dokumenten (50) bereitzustellen. Wenn Vor- oder Nachfilter zu selektiv sind, ist es für den semantischen Sortierer möglichweise nicht ausreichend, wenn Sie ihm weniger als 50 Dokumente zum Verarbeiten zur Verfügung stellen.

  • Die Vorfilterung wird vor der Abfrageausführung angewendet. Wenn der Vorfilter den Suchbereich auf 100 Dokumente reduziert, wird die Vektorabfrage für das Feld „DescriptionVector“ für diese 100 Dokumente ausgeführt und gibt die k=50 besten Übereinstimmungen zurück. Diese 50 übereinstimmenden Dokumente werden dann für zusammengeführte Ergebnisse an RRF und anschließend an den semantischen Sortierer übergeben.

  • Nachfilter werden nach der Abfrageausführung angewendet. Wenn k=50 50 Übereinstimmungen auf der Vektorabfrageseite zurückgibt, wird der Nachfilter auf die 50 Übereinstimmungen angewendet. Dadurch werden die Ergebnisse reduziert, die Filterkriterien erfüllen, sodass Sie weniger als 50 Dokumente an den semantischen Sortierer übergeben können.

Konfigurieren einer Abfrageantwort

Wenn Sie die Hybridabfrage einrichten, denken Sie an die Antwortstruktur. Die Antwort ist ein flaches Rowset. Parameter für die Abfrage bestimmen, welche Felder sich in jeder Zeile befinden und wie viele Zeilen in der Antwort enthalten sind. Die Suchmaschine bewertet die übereinstimmenden Dokumente und gibt die relevantesten Ergebnisse zurück.

Felder in einer Antwort

Suchergebnisse bestehen aus retrievable-Feldern aus Ihrem Suchindex. Das Ergebnis ist eines der folgenden:

  • Alle retrievable-Felder (eine REST-API-Standardeinstellung).
  • Felder, die in einem „select“-Parameter in der Abfrage explizit aufgeführt sind.

In den Beispielen in diesem Artikel wurde eine „select“-Anweisung verwendet, um Textfelder (nicht Vektorfelder) in der Antwort anzugeben.

Hinweis

Vektoren werden nicht in einen für Menschen lesbaren Text umgewandelt, daher sollten sie nicht in der Antwort enthalten sein. Wählen Sie stattdessen Nichtvektorfelder aus, die für das Suchdokument repräsentativ sind. Wenn die Abfrage beispielsweise auf ein Feld „DescriptionVector“ ausgerichtet ist, geben Sie ein entsprechendes Textfeld zurück, wenn sie eins („Description“) in der Antwort haben.

Ergebnisanzahl

Eine Abfrage kann mit einer beliebigen Anzahl von Dokumenten übereinstimmen, so viele wie alle, wenn die Suchkriterien schwach sind (z. B. „search=*“ für eine NULL-Abfrage). Da es selten praktisch ist, ungebundene Ergebnisse zurückzugeben, sollten Sie für die Antwort ein Maximum vorgeben:

  • "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.

Wenn Sie die semantische Bewertung verwenden, empfiehlt es sich, sowohl „k“ als auch „top“ auf mindestens 50 festzulegen. Der semantische Sortierer kann bis zu 50 Ergebnisse annehmen. Durch Angabe von 50 für jede Abfrage erhalten Sie eine identische Darstellung aus beiden Suchsubsystemen.

Rangfolge

Es werden mehrere Sätze für Hybridabfragen mit oder ohne die optionale semantische Rangfolge erstellt. Die Rangfolge der Ergebnisse wird durch Reciprocal Rank Fusion (RRF) berechnet.

Vergleichen Sie in diesem Abschnitt die Antworten zwischen der Einzelvektorsuche und der einfachen hybriden Suche im Hinblick auf das beste Ergebnis. Die verschiedenen Bewertungsalgorithmen, die Ähnlichkeitsmetrik von HNSW und RRF, erzeugen Bewertungen verschiedener Größenordnung. Es handelt sich hierbei um ein beabsichtigtes Verhalten. RRF-Bewertungen können recht niedrig erscheinen, auch bei einer Übereinstimmung mit hoher Ähnlichkeit. Niedrigere Bewertungen sind ein Merkmal des RRF-Algorithmus. Bei einer Hybridabfrage mit RRF wird ein größerer Teil des Kehrwerts der rangfolgebewerteten Dokumente in die Ergebnisse einbezogen, da die Bewertungen der RRF-Dokumente im Vergleich zur reinen Vektorsuche relativ kleiner sind.

Einzelvektorsuche: @search.score für Ergebnisse nach Kosinusähnlichkeit sortiert (Standardfunktion für Vektorähnlichkeitsabstand).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Hybridsuche: @search.score für hybride Ergebnisse, die mit Reciprocal Rank Fusion eingestuft wurden.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Nächste Schritte

Als nächster Schritt empfiehlt sich die Durcharbeitung des Democodes für Python, C# oder JavaScript.