Erstellen einer Hybridabfrage in Azure AI Search

Die Hybridsuche kombiniert (schlüsselwortbasierte) Textabfragen und Vektorabfragen in einer einzelnen Suchanforderung. Alle Unterabfragen in der Anforderung werden parallel ausgeführt. Die Ergebnisse werden mithilfe der Reciprocal Rank Fusion (RRF) nach neuen Suchbewertungen zusammengeführt und neu angeordnet, um ein einheitliches Resultset zurückzugeben. In vielen Fällen, so zeigen Benchmarktests, liefern hybride Abfragen mit semantischer Rangfolge die relevantesten Ergebnisse.

In diesem Artikel werden folgende Vorgehensweisen behandelt:

  • Einrichten einer einfachen Anforderung
  • Formulieren von Hybridabfragen mit mehr Parametern und Filtern
  • Verbessern der Relevanz mithilfe von semantischer Rangfolge oder Vektorgewichtungen
  • Optimieren des Abfrageverhaltens durch Steuern von Text- und Vektoreingaben

Hinweis

Neu in 2024-09-01-preview ist die Möglichkeit, Filter nur auf die Vektorunterabfragen in einer Hybridanforderung auszurichten. Dadurch können Sie die Genauigkeit der Filteranwendung verbessern. Weitere Informationen finden Sie in diesem Artikel unter Hybridsuche mit Filtern für Vektorunterabfragen (Vorschau).

Voraussetzungen

Auswählen eine API oder eines Tools

  • Der Suchexplorer im Azure-Portal (unterstützt sowohl Suchsyntax der stabilen API als auch Suchsyntax der Vorschau-API) verfügt über eine JSON-Ansicht zum Einfügen einer Hybridanforderung.

  • Stabile Version 2024-07-01 oder eine aktuelle API-Vorschauversion, wenn Sie Previewfunktionen wie maxTextRecallSize und countAndFacetMode(preview) verwenden

    Zur besseren Lesbarkeit verwenden wir REST-Beispiele, um die Funktionsweise von APIs zu erläutern. Sie können einen REST-Client wie Visual Studio Code mit der REST-Erweiterung verwenden, um Hybridabfragen zu erstellen. Weitere Informationen finden Sie unter Schnellstart: Vektorsuche mit REST-APIs.

  • Neuere stabile Pakete oder Betapakete der Azure-SDKs (siehe Änderungsprotokolle für die SDK-Featureunterstützung)

Einrichten einer Hybridabfrage im Suchexplorer

  1. Stellen Sie im Suchexplorer sicher, dass die API-Version 2024-07-01 oder eine neuere API-Vorschauversion verwendet wird.

  2. Wählen Sie unter Ansicht die Option JSON-Ansicht aus, damit Sie eine Vektorabfrage einfügen können.

  3. Ersetzen Sie die Standardabfragevorlage durch eine Hybridabfrage – etwa durch das Beispiel zum Ausführen einer Hybridabfrage, das in Zeile 539 der Vektor-Schnellstartanleitung beginnt. 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 können äquivalent oder abweichend sein. Üblicherweise haben jedoch beide die gleiche Absicht.

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

Tipp

Suchergebnisse sind einfacher zu lesen, wenn Sie die Vektoren ausblenden. Aktivieren Sie unter Abfrageoptionen die Option Vektorwerte in Suchergebnissen ausblenden.

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=2024-07-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
        },
        {
            "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=2024-07-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“.

Hybridsuche mit Filtern für Vektorunterabfragen (Vorschau)

Bei Verwendung von 2024-09-01-preview können Sie einen globalen Filter für die Suchanforderung außer Kraft setzen, indem Sie einen sekundären Filter anwenden, der nur auf die Vektorunterabfragen in einer Hybridanforderung ausgerichtet ist.

Dieses Feature sorgt dafür, dass Filter nur die Ergebnisse der Vektorsuche beeinflussen und schlüsselwortbasierte Suchergebnisse von ihnen unberührt bleiben, was eine differenzierte Steuerung ermöglicht.

Der gezielte Filter setzt den globalen Filter vollständig außer Kraft – einschließlich aller Filter, die zur Einschränkung aus Sicherheitsgründen oder für die Geosuche verwendet werden. In Fällen, in denen globale Filter erforderlich sind (etwa bei der Einschränkung aus Sicherheitsgründen), müssen diese Filter explizit sowohl in den Filter der obersten Ebene als auch in jeden Filter auf Vektorebene eingeschlossen werden, um sicherzustellen, dass Sicherheit und andere Einschränkungen konsistent erzwungen werden.

So wenden Sie gezielte Vektorfilter an

Hier sehen Sie ein Beispiel für eine Hybridabfrage, die eine Filteraußerkraftsetzung hinzufügt. Der globale Filter „Rating gt 3“ wird zur Laufzeit durch die Filteraußerkraftsetzung (filterOvrride) ersetzt.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 10
}

