Wykonywanie wyszukiwania podobieństwa wektorów

Ten temat przedstawia, jak korzystać z Milvus do wyszukiwania jednostek.

W Milvus wyszukiwanie podobieństwa wektorów oblicza odległość między wektorem zapytania a wektorami w kolekcji (z użyciem określonej miary podobieństwa) i zwraca najbardziej podobne wyniki. Możesz wykonać mieszane wyszukiwanie, określając wyrażenie logiczne do filtrowania pól skalarowych lub klucza głównego.

Poniższy przykład demonstruje, jak wykonać wyszukiwanie podobieństwa wektorów w zestawie danych zawierającym 2000 wierszy danych, w tym identyfikator książki (klucz główny), liczbę słów (pole skalarne) i streszczenie książki (pole wektorowe), aby zasymulować wyszukiwanie określonych książek na podstawie zwektoryzowanych opisów. Milvus zwróci najbardziej podobne wyniki na podstawie wektora zapytania i zdefiniowanych przez Ciebie parametrów wyszukiwania.

Ładowanie Kolekcji

Wszystkie operacje wyszukiwania i zapytań w Milvus są wykonywane w pamięci. Przed przeprowadzeniem wyszukiwania podobieństwa wektorów, należy załadować kolekcję do pamięci.

from pymilvus import Collection
collection = Collection("book")      # Pobierz istniejącą kolekcję.
collection.load()

Przygotowanie Parametrów Wyszukiwania

Przygotuj odpowiednie parametry dla twojego scenariusza wyszukiwania. W poniższym przykładzie zdefiniowane są parametry, które wyszukiwanie będzie używać do obliczania odległości z wykorzystaniem odległości euklidesowej i pobierania wektorów z dziesięciu najbliższych klastrów zbudowanych przez indeks IVF_FLAT.

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
Parametr Opis
metric_type Metoda używana do pomiaru odległości między wektorami podczas wyszukiwania. Powinna być taka sama jak metoda określona podczas procesu budowania indeksu. Patrz na miary podobieństwa dla dalszych informacji.
offset Liczba jednostek do pominięcia podczas wyszukiwania. Suma tej wartości i limit metody search powinna być mniejsza niż 16384. Na przykład, jeśli chcesz zapytać o 9 i 10 najbliższych sąsiadów wektora zapytania, ustaw limit na 2 i offset na 8.
ignore_growing Czy ignorować rosnące segmenty podczas wyszukiwania podobieństwa. Wartość domyślna to False, co oznacza, że wyszukiwanie obejmuje rosnące segmenty.
params Parametry wyszukiwania specyficzne dla określonego typu indeksu. Patrz na indeks wektorów dla dalszych informacji. Możliwe opcje to: - nprobe oznacza liczbę jednostek klastrów do wyszukiwania. Parametr ten jest dostępny tylko przy ustawianiu index_type na IVF_FLAT, IVF_SQ8 lub IVF_PQ. Wartość powinna być mniejsza niż wartość nlist określona podczas budowania indeksu. - ef oznacza zakres wyszukiwania. Parametr ten jest dostępny tylko przy ustawianiu index_type na HNSW. Wartość powinna być między top_k a 32768. - radius oznacza kąt, w którym znajdują się wektory o najmniejszym podobieństwie. - range_filter oznacza filtr używany do filtrowania wartości pól wektorowych, których podobieństwo do wektora zapytania mieści się w określonym zakresie.

Wykonywanie wyszukiwania wektorowego

Wykorzystaj Milvus do wyszukiwania wektorowego. Aby przeprowadzić wyszukiwanie w określonej partycji, określ listę nazw partycji.

