Wyszukiwanie podobieństw wektorowych

Ten temat przedstawia, jak wykonać wyszukiwanie encji w Milvus.

Wyszukiwanie podobieństw wektorowych w Milvus oblicza odległość między wektorem zapytania a wektorami w kolekcji i zwraca najbardziej podobne wyniki. Można również wykonać wyszukiwanie mieszane, określając wyrażenie logiczne do filtrowania pól skalarnych lub pól kluczy głównych.

Poniższy przykład demonstruje, jak wykonać wyszukiwanie podobieństw wektorowych w zbiorze danych składającym się z 2000 wierszy, składających się z identyfikatorów książek (klucz główny), częstotliwości słów (pole skalarnego) i opisów książek (pole wektorowe). Symuluje to scenariusz wyszukiwania określonych książek na podstawie zwektoryzowanych opisów. Milvus zwróci najbardziej podobne wyniki na podstawie zdefiniowanego wektora zapytania i parametrów wyszukiwania.

Załaduj kolekcję

Przed wykonaniem wyszukiwania podobieństw wektorowych Milvus wykonuje wszystkie operacje wyszukiwania i zapytania w pamięci. Proszę załaduj kolekcję do pamięci przed wykonaniem wyszukiwania podobieństw wektorowych.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("nie udało się załadować kolekcji:", err.Error())
}

Przygotuj parametry wyszukiwania

Przygotuj parametry odpowiednie dla swojego scenariusza wyszukiwania. W poniższym przykładzie definiujemy użycie odległości euklidesowej do obliczenia odległości i pobierania wektorów z dziesięciu najbliższych klastrów zbudowanych przez indeks IVF_FLAT.

sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
    10,                                  // searchParam
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
Parametr Opis Opcje
NewIndex*SearchParam func Funkcja tworząca entity.SearchParam na podstawie różnych typów indeksów. Dla wektorów zmiennoprzecinkowych: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Dla wektorów binarnych: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp Parametry wyszukiwania specyficzne dla indeksu zwracane przez poprzednią funkcję. Zobacz Indeks Wektorowy w celu uzyskania szczegółów.
opt Opcje wyszukiwania ANN. - Limit: Określa liczbę zwracanych encji. - Offset: Określa liczbę pomijanych encji podczas wyszukiwania. Suma tego parametru i Limit powinna być mniejsza niż 16384. Na przykład, jeśli chcesz zapytać o 9. i 10. najbliższych sąsiadów wektora, ustaw Limit na 2 i Offset na 8. - ConsistencyLevel: Określa poziom spójności stosowany podczas wyszukiwania. - Ignoruj rosnące: Wskazuje, czy ignorować rosnące segmenty w wyszukiwaniu podobieństw. Domyślna wartość to False, co oznacza, że wyszukiwanie obejmuje rosnące segmenty.

Wykonaj wyszukiwanie wektorowe

Aby wykonać wyszukiwanie wektorowe przy użyciu Milvus, określ listę nazw partycji w celu wyszukiwania w określonej partycji.

Milvus obsługuje ustawianie poziomu spójności wyszukiwania. W tym przykładzie poziom spójności ustawiony jest na Strong. Możesz także 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 Rozdział o Spójności.

wynikWyszukiwania, błąd := milvusClient.Search(
    context.Background(),                    // ctx
    "book",                                  // NazwaKolekcji
    []string{},                              // ListaNazwPartycji
    "",                                      // wyrażenie
    []string{"book_id"},                     // PolaWyjściowe
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // wektory
    "book_intro",                            // PoleWektora
    entity.L2,                               // TypMetryki
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if błąd != nil {
    log.Fatal("Nie udało się wyszukać kolekcji:", błąd.Error())
}
Parametr Opis Opcje
ctx Kontekst używany do kontrolowania procesu wywołania API Brak
NazwaKolekcji Nazwa kolekcji do załadowania Brak
ListaNazwPartycji Lista nazw partycji do załadowania. Jeśli pusta, wyszukuje we wszystkich partycjach Brak
wyrażenie Wyrażenie logiczne służące do filtrowania właściwości Zobacz zasady dotyczące wyrażeń logicznych dla szczegółowych informacji
pola_wyjściowe Nazwy pól do zwrócenia Brak
wektory Wektory do wyszukania Brak
PoleWektora Nazwa pola do wyszukania Brak
TypMetryki Typ metryki używany do wyszukiwania Ten parametr musi być taki sam jak typ metryki użyty do zbudowania indeksu
topK Liczba wyników do zwrócenia. Suma tej wartości i offset w opts powinna być mniejsza niż 16384 Brak
sp entity.SearchParam specyficzny dla indeksu Brak

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

fmt.Printf("%#v\n", wynikWyszukiwania)
for _, wr := range wynikWyszukiwania {
    fmt.Println(wr.IDs)
    fmt.Println(wr.Scores)
}

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

błąd := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // NazwaKolekcji
)
if błąd != nil {
    log.Fatal("Nie udało się zwolnić kolekcji:", błąd.Error())
}

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
Wymiarowość wektorów 32 768
Top K 16 384
Liczba wektorów wejściowych 16 384

Wykonywanie Wyszukiwania Mieszane

Wyszukiwanie mieszane to w zasadzie wyszukiwanie wektorowe z filtrowaniem atrybutów. Poprzez określenie wyrażenia logicznego do filtrowania pól skalarnych lub pól klucza głównego można ograniczyć wyszukiwanie na podstawie określonych warunków.

Poniższy przykład pokazuje, jak wykonać wyszukiwanie mieszane na podstawie zwykłego wyszukiwania wektorowego. Załóżmy, że chcesz wyszukać określone książki na podstawie zwektoryzowanego wstępu do książki, ale chcesz odbierać tylko książki w określonym zakresie liczby słów. Możesz wtedy filtrować pole word_count, określając wyrażenie logiczne w parametrach wyszukiwania. Milvus będzie wyszukiwać tylko podobne wektory w jednostkach, które spełniają określone wyrażenie.

sp, _ := entity.NewIndexFlatSearchParam(
  10,
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

searchResult, err := milvusClient.Search(
  context.Background(),
  "book",
  []string{},
  "word_count <= 11000",
  []string{"book_id"},
  []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
  "book_intro",
  entity.L2,
  2,
  sp,
  opt,
)

if err != nil {
  log.Fatal("Nie udało się wyszukać kolekcji:", err.Error())
}

Sprawdź zwrócone wyniki.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}