Wenn Sie den semantischen Sortierer 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=2024-07-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:

  • Der semantische Sortierer akzeptiert bis zu 50 Ergebnisse aus der zusammengeführten Antwort.

  • „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=2024-07-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.

Festlegen von maxTextRecallSize und countAndFacetMode (Vorschau)

In diesem Abschnitt wird erläutert, wie Sie die Eingaben für eine Hybridabfrage anpassen, indem Sie die Menge der BM25-bewerteten Ergebnisse steuern, die zum Hybridbewertungsmodell fließen. Die Steuerung der BM25-bewerteten Eingabe bietet Ihnen mehr Optionen für die Relevanzoptimierung in Hybridszenarien.

Wir empfehlen die REST-API-Vorschauversion 2024-05-01-preview.

Tipp

Eine weitere Option ist eine ergänzende oder ersetzende Technik, die Vektorgewichtung, wodurch die Bedeutung von Vektorabfragen in der Anforderung erhöht wird.

  1. Verwenden Sie Search – POST oder Search – GET in 2024-05-01-preview, um diese Parameter anzugeben.

  2. Fügen Sie ein hybridSearch-Abfrageparameterobjekt hinzu, um die maximale Anzahl von Dokumenten festzulegen, die über die BM25-bewerteten Ergebnisse einer Hybridabfrage zurückgerufen werden. Sie verfügt über zwei Eigenschaften:

    • maxTextRecallSize gibt die Anzahl der BM25-bewerteten Ergebnisse an, die dem in Hybridabfragen verwendeten RRF-Bewerter (Reciprocal Rank Fusion) zur Verfügung stehen. Der Standardwert ist 1.000. Der Höchstwert beträgt 10.000.

    • countAndFacetMode meldet die Anzahl der BM25-bewerteten Ergebnisse (und für Facets, falls verwendet). Der Standardwert schließt alle Dokumente ein, die der Abfrage entsprechen. Optional können Sie den Bereich „Count“ auf maxTextRecallSize festlegen.

  3. Verringern Sie maxTextRecallSize, wenn die Suchfunktion der Vektorähnlichkeit im Allgemeinen die Textseite der Hybridabfrage übertrifft.

  4. Vergrößern Sie maxTextRecallSize, wenn Sie über einen großen Index verfügen und der Standardwert keine ausreichende Anzahl von Ergebnissen erfasst. Mit einem größeren BM25-bewerteten Resultset können Sie auch top, skip und next festlegen, um Teile dieser Ergebnisse abzurufen.

Die folgenden REST-Beispiele zeigen zwei Anwendungsfälle zum Festlegen von maxTextRecallSize.

Im ersten Beispiel wird maxTextRecallSize auf 100 reduziert, wodurch die Textseite der Hybridabfrage auf nur 100 Dokumente beschränkt wird. Außerdem wird countAndFacetMode so festgelegt, dass nur die Ergebnisse aus maxTextRecallSize eingeschlossen sind.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

Im zweiten Beispiel wird maxTextRecallSize auf 5.000 erhöht. Außerdem verwendet es „top“, „skip“ und „next“, um Ergebnisse aus großen Resultsets abzurufen. In diesem Fall ruft die Anforderung die BM25-bewerteten Ergebnisse ab Position 1.500 bis 2.000 als Textabfragebeitrag zum zusammengesetzten RRF-Resultset ab.

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

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

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 gesamte Antwort ein Maximum vorgeben:

  • "top": n Ergebnisse für Abfragen nur mit Schlüsselwort (kein Vektor)
  • "k": n-Ergebnisse für Nur-Vektorabfragen
  • "top": n Ergebnisse für Hybridabfragen (mit oder ohne Semantik), die den 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.

Hinweis

Wenn Sie die Hybridsuche in der API „2024-05-01-preview“ verwenden, können Sie die Anzahl der Ergebnisse aus der Schlüsselwortabfrage mithilfe von maxTextRecallSize steuern. Kombinieren Sie dies mit einer Einstellung für „k“, um die Darstellung von jedem Suchsubsystem (Schlüsselwort und Vektor) zu steuern.

Ergebnisse des semantischen Sortierers

Hinweis

Der semantische Sortierer kann bis zu 50 Ergebnisse annehmen.

Wenn Sie den semantischen Sortierer in der API „2024-05-01-preview“ verwenden, empfiehlt es sich, „k“ und „maxTextRecallSize“ auf insgesamt mindestens 50 festzulegen. Anschließend können Sie die an den Benutzer zurückgegebenen Ergebnisse mit dem Parameter „top“ einschränken.

Wenn Sie den semantischen Sortierer in vorherigen APIs verwenden, gehen Sie wie folgt vor:

  • Legen Sie bei einer reinen Schlüsselwortsuche (kein Vektor) „top“ auf „50“ fest.
  • Legen Sie bei einer Hybridsuche „k“ auf „50“ fest, um sicherzustellen, dass der semantische Sortierer mindestens 50 Ergebnisse erzielt.

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": "Swirling Currents 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": "Swirling Currents 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.