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 |