Milvus obsługuje ustawianie poziomu spójności dla wyszukiwań. W przykładzie w tym temacie poziom spójności jest ustawiony na "Strong". Możesz również ustawić poziom spójności na "Bounded", "Session" lub "Eventually". Aby uzyskać więcej informacji na temat czterech poziomów spójności w Milvus, zobacz Spójność.

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="Strong"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
Parametr Opis
data Wektory używane do wyszukiwania.
anns_field Nazwa pola, które ma zostać wyszukane.
param Parametry wyszukiwania specyficzne dla indeksu. Aby uzyskać więcej informacji, zobacz Wskaźnik wektorów.
limit Liczba wyników do zwrócenia. Wartość ta, plus offset w param, powinna być mniejsza niż 16 384.
expr Wyrażenie logiczne do filtrowania właściwości. Aby uzyskać więcej informacji, zobacz Zasady wyrażeń logicznych.
output_fields (opcjonalne) Nazwy pól do zwrócenia. Pola wektorowe nie są obecnie obsługiwane.
consistency_level (opcjonalne) Poziom spójności dla wyszukiwania.

Sprawdź wartości kluczy głównych i odległości najbardziej podobnych wektorów.

results[0].ids
results[0].distances

Po zakończeniu wyszukiwania zwolnij załadowaną kolekcję w Milvus, aby zmniejszyć zużycie pamięci.

collection.release()

Ograniczenia

Funkcja Maksymalne ograniczenie
Długość nazwy kolekcji 255 znaków
Liczba partycji w kolekcji 4,096
Liczba pól w kolekcji 256
Liczba fragmentów w kolekcji 256
Wymiar wektora 32,768
Top K 16,384
Wektory wejściowe 16,384

Wykonywanie mieszanych wyszukiwań

Mieszane wyszukiwanie jest w zasadzie wyszukiwaniem wektorowym z filtrowaniem atrybutów. Poprzez określenie wyrażenia logicznego do filtrowania pól skalarnych lub pól klucza głównego, wyszukiwania można ograniczyć w określonych warunkach.

Poniższy przykład pokazuje, jak wykonać mieszane wyszukiwanie na podstawie zwykłego wyszukiwania wektorowego. Załóżmy, że chcesz wyszukać określone książki na podstawie wektorowych streszczeń, ale chcesz wyszukać tylko w określonym zakresie liczby słów. Następnie możesz określić wyrażenie logiczne w parametrach wyszukiwania, aby przefiltrować pole word_count. Milvus będzie wyszukiwać tylko podobne wektory w ramach jednostek, które pasują do wyrażenia.

Poprzez określenie wyrażenia logicznego możesz filtrować pola skalarnych jednostek podczas wyszukiwania wektorowego. W poniższym przykładzie ograniczono zakres wyszukiwania do wektorów w określonym zakresie wartości word_count.

Możesz również wykorzystywać pola dynamiczne w wyrażeniu filtrowania i wykorzystywać pola wyjściowe w żądaniu wyszukiwania. Na przykład odwołaj się do wzorca dynamicznego.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

Sprawdź zwrócone wyniki.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Łączna ilość trafień: {len(hits)}, identyfikatory trafień: {hits.ids} ")
print(f"- Identyfikator najwyższego trafienia: {hits[0].id}, odległość: {hits[0].distance}, wynik: {hits[0].score} ")

Wykonywanie wyszukiwania zakresowego

Wyszukiwanie zakresowe to metoda filtrowania wyników wyszukiwania na podstawie odległości pomiędzy wektorem zapytania a wartościami pola wektorowego. Różne metryki odległości mogą być używane do pomiaru odległości.

Podczas wykonywania wyszukiwania zakresowego Milvus najpierw przeprowadza podobieństwo wektorowe, a następnie wykonuje filtrowanie wektorów na podstawie określonych warunków odległości i zwraca wektory, których odległość mieści się w określonym zakresie.

Poniższy przykład pokazuje, jak wykonać wyszukiwanie zakresowe na podstawie zwykłego wyszukiwania wektorowego.

Ładowanie kolekcji

Wszystkie operacje wyszukiwania i zapytań w Milvus są wykonywane w pamięci. Przed przeprowadzeniem podobieństwa wektorowego kolekcja musi zostać załadowana do pamięci.

from pymilvus import Collection
collection = Collection("book")      # Pobierz istniejącą kolekcję
collection.load()

