Pencarian vektor adalah teknologi utama untuk pencarian kesamaan yang efisien. Topik ini menunjukkan cara melakukan pencarian vektor dengan cepat menggunakan contoh-contoh terperinci.
Prasyarat
Anda telah menginstal pustaka PyMilvus di klien lokal Anda dan memperbaruinya ke versi terbaru.
Jika belum menginstal pustaka PyMilvus atau perlu memperbaruinya, jalankan perintah berikut.
pip install --upgrade pymilvusAnda telah membuat instans Milvus. Untuk informasi lebih lanjut, lihat Buat Instans Milvus.
Pertimbangan
Vector Retrieval Service for Milvus (Milvus) mendukung koneksi melalui jaringan internal dan Internet. Sebelum terhubung ke instans Milvus, pastikan klien Anda memiliki izin akses jaringan yang diperlukan. Untuk informasi lebih lanjut, lihat Konfigurasi Akses Jaringan.
Prosedur
Langkah 1: Terhubung ke instans Milvus
Gunakan kode berikut untuk terhubung ke instans Milvus.
from pymilvus import MilvusClient
# Buat klien Milvus.
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Titik akhir publik dari instans Milvus.
token="<yourUsername>:<yourPassword>", # Nama pengguna dan kata sandi yang digunakan untuk otentikasi dengan instans Milvus.
db_name="default" # Nama database target. Defaultnya adalah "default".
)
Langkah 2: Buat koleksi
Gunakan kode berikut untuk membuat koleksi. Untuk informasi lebih lanjut tentang parameter kustom, lihat Kelola Koleksi.
client.create_collection(
collection_name="demo", # Nama koleksi.
dimension=5 # Dimensi vektor.
)Kode ini menetapkan nama koleksi dan dimensi vektor serta menerapkan konfigurasi default berikut:
Bidang kunci utama bernama
iddan bidang vektor bernamavector.Properti
metric_typedisetel keCOSINE.Bidang kunci utama
idadalah bilangan bulat non-otomatis bertambah.Bidang tambahan
$metamenyimpan data untuk bidang yang tidak didefinisikan dalam skema sebagai pasangan kunci-nilai.
Langkah 3: Sisipkan data
Setelah koleksi dibuat, sistem secara otomatis memuat koleksi dan indeksnya ke dalam memori. Gunakan kode berikut untuk menyisipkan data uji ke dalam koleksi.
Sisipkan sejumlah kecil data
Kode ini menyisipkan 10 entitas yang telah ditentukan sebelumnya. Setiap entitas memiliki vektor tetap dan label warna.
data=[{'id': 0, 'vector': [-0.493313706583155, -0.172001225836391, 0.16825615330139554, -0.0198911518739604, -0.9756816265213708], 'color': 'green_5760'}, {'id': 1, 'vector': [0.6695699219225086, 0.49952523907354496, -0.49870548178008534, 0.8824655547230731, -0.7182693622931615], 'color': 'blue_2330'}, {'id': 2, 'vector': [-0.6057771959702387, 0.9141473782193543, 0.32053983678483466, -0.32126010092015655, 0.725222856037071], 'color': 'grey_9673'}, {'id': 3, 'vector': [0.14082089434165868, 0.9924029949938447, 0.7943279666144052, -0.7898608705081103, -0.9941425813199956], 'color': 'white_2829'}, {'id': 4, 'vector': [-0.46180540826224026, 0.33216876051895783, 0.5786699695956004, 0.8891120357625131, 0.04872530176990697], 'color': 'pink_9061'}, {'id': 5, 'vector': [-0.6097452740606673, 0.35648319550551144, -0.5699789153006387, 0.15085357921088316, -0.8817226997144627], 'color': 'pink_8525'}, {'id': 6, 'vector': [0.7843522543512762, -0.7663837586858071, -0.8681839054724569, 0.6880645348647785, -0.5151293183261791], 'color': 'green_5016'}, {'id': 7, 'vector': [-0.9967116931989293, 0.5741923070732655, -0.019126124261334976, -0.34163875885482753, -0.8189843931354175], 'color': 'brown_7434'}, {'id': 8, 'vector': [0.7347243385915765, -0.7358853080124825, -0.23737428377511716, 0.06980552357261627, -0.30613964550461437], 'color': 'blue_5059'}, {'id': 9, 'vector': [-0.21187155428455862, -0.3288541717216129, -0.32564136453418824, -0.14054963599686743, 0.5491320339870627], 'color': 'yellow_9887'}]
res = client.insert(
collection_name="demo",
data=data
)
Sisipkan lebih banyak data
Kode ini menggunakan pemahaman daftar untuk menghasilkan beberapa entitas. Vektor dan label warna untuk entitas ini dihasilkan secara acak.
import random
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = [ {
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": f"{random.choice(colors)}_{str(random.randint(1000, 9999))}"
} for i in range(1000) ]
res = client.insert(
collection_name="demo",
data=data[1:]
)
print(res)Langkah 4: Lakukan pencarian vektor
Penyisipan data adalah proses asinkron. Indeks pencarian tidak diperbarui segera setelah Anda menyisipkan data. Untuk menanyakan data terbaru, tunggu beberapa detik agar indeks diperbarui sebelum melakukan pencarian.
Pencarian vektor tunggal
Anda dapat melakukan pencarian kesamaan untuk satu vektor dengan memberikan vektor kueri.
query_vectors = [
[-0.8832567462711804, -0.2999882617491647, 0.9921295273224382, -0.272575369985379, -0.688914679645338]
]
res = client.search(
collection_name="demo", # Koleksi untuk dikueri.
data=query_vectors, # Vektor kueri.
limit=3, # Jumlah entitas yang akan dikembalikan.
)
print(res)
Pencarian vektor batch
Anda dapat melakukan pencarian kesamaan batch dengan memberikan daftar vektor kueri.
query_vectors = [
[0.06586461994037252, 0.7693023529849932, 0.8199991781350795, -0.6988017611187176, 0.408383847889378],
[0.8988257992203861, 0.021911711196309414, 0.19086900086430836, 0.63590610476426, -0.6713237387993141]
]
res = client.search(
collection_name="demo",
data=query_vectors,
limit=3,
)
print(res)Langkah 5: Cari dengan filter
Anda dapat menggunakan bidang yang didefinisikan dalam skema untuk menetapkan kondisi filter. Ini mempersempit ruang lingkup pencarian dan meningkatkan efisiensi pencarian.
Filter berdasarkan bidang numerik
Contoh berikut menunjukkan cara memfilter berdasarkan rentang numerik dari bidang id.
query_vectors = [
[-0.30932351869632435, -0.7132856078639205, 0.6006201320181415, 0.40140510356426784, -0.21223937444001328]
]
res = client.search(
collection_name="demo",
data=query_vectors,
filter="3 < id < 5", # Filter untuk ID dalam rentang (3, 5).
limit=3
)
print(res)
Filter berdasarkan bidang metadata ($meta)
Contoh berikut menunjukkan cara mencari catatan di mana properti color dimulai dengan "green". Contoh ini juga menentukan bahwa bidang color disertakan dalam keluaran.
query_vectors = [
[0.9636568288732006, -0.5900490884830603, 0.2504591754023724, 0.7120903924474389, 0.7620604497390009]
]
res = client.search(
collection_name="demo",
data=query_vectors,
filter='$meta["color"] like "green%"', # Filter untuk catatan di mana metadata 'color' dimulai dengan "green".
limit=3,
output_fields=["color"] # Menentukan bidang mana yang akan dikembalikan dalam keluaran.
)
print(res)