Pencarian Kemiripan Vektor

Pada topik ini, dijelaskan bagaimana melakukan pencarian entitas dalam Milvus.

Pencarian kemiripan vektor di Milvus menghitung jarak antara vektor kueri dan vektor dalam koleksi, dan mengembalikan hasil yang paling mirip. Anda juga dapat melakukan pencarian campuran dengan menentukan ekspresi boolean untuk menyaring bidang skalar atau bidang kunci utama.

Contoh berikut ini menggambarkan bagaimana melakukan pencarian kemiripan vektor pada dataset 2000 baris, yang terdiri dari ID buku (kunci utama), frekuensi kata (bidang skalar), dan deskripsi buku (bidang vektor). Ini mensimulasikan skenario pencarian buku tertentu berdasarkan deskripsi yang divetorisasi. Milvus akan mengembalikan hasil yang paling mirip berdasarkan vektor kueri yang Anda tentukan dan parameter pencarian.

Memuat Koleksi

Sebelum melakukan pencarian kemiripan vektor, Milvus melakukan semua operasi pencarian dan kueri di memori. Harap muat koleksi ke memori sebelum melakukan pencarian kemiripan vektor.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("gagal memuat koleksi:", err.Error())
}

Menyiapkan Parameter Pencarian

Siapkan parameter yang sesuai untuk skenario pencarian Anda. Contoh berikut ini mendefinisikan penggunaan jarak Euclidean untuk menghitung jarak dan mengambil vektor dari sepuluh klaster terdekat yang dibangun oleh indeks IVF_FLAT.

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

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
Parameter Deskripsi Opsi
Fungsi NewIndex*SearchParam Fungsi untuk membuat entity.SearchParam berdasarkan berbagai jenis indeks. Untuk Vektor Float: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Untuk Vektor Biner: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp Parameter pencarian spesifik indeks yang dikembalikan oleh fungsi sebelumnya. Lihat Indeks Vektor untuk detailnya.
opt Opsi pencarian ANN. - Limit: Tentukan jumlah entitas yang akan dikembalikan. - Offset: Tentukan jumlah entitas yang akan dilewati selama pencarian. Jumlah parameter ini dan Limit harus kurang dari 16384. Misalnya, jika Anda ingin query ke-9 dan ke-10 tetangga terdekat dari vektor, atur Limit menjadi 2 dan Offset menjadi 8. - ConsistencyLevel: Tentukan tingkat konsistensi yang diterapkan selama pencarian. - Ignore Growing: Menunjukkan apakah akan mengabaikan segmen pertumbuhan dalam pencarian kemiripan. Nilai defaultnya adalah False, menunjukkan bahwa pencarian melibatkan segmen pertumbuhan.

Melakukan Pencarian Vektor

Melakukan pencarian vektor menggunakan Milvus. Untuk mencari dalam partisi tertentu, harap tentukan daftar nama partisi.

Milvus mendukung pengaturan tingkat konsistensi untuk pencarian. Contoh dalam topik ini mengatur tingkat konsistensi ke Kuat. Anda juga dapat mengatur tingkat konsistensi ke Terbatas, Sesi, atau Akhirnya. Untuk informasi lebih lanjut tentang empat tingkat konsistensi dalam Milvus, lihat Konsistensi.

hasilPencarian, err := milvusClient.Search(
    context.Background(),                    // ctx
    "book",                                  // CollectionName
    []string{},                              // partitionNames
    "",                                      // expr
    []string{"book_id"},                     // outputFields
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
    "book_intro",                            // vectorField
    entity.L2,                               // metricType
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if err != nil {
    log.Fatal("Gagal melakukan pencarian koleksi:", err.Error())
}
Parameter Deskripsi Opsi
ctx Konteks yang digunakan untuk mengontrol proses panggilan API TDK
CollectionName Nama koleksi yang akan dimuat TDK
partitionNames Daftar nama partisi yang akan dimuat. Jika kosong, cari semua partisi TDK
expr Ekspresi boolean untuk penyaringan properti Lihat Aturan Ekspresi Boolean untuk informasi lebih detail
output_fields Nama-nama bidang yang akan dikembalikan TDK
vectors Vektor yang akan dicari TDK
vectorField Nama bidang yang akan dicari TDK
metricType Jenis metrik yang digunakan untuk pencarian Parameter ini harus sama dengan jenis metrik yang digunakan untuk membangun indeks
topK Jumlah hasil yang akan dikembalikan. Jumlah nilai ini dan offset dalam opts harus kurang dari 16.384 TDK
sp entity.SearchParam khusus untuk indeks TDK

Periksa nilai kunci utama dan jarak vektor yang paling mirip.

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

Setelah pencarian selesai, lepaskan koleksi yang dimuat di Milvus untuk mengurangi konsumsi memori.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("Gagal melepaskan koleksi:", err.Error())
}

Batasan

Fitur Batas Maksimum
Panjang nama koleksi 255 karakter
Jumlah partisi dalam sebuah koleksi 4.096
Jumlah bidang dalam sebuah koleksi 256
Jumlah shard dalam sebuah koleksi 256
Dimensi vektor 32.768
Top K 16.384
Jumlah vektor input target 16.384

Melakukan Pencarian Campuran

Pencarian campuran pada dasarnya adalah pencarian vektor dengan penyaringan atribut. Dengan menentukan ekspresi boolean untuk menyaring bidang skalar atau bidang kunci primer, Anda dapat membatasi pencarian berdasarkan kondisi-kondisi tertentu.

Contoh berikut menunjukkan bagaimana melakukan pencarian campuran berdasarkan pencarian vektor biasa. Misalkan Anda ingin mencari buku-buku tertentu berdasarkan pengenalan tervektorisasi dari buku-buku tersebut, tetapi hanya ingin mengambil buku-buku dalam rentang jumlah kata tertentu. Anda kemudian dapat menyaring bidang word_count dengan menentukan ekspresi boolean dalam parameter pencarian. Milvus hanya akan mencari vektor yang mirip dalam entitas yang cocok dengan ekspresi tersebut.

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

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

hasilPencarian, 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("Gagal melakukan pencarian koleksi:", err.Error())
}

Periksa hasil yang dikembalikan.

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