Udostępnij za pośrednictwem


Ocenianie istotności w wyszukiwaniu hybrydowym przy użyciu wzajemnego łączenia rangi (RRF)

Wzajemne łączenie rangi (RRF) to algorytm, który ocenia wyniki wyszukiwania z wielu, wcześniej sklasyfikowanych wyników w celu wygenerowania ujednoliconego zestawu wyników. W usłudze Azure AI Search RRF jest używany zawsze, gdy istnieją co najmniej dwa zapytania, które są wykonywane równolegle. Każde zapytanie tworzy sklasyfikowany zestaw wyników, a funkcja RRF służy do scalania i homogenizowania klasyfikacji w jednym zestawie wyników zwróconym w odpowiedzi zapytania. Przykłady scenariuszy, w których RRF jest zawsze używane, obejmują wyszukiwanie hybrydowe i wiele zapytań wektorowych wykonywanych jednocześnie.

RRF opiera się na koncepcji wzajemnej rangi, która jest odwrotnością rangi pierwszego odpowiedniego dokumentu na liście wyników wyszukiwania. Celem techniki jest uwzględnienie pozycji elementów w oryginalnych rankingach i nadanie większego znaczenia elementom, które są klasyfikowane wyżej na wielu listach. Może to pomóc poprawić ogólną jakość i niezawodność końcowego rankingu, co czyni go bardziej przydatnym w zadaniu łączenia wielu uporządkowanych wyników wyszukiwania.

Uwaga

Nowość w wersji 2024-09-01-preview to możliwość dekonstrukcji sklasyfikowanego wyniku wyszukiwania RRF w jego podscores składników. Zapewnia to przejrzystość w kompozycji wyników all-up. Aby uzyskać więcej informacji, zobacz rozpakowywanie wyników wyszukiwania (wersja zapoznawcza) w tym artykule.

Jak działa klasyfikacja RRF

Funkcja RRF działa przez pobranie wyników wyszukiwania z wielu metod, przypisanie wzajemnego wyniku klasyfikacji do każdego dokumentu w wynikach, a następnie połączenie wyników w celu utworzenia nowego rankingu. Koncepcja polega na tym, że dokumenty pojawiające się na pierwszych pozycjach w wielu metodach wyszukiwania prawdopodobnie będą bardziej istotne i powinny zostać sklasyfikowane wyżej w połączonym wyniku.

Oto proste wyjaśnienie procesu RRF:

  1. Uzyskaj sklasyfikowane wyniki wyszukiwania z wielu zapytań wykonywanych równolegle.

  2. Przypisz wzajemne wyniki klasyfikacji w celu uzyskania wyników na każdej z list sklasyfikowanych. Funkcja RRF generuje nowe @search.score dla każdego dopasowania w każdym zestawie wyników. Dla każdego dokumentu w wynikach wyszukiwania aparat przypisuje wynik wzajemnej rangi na podstawie jego pozycji na liście. Wynik jest obliczany jako 1/(rank + k), gdzie rank jest pozycją dokumentu na liście i k jest stałą, która została eksperymentalnie zaobserwowana, aby wykonać najlepiej, jeśli jest ustawiona na małą wartość, na przykład 60. Należy pamiętać, że ta k wartość jest stałą w algorytmie RRF i całkowicie oddzielona od k tej, która kontroluje liczbę najbliższych sąsiadów.

  3. Połącz wyniki. Dla każdego dokumentu aparat sumuje wzajemne wyniki klasyfikacji uzyskane z każdego systemu wyszukiwania, generując łączny wynik dla każdego dokumentu. 

  4. Aparat klasyfikuje dokumenty na podstawie połączonych wyników i sortuje je. Wynikowa lista jest rankingem połączonym.

Do oceniania są używane tylko pola oznaczone jako searchable w indeksie lub searchFields w zapytaniu. Tylko pola oznaczone jako retrievablelub określone w select zapytaniu są zwracane w wynikach wyszukiwania wraz z ich wynikiem wyszukiwania.

