Melakukan Pencarian Kemiripan Vektor

Tema ini memperkenalkan cara menggunakan Milvus untuk mencari entitas.

Dalam Milvus, pencarian kemiripan vektor menghitung jarak antara vektor kueri dan vektor dalam koleksi (menggunakan ukuran kemiripan yang ditentukan) dan mengembalikan hasil paling mirip. Anda dapat melakukan pencarian campuran dengan menentukan ekspressi boolean untuk menyaring bidang skalar atau kunci utama.

Contoh berikut ini menunjukkan bagaimana melakukan pencarian kemiripan vektor pada kumpulan data yang berisi 2000 baris data, termasuk ID buku (kunci utama), jumlah kata (bidang skalar), dan sinopsis buku (bidang vektor), untuk mensimulasikan pencarian buku tertentu berdasarkan deskripsi vektor mereka. Milvus akan mengembalikan hasil paling mirip berdasarkan vektor kueri dan parameter pencarian yang Anda tentukan.

Memuat Koleksi

Semua operasi pencarian dan kueri dalam Milvus dilakukan di memori. Sebelum melakukan pencarian kemiripan vektor, muat koleksi ke dalam memori.

from pymilvus import Collection
collection = Collection("book")      # Dapatkan koleksi yang ada.
collection.load()

Menyiapkan Parameter Pencarian

Siapkan parameter-parameter yang sesuai untuk skenario pencarian Anda. Contoh berikut ini mendefinisikan parameter-parameter yang akan digunakan pencarian untuk menghitung jarak menggunakan jarak Euclidean dan mengambil vektor dari sepuluh cluster terdekat yang dibangun oleh indeks IVF_FLAT.

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
Parameter Deskripsi
metric_type Metode yang digunakan untuk mengukur jarak antara vektor selama pencarian. Harus sama dengan metode yang ditentukan selama proses pembangunan indeks. Lihat ukuran kemiripan untuk informasi lebih lanjut.
offset Jumlah entitas yang dilewati selama pencarian. Jumlah dari nilai ini dan limit dari metode search harus kurang dari 16384. Misalnya, jika Anda ingin menanyakan tetangga terdekat ke-9 dan ke-10 dari vektor kueri, aturlah limit menjadi 2 dan offset menjadi 8.
ignore_growing Apakah untuk mengabaikan segmen yang berkembang selama pencarian kemiripan. Nilai defaultnya adalah False, menunjukkan bahwa pencarian termasuk segmen yang berkembang.
params Parameter pencarian khusus untuk jenis indeks yang ditentukan. Lihat indeks vektor untuk informasi lebih lanjut. Opsi yang mungkin meliputi: - nprobe menunjukkan jumlah unit pengelompokan yang akan dicari. Parameter ini hanya tersedia saat mengatur index_type menjadi IVF_FLAT, IVF_SQ8, atau IVF_PQ. Nilainya harus kurang dari nilai nlist yang ditentukan selama proses pembangunan indeks. - ef menunjukkan rentang pencarian. Parameter ini hanya tersedia saat mengatur index_type menjadi HNSW. Nilainya harus antara top_k dan 32768. - radius menunjukkan sudut di mana vektor dengan kemiripan terendah terletak. - range_filter menunjukkan filter yang digunakan untuk menyaring nilai bidang vektor yang kemiripannya dengan vektor kueri berada dalam rentang tertentu.

Melakukan Pencarian Vektor

Gunakan Milvus untuk pencarian vektor. Untuk melakukan pencarian di dalam partisi tertentu, tentukan daftar nama partisi.

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

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')
Parameter Deskripsi
data Vektor yang digunakan untuk pencarian.
anns_field Nama bidang yang akan dicari.
param Parameter pencarian spesifik untuk indeks. Untuk informasi lebih lanjut, lihat Indeks Vektor.
limit Jumlah hasil yang akan dikembalikan. Nilai ini, ditambah offset di param, sebaiknya kurang dari 16.384.
expr Ekspresi boolean untuk penyaringan properti. Untuk informasi lebih lanjut, lihat Aturan Ekspresi Boolean.
output_fields (opsional) Nama-nama bidang yang akan dikembalikan. Bidang vektor saat ini tidak didukung.
consistency_level (opsional) Tingkat konsistensi untuk pencarian.

Periksa nilai kunci utama dan jarak vektor paling mirip.

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

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

collection.release()

Batasan

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

Melakukan Pencarian Campuran (Mixed Search)

Pencarian campuran pada dasarnya adalah pencarian vektor dengan penyaringan atribut. Dengan menentukan ekspresi boolean yang digunakan untuk menyaring bidang skalarnya atau bidang kunci primer, pencarian dapat dibatasi dalam kondisi tertentu.

Contoh berikut menjelaskan bagaimana melakukan pencarian campuran berdasarkan pencarian vektor biasa. Misalkan Anda ingin mencari buku tertentu berdasarkan ringkasan vektorisasi, tetapi Anda hanya ingin mencari di dalam rentang jumlah kata tertentu. Maka, Anda dapat menentukan ekspresi boolean dalam parameter pencarian untuk menyaring bidang word_count. Milvus hanya akan mencari vektor mirip dalam entitas yang cocok dengan ekspresi tersebut.