Konfigurowanie zakresów filtracji wektorów

W porównaniu do zwykłego wyszukiwania wektorów, wyszukiwanie zakresowe w Milvus jest kontrolowane poprzez wprowadzenie dwóch nowych parametrów, promień i filtr_zakresu, w celu uzyskania pożądanych wyników wyszukiwania w określonym zakresie wyszukiwania.

Parametr promień określa minimalny kąt, pod którym wektory są uważane za podobne. Opcjonalny parametr filtr_zakresu może być wykorzystany w połączeniu z parametrem promień do filtrowania wartości pola wektorowego w oparciu o podobieństwo do wektora zapytania w określonym zakresie. Zarówno parametry promień jak i filtr_zakresu mają typ danych FLOAT. Ustawienie tych dwóch parametrów efektywnie zrównoważa dokładność i wydajność wyszukiwania.

Zazwyczaj podobieństwo jest mierzone przez odległość między wartością pola wektorowego a wektorem zapytania. Wybór różnych metryk odległości będzie miał znaczący wpływ na konfigurację parametrów promień i filtr_zakresu.

Na przykład, w przypadku odległości L2, wyniki wyszukiwania muszą być filtrowane na podstawie wartości pola wektorowego z odległością mniejszą niż promień. Dzieje się tak, ponieważ w odległości L2 mniejsze odległości oznaczają większe podobieństwo. Mając tę wiedzę, jeśli chcesz odfiltrować niektóre z najbardziej podobnych wektorów, możesz określić efektywną wartość filtr_zakresu mniejszą niż promień.

search_params = {
    "metric_type": "L2",
    "params": {
        "promień": 10.0,
        "filtr_zakresu" : 5.0
    }
}

W przypadku odległości IP, sytuacja jest inna. W przypadku odległości IP, większa odległość oznacza większe podobieństwo. Dlatego w przeciwieństwie do odległości L2, wartości promień i filtr_zakresu w odległości IP są odwrotne. Innymi słowy, podczas korzystania z filtr_zakresu do filtrowania niektórych z najbardziej podobnych wektorów na podstawie odległości IP, efektywna wartość filtr_zakresu musi być większa niż promień, a odległość otrzymanych wektorów powinna być większa niż promień, ale mniejsza lub równa filtr_zakresu.

search_params = {
    "metric_type": "IP",
    "params": {
        "promień": 0.8,
        "filtr_zakresu" : 1.0
    }
}

Wykonywanie wyszukiwania zakresowego

Poprzez określenie promienia i filtru_zakresu w oparciu o typ pomiaru odległości, możesz zdefiniować zakres zwracanych wektorów wynikowych.

Wykonaj wyszukiwanie zakresowe pod kątem podobieństwa w zakresie od 5.0 do 10.0 na podstawie odległości L2:

search_param = {
  "data": [[0.1, 0.2]], # Wektor zapytania
  "anns_field": "book_intro", # Pole do wyszukiwania
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "promień": 10.0, "filtr_zakresu" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Pola do zwrócenia
}

res = collection.search(**search_param)

Wykonaj wyszukiwanie zakresowe pod kątem podobieństwa w zakresie od 1.0 do 0.8 na podstawie odległości IP:

search_param = {
  "data": [[0.1, 0.2]], # Wektor zapytania
  "anns_field": "book_intro", # Pole do wyszukiwania
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "promień": 0.8, "filtr_zakresu" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Pola do zwrócenia
}

res = collection.search(**search_param)

Podsumowanie

W Milvusie, wyszukiwanie zakresowe może zwracać wyniki wektorów podobnych w określonym zakresie odległości. Ta funkcjonalność jest aktywowana poprzez określenie promienia i filtr_zakresu w parametrach wyszukiwania. Tabela poniżej podsumowuje konfigurację tych dwóch parametrów dla różnych typów pomiarów odległości.

Typ pomiaru odległości Konfiguracja
L2 i inne odległości filtr_zakresu <= odległość < promień
Odległość IP i kosinusowa promień < odległość <= filtr_zakresu