Równoległe wykonywanie zapytań

RRF jest używany w dowolnym momencie, gdy istnieje więcej niż jedno wykonanie zapytania. W poniższych przykładach przedstawiono wzorce zapytań, w których odbywa się równoległe wykonywanie zapytań:

  • Zapytanie pełnotekstowe oraz jedno zapytanie wektorowe (prosty scenariusz hybrydowy) równa się dwóm wykonaniom zapytań.
  • Zapytanie pełnotekstowe oraz jedno zapytanie wektorowe przeznaczone dla dwóch pól wektorów jest równe trzy wykonania zapytania.
  • Zapytanie pełnotekstowe i dwa zapytania wektorowe przeznaczone dla pięciu pól wektorów są równe 11 wykonań zapytań

Wyniki w wynikach wyszukiwania hybrydowego

Za każdym razem, gdy wyniki są klasyfikowane, @search.score właściwość zawiera wartość używaną do zamawiania wyników. Wyniki są generowane przez algorytmy klasyfikacji, które różnią się w zależności od każdej metody. Każdy algorytm ma swój własny zakres i wielkość.

Poniższy wykres identyfikuje właściwość oceniania zwracaną dla każdego dopasowania, algorytmu i zakresu wyników dla każdego algorytmu klasyfikacji istotności.

Metoda wyszukiwania Parametr Algorytm oceniania Zakres
wyszukiwanie pełnotekstowe @search.score Algorytm BM25 Brak górnego limitu.
wyszukiwanie wektorów @search.score Algorytm HNSW korzystający z metryki podobieństwa określonej w konfiguracji HNSW. 0,333 – 1,00 (Cosine), od 0 do 1 dla euklidesanów i dotproduct.
wyszukiwanie hybrydowe @search.score Algorytm RRF Górny limit jest ograniczony przez liczbę połączonych zapytań, a każde zapytanie współtworzone maksymalnie 1 do wyniku RRF. Na przykład scalanie trzech zapytań spowodowałoby wygenerowanie wyższych wyników RRF niż w przypadku scalenia tylko dwóch wyników wyszukiwania.
klasyfikacja semantyczna @search.rerankerScore Ranking semantyczny 0.00 - 4.00

Klasyfikacja semantyczna występuje po scaleniu wyników za pomocą protokołu RRF. Jego wynik (@search.rerankerScore) jest zawsze zgłaszany oddzielnie w odpowiedzi na zapytanie. Semantyczny ranger może ponownie korektować pełny tekst i wyniki wyszukiwania hybrydowego, przy założeniu, że wyniki te obejmują pola o zawartości wzbogaconej semantycznie. Może on ponownie korektować zapytania wektorów, jeśli dokumenty wyszukiwania zawierają pola tekstowe zawierające semantycznie odpowiednią zawartość.

Rozpakowywanie wyniku wyszukiwania do podscores (wersja zapoznawcza)

Korzystając z wersji 2024-09-01-preview, można zdekonstruować wynik wyszukiwania, aby wyświetlić jego podscorey.

W przypadku zapytań wektorowych te informacje mogą ułatwić określenie odpowiedniej wartości dla wagi wektorów lub ustawienia minimalnych progów.

Aby uzyskać podscores:

  • Użyj najnowszego interfejsu API REST dokumentów wyszukiwania w wersji zapoznawczej lub pakietu beta zestawu Azure SDK, który udostępnia tę funkcję.

  • Zmodyfikuj żądanie zapytania, dodając nowy debug parametr ustawiony na vector, semantic jeśli używasz semantycznego rangatora lub all.

Oto przykład zapytania hybrydowego zwracającego podscorey w trybie debugowania:

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,
            "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",
    "debug": "vector",
    "top": 10
}

Wyniki ważone

Korzystając z wersji 2024-07-01 i nowszej wersji interfejsu API w wersji zapoznawczej, można zwiększyć lub zmniejszyć ich znaczenie w zapytaniu hybrydowym.