Dengan menentukan ekspresi boolean, Anda dapat menyaring bidang skalarnya dari entitas saat melakukan pencarian vektor. Contoh berikut membatasi cakupan pencarian menjadi vektor dalam rentang nilai word_count yang ditentukan.

Anda juga dapat menggunakan bidang dinamis dalam ekspresi penyaringan dan menggunakan bidang keluaran dalam permintaan pencarian. Misalnya, lihat pola dinamis.

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)

Periksa hasil yang dikembalikan.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Total hasil: {len(hits)}, id hasil: {hits.ids} ")
print(f"- ID teratas: {hits[0].id}, jarak: {hits[0].distance}, skor: {hits[0].score} ")

Melakukan Pencarian Rentang (Range Search)

Pencarian rentang adalah metode penyaringan hasil pencarian berdasarkan jarak antara vektor query dan nilai bidang vektor. Berbagai metrik jarak dapat digunakan untuk mengukur jarak.

Saat melakukan pencarian rentang, Milvus pertama-tama melakukan pencarian kesamaan vektor. Kemudian, ia menjalankan penyaringan vektor berdasarkan kondisi jarak yang ditentukan dan mengembalikan vektor yang jaraknya berada dalam rentang tertentu.

Contoh berikut menjelaskan bagaimana melakukan pencarian rentang berdasarkan pencarian vektor biasa.

Memuat Koleksi

Semua operasi pencarian dan kueri di Milvus dijalankan di memori. Sebelum melakukan pencarian kesamaan vektor, koleksi perlu dimuat ke dalam memori.

from pymilvus import Collection
collection = Collection("book")      # Dapatkan koleksi yang ada
collection.load()

Mengkonfigurasi Rentang Filter Vektor

Dibandingkan dengan pencarian vektor reguler, pencarian rentang di Milvus dikendalikan dengan memperkenalkan dua parameter baru, radius dan range_filter, untuk mendapatkan hasil pencarian yang diinginkan dalam rentang pencarian tertentu.

Radius menentukan sudut minimum di mana vektor dianggap mirip. Sebuah parameter opsional range_filter dapat digunakan bersama dengan radius untuk menyaring nilai lapangan vektor berdasarkan kemiripan dengan vektor query dalam rentang tertentu. Baik parameter radius maupun range_filter memiliki tipe data FLOAT. Mengatur kedua parameter ini secara efektif menyeimbangkan akurasi dan efisiensi pencarian.

Umumnya, kesamaan diukur dari jarak antara nilai lapangan vektor dan vektor query. Pemilihan metrik jarak yang berbeda akan memiliki dampak signifikan pada konfigurasi radius dan range_filter.

Misalnya, dalam kasus jarak L2, hasil pencarian harus disaring berdasarkan nilai lapangan vektor dengan jarak kurang dari radius. Hal ini karena dalam jarak L2, jarak yang lebih kecil menunjukkan kemiripan yang lebih besar. Dengan pengetahuan ini, jika ingin menyaring beberapa vektor yang paling mirip, Anda dapat menentukan nilai range_filter yang efektif yang kurang dari radius.

search_params = {
    "metric_type": "L2",
    "params": {
        "radius": 10.0,
        "range_filter" : 5.0
    }
}

Dalam kasus jarak IP, skenarionya berbeda. Dengan jarak IP, jarak yang lebih besar menandakan kemiripan yang lebih besar. Oleh karena itu, berlawanan dengan jarak L2, nilai radius dan range_filter dalam jarak IP adalah kebalikannya. Dengan kata lain, ketika menggunakan range_filter untuk menyaring beberapa vektor yang paling mirip berdasarkan jarak IP, nilai range_filter yang efektif harus lebih besar dari radius, dan jarak vektor yang dihasilkan harus lebih besar dari radius namun kurang dari atau sama dengan range_filter.

search_params = {
    "metric_type": "IP",
    "params": {
        "radius": 0.8,
        "range_filter" : 1.0
    }
}

Melakukan Pencarian Rentang

Dengan menentukan radius dan range_filter berdasarkan jenis pengukuran jarak, Anda dapat mendefinisikan rentang vektor hasil yang akan dikembalikan.

Lakukan pencarian rentang atas kemiripan dalam rentang 5.0 dan 10.0 berdasarkan jarak L2:

search_param = {
  "data": [[0.1, 0.2]], # Vektor query
  "anns_field": "book_intro", # Lapangan yang akan dicari
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Lapangan yang akan dikembalikan
}

res = collection.search(**search_param)

Lakukan pencarian rentang atas kemiripan dalam rentang 1.0 dan 0.8 berdasarkan jarak IP:

search_param = {
  "data": [[0.1, 0.2]], # Vektor query
  "anns_field": "book_intro", # Lapangan yang akan dicari
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Lapangan yang akan dikembalikan
}

res = collection.search(**search_param)

Ringkasan

Dalam Milvus, pencarian rentang dapat mengembalikan hasil vektor yang mirip dalam rentang jarak yang ditentukan. Fungsi ini diaktifkan dengan menentukan radius dan range_filter dalam parameter pencarian. Tabel di bawah ini merangkum konfigurasi kedua parameter ini untuk berbagai jenis pengukuran jarak.

Tipe Pengukuran Jarak Konfigurasi
Jarak L2 dan jarak lainnya range_filter <= jarak < radius
Jarak IP dan jarak kosinus radius < jarak <= range_filter