Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga / Notatka
strictPostFilter jest obecnie w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie jest zalecana w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą nie być obsługiwane lub mogą mieć ograniczone możliwości. Aby uzyskać więcej informacji, zobacz Warunki dodatkowe korzystania z testowych wersji Microsoft Azure.
prefilter i postfilter są ogólnie dostępne w najnowszej stabilnej wersji interfejsu API REST.
W usłudze Azure AI Search możesz użyć wyrażenia filtru , aby dodać kryteria dołączania lub wykluczania do zapytania wektorowego. Można również określić tryb filtrowania, który stosuje filtr:
- Przed wykonaniem zapytania, znanym jako wstępne filtrowanie.
- Po wykonaniu zapytania nazywanego filtrowaniem postfiltrowania.
- Po zidentyfikowaniu globalnych najlepszych
kwyników, nazywanych ścisłym filtrowaniem postfiltrowania (wersja zapoznawcza).
W tym artykule użyto architektury REST na potrzeby ilustracji. Przykłady kodu w innych językach i kompleksowe rozwiązania, które obejmują zapytania wektorowe, zobacz repozytorium GitHub azure-search-vector-samples .
Eksplorator wyszukiwania można również użyć w witrynie Azure Portal do wykonywania zapytań dotyczących zawartości wektorowej. W widoku JSON można dodawać filtry i określać tryb filtrowania.
Jak działa filtrowanie w zapytaniach wektorowych
Usługa Azure AI Search używa algorytmu Hierarchicznego Nawigowalnego Małego Świata (HNSW) do wyszukiwania przybliżonego najbliższego sąsiada (ANN), przechowując grafy HNSW na wielu partycjach. Każdy fragment zawiera część całego indeksu.
Filtry mają zastosowanie do filterable pól niewektorowych, ciągów lub liczb do uwzględnienia lub wykluczenia dokumentów wyszukiwania na podstawie kryteriów filtru. Same pola wektorowe nie są filtrowalne, ale można użyć filtrów w innych polach w tym samym indeksie, aby zawęzić dokumenty rozważane do wyszukiwania wektorowego. Jeśli indeks nie ma odpowiednich pól tekstowych lub liczbowych, sprawdź metadane dokumentu, które mogą ułatwić filtrowanie, takie jak LastModified lub CreatedBy właściwości.
Parametr vectorFilterMode określa, gdzie operacje filtrowania są stosowane na etapach wyszukiwania, co wpływa na sposób filtrowania wyników do podzestawu elementów (takich jak kategoria, tag lub inne atrybuty) i ma wpływ na opóźnienie, kompletność i przepływność. Istnieją trzy tryby:
preFilterstosuje filtr podczas trawersowania HNSW na każdym fragmencie. Ten tryb maksymalizuje odtwarzanie, ale może przemierzać więcej grafu, zwiększając użycie procesora oraz opóźnienie w przypadku wysoce selektywnych filtrów.postFilteruruchamia przeszukiwanie HNSW i filtrowanie na każdym fragmencie niezależnie, przecina wyniki na poziomie fragmentu, a następnie agreguje najlepszekz każdego fragmentu, tworząc globalne najlepszek. Ten tryb może tworzyć wyniki fałszywie negatywne w przypadku wysoko selektywnych filtrów lub małych wartościk.strictPostFilter(wersja zapoznawcza) znajduje niefiltrowaną globalną czołówkękprzed zastosowaniem filtru. Ten tryb ma największe ryzyko zwracania wyników fałszywie ujemnych dla wysoce selektywnych filtrów i małychkwartości.
Aby uzyskać więcej informacji na temat tych trybów, zobacz Ustawianie trybu filtrowania.
Definiowanie filtru
Filtry określają zakres zapytań wektorowych i są definiowane przy użyciu funkcji Documents — Search Post (INTERFEJS API REST). Jeśli nie chcesz używać funkcji w wersji zapoznawczej, użyj najnowszej stabilnej wersji interfejsów API REST usługi wyszukiwania , aby sformułować żądanie.
Ten interfejs API REST zapewnia:
-
filterdla kryteriów. -
vectorFilterModeaby określić, kiedy filtr jest stosowany podczas zapytania wektorowego. Aby uzyskać informacje o obsługiwanych trybach, zobacz Ustawianie trybu filtrowania.
POST https://{search-endpoint}/indexes/{index-name}/docs/search?api-version={api-version}
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,
. . . // Trimmed for readability
-0.02178128,
-0.00086512347
],
"fields": "contentVector",
"k": 50
}
]
}
W tym przykładzie wektor osadzania jest przeznaczony dla contentVector pola, a kryteria filtrowania mają zastosowanie do categorypola tekstowego z możliwością filtrowania.
preFilter Ponieważ jest używany tryb, filtr jest stosowany przed uruchomieniem zapytania przez aparat wyszukiwania, więc podczas wyszukiwania wektorowego są uwzględniane tylko dokumenty w Databases kategorii.
Ustawianie trybu filtrowania
Parametr vectorFilterMode określa, kiedy i jak filtr jest stosowany względem wykonywania zapytania wektorowego. Możesz użyć następujących trybów:
-
preFilter(zalecane) postFilter-
strictPostFilter(wersja zapoznawcza)
Uwaga / Notatka
preFilter to wartość domyślna dla indeksów utworzonych po około 15 października 2023 r. W przypadku indeksów utworzonych przed tą datą postFilter jest wartością domyślną. Aby użyć preFilter i innych zaawansowanych funkcji wektorów, takich jak kompresja wektorów, należy ponownie utworzyć indeks.
Zgodność można przetestować, wysyłając zapytanie wektorowe z użyciem "vectorFilterMode": "preFilter" na wersji REST API lub nowszej 2023-10-01-preview. Jeśli zapytanie zakończy się niepowodzeniem, indeks nie obsługuje preFilterelementu .
Filtrowanie wstępne stosuje filtry przed wykonaniem zapytania, co zmniejsza zestaw kandydatów dla algorytmu wyszukiwania wektorowego. Wyniki top-k są następnie wybierane z tego filtrowanego zestawu.
W zapytaniu wektorowym jest trybem domyślnym, preFilter ponieważ faworyzuje kompletność i jakość w przypadku opóźnień.
Jak działa ten tryb
Dla każdego fragmentu zastosuj predykat filtru podczas przechodzenia HNSW, rozwijając graf do momentu
kznalezienia kandydatów.Wygeneruj wstępnie przefiltrowane lokalne wyniki top-
kdla każdego fragmentu.Zagreguj przefiltrowane wyniki do globalnego zestawu wyników najwyższego
kpoziomu.
Efekt tego trybu
Trawersowanie rozszerza zakres wyszukiwania, aby znaleźć więcej kandydatów po filtracji, zwłaszcza jeśli filtr jest selektywny. Daje to najbardziej podobne top-k wyniki we wszystkich odłamkach. Każdy fragment identyfikuje k wyniki spełniające predykat filtru.
Wstępne filtrowanie gwarantuje, że wyniki k są zwracane, jeśli są obecne w indeksie. W przypadku wysoce selektywnych filtrów może to spowodować przejście znacznej części grafu, zwiększenie kosztów obliczeń i opóźnień przy jednoczesnym zmniejszeniu przepływności. Jeśli filtr jest wysoce selektywny (ma bardzo mało dopasowań), rozważ korzystanie z exhaustive: true w celu przeprowadzenia wyczerpującego wyszukiwania.
Tabela porównania
| Mode | Przywołanie (przefiltrowane wyniki) | Koszt obliczeniowy | Ryzyko uzyskania wyników fałszywie ujemnych | Kiedy należy używać |
|---|---|---|---|---|
preFilter |
Bardzo wysoki | Wyższa (zwiększa się wraz z selektywnością i złożonością filtra) | Brak ryzyka |
Zalecana wartość domyślna dla wszystkich scenariuszy, szczególnie gdy kluczowe jest zachowanie pamięci (wrażliwe domeny wyszukiwania), przy korzystaniu z filtrów selektywnych lub przy używaniu małych k. |
postFilter |
Średni do wysoki (zmniejsza się wraz z selektywnością filtra) | Podobnie jak w przypadku niefiltrowanych, wzrasta wraz ze wzrostem złożoności filtru. | Umiarkowane (może przegapić dopasowania na odłamku) | Opcja dla filtrów, które nie są zbyt selektywne, i dla bardziej zaawansowanych zapytań. |
strictPostFilter |
Najniższy (szybciej zmniejsza się przy użyciu selektora filtru) | Podobne do niefiltrowanych | Najwyższy (może zwracać zero wyników dla filtrów selektywnych lub małych k) |
Opcja dla aplikacji wyszukiwania z podziałem na kategorie, w których wyświetlenie większej liczby wyników po zastosowaniu filtru wpływa na doświadczenie użytkownika bardziej niż ryzyko fałszywych negatywów. Nie używaj z małymi k. |
Testowanie porównawcze wstępnego filtrowania i filtrowania
Ważne
Ta sekcja dotyczy filtrowania wstępnego i filtrowania postfiltrowania, a nie ścisłego filtrowania postfiltrowania.
Aby zrozumieć warunki, w których jeden tryb filtrowania działa lepiej niż drugi, przeprowadziliśmy serię testów w celu oceny wyników zapytań w przypadku małych, średnich i dużych indeksów.
- Mały (100 000 dokumentów, indeks 2,5 GB, 1536 wymiarów)
- Średni (1 milion dokumentów, indeks 25 GB, 1536 wymiarów)
- Duży (1 miliard dokumentów, indeks 1,9 TB, 96 wymiarów)
W przypadku małych i średnich obciążeń użyliśmy usługi Standardowa 2 (S2) z jedną partycją i jedną repliką. W przypadku dużego obciążenia użyliśmy usługi Standardowa 3 (S3) z 12 partycjami i jedną repliką.
Indeksy miały identyczną konstrukcję: jedno pole klucza, jedno pole wektorowe, jedno pole tekstowe i jedno pole filtrowalne liczbowo. Poniższy indeks jest definiowany 2023-11-03 przy użyciu składni .
def get_index_schema(self, index_name, dimensions):
return {
"name": index_name,
"fields": [
{"name": "id", "type": "Edm.String", "key": True, "searchable": True},
{"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
"searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
"vectorSearchProfile": "defaulthnsw"},
{"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
"sortable": False, "facetable": False},
{"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
"retrievable": True, "sortable": True, "facetable": True}
],
"vectorSearch": {
"algorithms": [
{
"name": "defaulthnsw",
"kind": "hnsw",
"hnswParameters": { "metric": "euclidean" }
}
],
"profiles": [
{
"name": "defaulthnsw",
"algorithm": "defaulthnsw"
}
]
}
}
W zapytaniach użyliśmy identycznego filtru dla operacji filtrowania wstępnego i postfiltru. Użyliśmy prostego filtru, aby upewnić się, że zmiany wydajności były spowodowane trybem filtrowania, a nie złożonością filtrowania.
Wyniki były mierzone w zapytaniach na sekundę (QPS).
Wnioski
Filtrowanie wstępne jest prawie zawsze wolniejsze niż pofiltrowaniu, z wyjątkiem małych indeksów, w których wydajność jest w przybliżeniu równa.
W przypadku większych zestawów danych filtrowanie wstępne jest o wielkości wolniejsze.
Dlaczego filtrowanie wstępne jest domyślne, jeśli jest prawie zawsze wolniejsze? Wstępne filtrowanie gwarantuje, że
kwyniki są zwracane, jeśli istnieją w indeksie, gdzie stronniczość sprzyja kompletności i precyzji z szybkością.Użyj filtrowania końcowego, jeśli:
Szybkość wartości w zaznaczeniu (filtrowanie postfiltrujące może zwracać mniej niż
kwyniki).Używaj filtrów, które nie są nadmiernie selektywne.
Mieć indeksy o wystarczających rozmiarach, tak aby wydajność filtrowania wstępnego jest niedopuszczalna.
Szczegóły
Biorąc pod uwagę zestaw danych z 100 000 wektorów o wymiarach 1536:
Podczas filtrowania ponad 30% zestawu danych porównywano filtrowanie wstępne i filtrowanie postfiltrujące.
Podczas filtrowania mniejszego niż 0,1% zestawu danych filtrowanie wstępne było o około 50% wolniejsze niż po filtrowaniu.
Biorąc pod uwagę zestaw danych z 1 milionami wektorów o wymiarach 1536:
Podczas filtrowania ponad 30% zestawu danych wstępne filtrowanie było o około 30% wolniejsze.
Podczas filtrowania mniejszego niż 2% zestawu danych wstępne filtrowanie było około siedmiu razy wolniejsze.
Biorąc pod uwagę zestaw danych z 1 miliardami wektorów o wymiarach 96:
Podczas filtrowania ponad 5% zestawu danych wstępne filtrowanie było o około 50% wolniejsze.
Podczas filtrowania mniejszego niż 10% zestawu danych wstępne filtrowanie było około siedmiu razy wolniejsze.
Na poniższym wykresie przedstawiono wstępne filtrowanie względne QPS obliczone jako wstępne filtrowanie QPS podzielone przez QPS postfilter.
Oś pionowa reprezentuje względną wydajność filtrowania wstępnego w porównaniu do filtrowania postfiltrującego, wyrażonego jako stosunek QPS (zapytania na sekundę). Przykład:
- Wartość
0.0oznacza, że filtrowanie wstępne wynosi 100% wolniej niż po filtrowaniu. - Wartość
0.5oznacza, że filtrowanie wstępne wynosi 50% wolniej. - Wartość
1.0oznacza, że filtrowanie wstępne i filtrowanie po są równoważne.
Oś pozioma reprezentuje współczynnik filtrowania lub procent dokumentów kandydatów po zastosowaniu filtru. Na przykład współczynnik 1.00% oznacza, że kryteria filtrowania wybrały jeden procent korpusu wyszukiwania.