Pamiętaj, że podczas przetwarzania RRF dla określonego dokumentu wyszukiwarka sprawdza rangę tego dokumentu dla każdego zestawu wyników, w którym jest on wyświetlany. Załóżmy, że dokument jest wyświetlany w trzech oddzielnych wynikach wyszukiwania, w których wyniki pochodzą z dwóch zapytań wektorowych i jednego tekstu BM25 sklasyfikowanego zapytania. Pozycja dokumentu różni się w każdym wyniku.

Znalezione dopasowanie Pozycja w wynikach @search.score mnożnik wagi @search.score (ważone)
wyniki wektora jeden pozycja 1 0.8383955 0.5 0.41919775
wyniki wektora dwa pozycja 5 0.81514114 2.0 1.63028228
Wyniki BM25 pozycja 10 0.8577363 NA 0.8577363

Pozycja dokumentu w każdym zestawie wyników odpowiada początkowemu wynikowi, który jest dodawany w celu utworzenia końcowego wyniku RRF dla tego dokumentu.

W przypadku dodania wagi wektorów początkowe wyniki podlegają mnożnikowi wagi, który zwiększa lub zmniejsza wynik. Wartość domyślna to 1,0, co oznacza, że nie ma wagi, a początkowy wynik jest używany w klasyfikacji RRF. Jednak jeśli dodasz wagę 0,5, wynik zostanie zmniejszony i wynik stanie się mniej ważny w połączonej klasyfikacji. Z drugiej strony, jeśli dodasz wagę 2,0, wynik staje się większym czynnikiem w ogólnym wyniku RRF.

W tym przykładzie @search.score wartości (ważone) są przekazywane do modelu klasyfikacji RRF.

Liczba sklasyfikowanych wyników w odpowiedzi na zapytanie hybrydowe

Domyślnie, jeśli nie używasz stronicowania, wyszukiwarka zwraca 50 najlepszych dopasowań klasyfikacji dla wyszukiwania pełnotekstowego i najbardziej podobnych k dopasowań do wyszukiwania wektorów. W zapytaniu top hybrydowym określa liczbę wyników w odpowiedzi. W oparciu o wartości domyślne zwracane są 50 najlepiej sklasyfikowanych dopasowań ujednoliconego zestawu wyników.

Często wyszukiwarka znajduje więcej wyników niż top i k. Aby zwrócić więcej wyników, użyj parametrów topstronicowania , skipi next. Stronicowanie to sposób określania liczby wyników na każdej stronie logicznej i przechodzenia przez pełny ładunek. Możesz ustawić maxTextRecallSize na większe wartości (wartość domyślna to 1000), aby zwrócić więcej wyników po stronie tekstowej zapytania hybrydowego.

Domyślnie wyszukiwanie pełnotekstowe podlega maksymalnemu limitowi 1000 dopasowań (zobacz Limity odpowiedzi interfejsu API). Po znalezieniu 1000 dopasowań wyszukiwarka nie szuka już więcej.

Aby uzyskać więcej informacji, zobacz Jak pracować z wynikami wyszukiwania.

Diagram przepływu pracy oceniania wyszukiwania

Na poniższym diagramie przedstawiono zapytanie hybrydowe, które wywołuje wyszukiwanie słów kluczowych i wektorów, zwiększając je za pośrednictwem profilów oceniania i klasyfikację semantyczną.

Diagram wstępnie filtrów.

Zapytanie, które generuje poprzedni przepływ pracy, może wyglądać następująco:

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}}
{
   "queryType":"semantic",
   "search":"hello world",
   "searchFields":"field_a, field_b",
   "vectorQueries": [
       {
           "kind":"vector",
           "vector": [1.0, 2.0, 3.0],
           "fields": "field_c, field_d"
       },
       {
           "kind":"vector",
           "vector": [4.0, 5.0, 6.0],
           "fields": "field_d, field_e"
       }
   ],
   "scoringProfile":"my_scoring_profile"
}

Zobacz też