Topik ini menjelaskan solusi pencarian hibrida berbasis TairVector yang menggabungkan penyaringan kondisional, pencarian vektor, dan pencarian teks penuh.
Informasi latar belakang
Model bahasa besar (LLM) memungkinkan representasi semantik data tidak terstruktur seperti teks, citra, audio, dan video dalam bentuk vektor. Pencarian k-tetangga terdekat (kNN) berbasis vektor diprediksi akan memainkan peran utama dalam bidang-bidang seperti pencarian semantik, rekomendasi produk personalisasi, dan tanya jawab cerdas. Umumnya, sebagian besar layanan database vektor mendukung kombinasi satu atau dua dari metode pencarian berikut: penyaringan kondisional, pencarian teks penuh, dan pencarian vektor. Masing-masing metode memiliki kelebihan dan kekurangan yang jelas.
Penyaringan kondisional: menyaring data menggunakan ekspresi Boolean dan memberlakukan batasan ketat pada set data serta penggunaannya, sehingga hanya cocok untuk skenario tertentu.
Pencarian teks penuh: Menghitung relevansi dokumen dengan memecah kueri menjadi token dan mengembalikan daftar hasil yang paling relevan dengan kueri. Metode ini terbatas pada kueri berbasis teks yang rentan terhadap kesalahan input dan masalah tata bahasa.
Pencarian vektor: Melakukan pengkodean semantik, menghitung kesamaan antar vektor, dan mengembalikan daftar hasil yang paling mirip. Metode ini dapat menangani berbagai jenis data tak terstruktur seperti dokumen, gambar, audio, dan video dalam berbagai skenario. Namun, metode ini sangat bergantung pada LLMs dan mungkin mengembalikan hasil yang tidak akurat saat memproses data spesifik perusahaan.
Dengan TairVector, Anda dapat menggabungkan ketiga metode pencarian tersebut dalam satu pernyataan kueri. Dalam satu pernyataan tersebut, Anda dapat menggunakan citra, teks, audio, dan video untuk implementasi pencarian vektor; menggunakan teks untuk pencarian teks penuh; serta menggunakan ekspresi Boolean untuk penyaringan kondisional. Selain itu, TairVector mengurutkan hasil dari berbagai metode tersebut berdasarkan bobot yang ditentukan dan mengembalikan daftar kandidat akhir.
Dengan cara ini, Anda dapat melampaui batasan metode pencarian tunggal untuk meningkatkan tingkat keberhasilan pengambilan data. Secara khusus, Anda dapat menggunakan parameter hybrid_ratio untuk menyesuaikan bobot metode pencarian sesuai permintaan. Untuk informasi lebih lanjut, lihat Vektor.
Ikhtisar solusi
Dalam contoh ini, dataset open source fashion-product-images-small digunakan untuk menunjukkan kinerja solusi yang berbeda.
Saat menggunakan dataset open source, Anda harus mematuhi perjanjian, undang-undang, dan peraturan terkait.
Deskripsi data
Dataset ini berisi 44.000 entri data produk. Tabel berikut menjelaskan format data.
id (int64) | gender (string) | masterCategory (string) | subCategory (string) | articleType (string) | baseColour (string) | season (string) | year (float64) | Penggunaan (string) | productDisplayName (string) | image (dict) |
15.970 | "Pria" | "Pakaian" | "Atasan" | "Kemeja" | "Biru Navy" | "Gugur" | 2.011 | "Santai" | "Turtle Check Men Navy Blue Shirt" | { "bytes": [ 255, 216, 255, ... ], "path": null } |
39.386 | "Pria" | "Pakaian" | "Bawahan" | "Jeans" | "Biru" | "Musim Panas" | 2.012 | "Santai" | "Peter England Men Party Blue Jeans" | { "bytes": [ 255, 216, 255, ...], "path": null } |
59.263 | "Wanita" | "Aksesoris" | "Jam Tangan" | "Jam Tangan" | "Perak" | "Musim Dingin" | 2.016 | "Santai" | "Titan Women Silver Watch" | { "bytes": [ 255, 216, 255, ...], "path": null } |
Konversi data
TairVector menggunakan struktur penyimpanan Tair vector index Key-Key-(Key-Value) yang sederhana dan intuitif. Pertama, buat indeks vektor—misalnya hybrid_index—untuk menyimpan seluruh data produk. Selanjutnya, ubah struktur data tabel tersebut. Bidang-bidangnya dikelompokkan ke dalam empat kategori:
Konversikan id menjadi kunci utama untuk pencarian di TairVector. Kolom ini dapat digunakan untuk mengimplementasikan kueri titik, yang hanya memindai sejumlah kecil data.
Ubah data pada bidang image menjadi vektor yang dienkoding menggunakan LLM. Vektor-vektor ini dapat digunakan untuk pencarian berbasis vektor.
Konversikan data dalam kolom productDisplayName menjadi deskripsi data yang sesuai dalam kolom image. Deskripsi ini dapat digunakan untuk pencarian teks penuh.
Konversikan kolom lainnya menjadi pasangan key-value tingkat terendah di TairVector. Tidak ada batasan jumlah pasangan key-value ini. Pasangan ini dapat digunakan untuk penyaringan konvensional berdasarkan atribut.
Gambar berikut menunjukkan struktur data di TairVector.
Prosedur dan kode sampel
Prosedur untuk contoh ini adalah sebagai berikut:
Memuat dataset.
Menyiapkan lingkungan Tair.
Mengimpor dataset ke Tair.
Menggunakan solusi berbeda untuk mengkueri data.
Untuk informasi lebih lanjut, lihat Proyek kode pencarian hibrida.
Kode ini tersedia dalam file .ipynb. Sebelum menggunakannya, jalankan perintah pip install jupyter untuk menginstal dependensi yang diperlukan.
Tampilan kueri
Kode berikut menunjukkan cara melakukan kueri menggunakan berbagai solusi pencarian beserta hasilnya. Contoh kueri yang digunakan adalah Green Kidswear. Pengujian dilakukan dalam empat skenario dengan menyesuaikan parameter hybrid_ratio. Parameter hybrid_ratio merepresentasikan bobot untuk pencarian vektor, sedangkan bobot untuk pencarian teks penuh adalah 1-hybrid_ratio.
Pencarian vektor: Atur parameter hybrid_ratio ke 0,9999.
topk = 20 text = "Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.9999} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)Hasil:

Pencarian teks penuh: Atur parameter hybrid_ratio ke 0,0001.
topk = 20 text = ""Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.0001} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)Hasil:

Pencarian hibrida yang menggabungkan pencarian vektor dan pencarian teks penuh: Atur parameter hybrid_ratio ke 0,5.
topk = 20 text = ""Green Kidswear" vector = model.encode([text])[0] filter_str = None kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)Hasil:

Pencarian hibrida vektor, teks penuh, dan filter kondisional: atur parameter hybrid_ratio ke 0,5 dan tambahkan pernyataan kondisional
subCategory == "Topwear".topk = 20 text = "Green Kidswear" vector = model.encode([text])[0] filter_str = "subCategory == \"Topwear\"" kwargs = {"TEXT" : text, "hybrid_ratio" : 0.5} result = client.tvs_knnsearch(index_name, topk, vector, False, filter_str, **kwargs) print(result) top_img = [images[id_pos[int(item[0])]] for item in result] display_result(top_img)Hasil:

Ringkasan
Berdasarkan hasil di atas, baik pencarian vektor maupun pencarian teks penuh dapat memenuhi persyaratan kueri. Berdasarkan set kandidat peringkat teratas, kinerja pencarian teks penuh sedikit lebih tinggi dibandingkan pencarian vektor.
Untuk solusi pencarian hibrida, jika suatu produk diambil oleh dua metode pencarian, produk tersebut memiliki peringkat lebih tinggi dibandingkan produk lainnya.
Anda dapat menggunakan parameter hybrid_ratio untuk menyesuaikan bobot metode pencarian dalam solusi hibrida. Dengan cara ini, hasil dapat diurutkan ulang untuk mendapatkan hasil yang lebih akurat.
Anda dapat menggunakan penyaringan kondisional untuk menyaring set kandidat tertentu guna meningkatkan tingkat keberhasilan pencarian vektor.