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 |