Arsitektur Keseluruhan
Dengan pertumbuhan skala data Internet yang eksplosif, jumlah produk serta kategori dalam platform e-commerce utama saat ini meningkat di satu sisi, kesulitan bagi pengguna untuk menemukan produk yang mereka butuhkan melonjak di sisi lain.
Vipshop adalah peritel diskon online terkemuka untuk merek-merek di Tiongkok. Perusahaan menawarkan produk bermerek berkualitas tinggi dan populer kepada konsumen di seluruh China dengan diskon yang signifikan dari harga eceran. Untuk mengoptimalkan pengalaman berbelanja bagi pelanggan mereka, perusahaan memutuskan untuk membangun sistem rekomendasi pencarian yang dipersonalisasi berdasarkan kata kunci kueri pengguna dan potret pengguna.
Fungsi inti dari sistem rekomendasi pencarian e-commerce adalah untuk mengambil produk yang sesuai dari sejumlah besar produk dan menampilkannya kepada pengguna sesuai dengan maksud dan preferensi pencarian mereka. Dalam proses ini, sistem perlu menghitung kemiripan antara produk dan maksud & preferensi pencarian pengguna, dan merekomendasikan produk TopK dengan kemiripan tertinggi kepada pengguna.
Data seperti informasi produk, maksud pencarian pengguna, dan preferensi pengguna adalah data yang tidak terstruktur. Kami mencoba menghitung kemiripan data tersebut menggunakan CosineSimilarity (7.x) dari mesin pencari Elasticsearch (ES), tetapi pendekatan ini memiliki beberapa kekurangan.
Waktu respons komputasi yang lama - latensi rata-rata untuk mengambil hasil TopK dari jutaan item adalah sekitar 300 ms.
Biaya pemeliharaan yang tinggi untuk indeks ES - kumpulan indeks yang sama digunakan untuk vektor fitur komoditas dan data terkait lainnya, yang hampir tidak memfasilitasi konstruksi indeks, tetapi menghasilkan data dalam jumlah besar.
Kami mencoba mengembangkan plug-in hash sensitif lokal kami sendiri untuk mempercepat penghitungan CosineSimilarity ES. Meskipun kinerja dan throughput meningkat secara signifikan setelah akselerasi, latensi 100+ ms masih sulit untuk memenuhi persyaratan pengambilan produk online yang sebenarnya.
Setelah melakukan penelitian menyeluruh, kami memutuskan untuk menggunakan Milvus, database vektor open source, yang diuntungkan dengan dukungan untuk penyebaran terdistribusi, SDK multi-bahasa, pemisahan baca/tulis, dll. Dibandingkan dengan Faiss mandiri yang biasa digunakan.
Dengan menggunakan berbagai model pembelajaran mendalam, kami mengubah data tak terstruktur yang sangat besar menjadi vektor fitur, dan mengimpor vektor tersebut ke dalam Milvus. Dengan kinerja Milvus yang luar biasa, sistem rekomendasi pencarian e-commerce kami dapat secara efisien meminta vektor TopK yang mirip dengan vektor target.
Arsitektur Keseluruhan
 Seperti yang ditunjukkan pada diagram, arsitektur keseluruhan sistem terdiri dari dua bagian utama.
Proses penulisan: vektor fitur item (selanjutnya disebut sebagai vektor item) yang dihasilkan oleh model deep learning dinormalisasi dan ditulis ke dalam MySQL. MySQL kemudian membaca vektor fitur item yang telah diproses menggunakan alat sinkronisasi data (ETL) dan mengimpornya ke dalam basis data vektor Milvus.
Proses pembacaan: Layanan pencarian mendapatkan vektor fitur preferensi pengguna (selanjutnya disebut sebagai vektor pengguna) berdasarkan kata kunci kueri pengguna dan potret pengguna, menanyakan vektor yang serupa di Milvus dan memanggil vektor item TopK.
Milvus mendukung pembaruan data bertahap dan pembaruan seluruh data. Setiap pembaruan bertahap harus menghapus vektor item yang ada dan memasukkan vektor item baru, yang berarti bahwa setiap koleksi yang baru diperbarui akan diindeks ulang. Ini lebih sesuai dengan skenario dengan lebih banyak pembacaan dan lebih sedikit penulisan. Oleh karena itu, kami memilih metode pembaruan data secara keseluruhan. Selain itu, hanya perlu beberapa menit untuk menulis seluruh data dalam batch beberapa partisi, yang setara dengan pembaruan yang mendekati waktu nyata.
Milvus write node melakukan semua operasi penulisan, termasuk membuat koleksi data, membangun indeks, menyisipkan vektor, dll., dan menyediakan layanan kepada publik dengan nama domain tulis. Node baca Milvus melakukan semua operasi baca dan menyediakan layanan kepada publik dengan nama domain hanya-baca.
Meskipun versi Milvus saat ini tidak mendukung pergantian alias koleksi, kami memperkenalkan Redis untuk mengganti alias secara mulus di antara beberapa koleksi data secara keseluruhan.
Node baca hanya perlu membaca informasi metadata yang ada dan data vektor atau indeks dari sistem berkas terdistribusi MySQL, Milvus, dan GlusterFS, sehingga kemampuan baca dapat diperluas secara horizontal dengan menggunakan beberapa instance.
Detail Implementasi
Pembaruan Data
Layanan pembaruan data tidak hanya mencakup penulisan data vektor, tetapi juga deteksi volume data vektor, konstruksi indeks, pra-pemuatan indeks, kontrol alias, dll. Proses keseluruhannya adalah sebagai berikut. Proses
Asumsikan bahwa sebelum membangun seluruh data, CollectionA menyediakan layanan data kepada publik, dan seluruh data yang digunakan diarahkan ke CollectionA (
redis key1 = CollectionA
). Tujuan dari membangun seluruh data adalah untuk membuat koleksi baru CollectionB.Pemeriksaan data komoditas - memeriksa nomor item dari data komoditas di tabel MySQL, membandingkan data komoditas dengan data yang ada di CollectionA. Alert dapat diatur sesuai dengan jumlah atau persentase. Jika jumlah (persentase) yang ditetapkan tidak tercapai, seluruh data tidak akan dibangun, dan itu akan dianggap sebagai kegagalan operasi pembangunan ini, memicu peringatan; setelah jumlah (persentase) yang ditetapkan tercapai, seluruh proses pembangunan data dimulai.
Mulai membangun seluruh data - inisialisasi alias seluruh data yang sedang dibangun, dan perbarui Redis. Setelah memperbarui, alias seluruh data yang sedang dibangun diarahkan ke CollectionB (
redis key2 = CollectionB
).Buat seluruh koleksi baru - tentukan apakah CollectionB sudah ada. Jika ada, hapuslah sebelum membuat yang baru.
Data batch write-in - menghitung ID partisi dari setiap data komoditas dengan ID-nya sendiri menggunakan operasi modulo, dan menulis data ke beberapa partisi ke koleksi yang baru dibuat dalam batch.
Membangun dan memuat indeks - Membuat indeks (
createIndex()
) untuk koleksi baru. File indeks disimpan dalam server penyimpanan terdistribusi GlusterFS. Sistem secara otomatis mensimulasikan kueri pada koleksi baru dan melakukan pra-muat indeks untuk pemanasan kueri.Pemeriksaan data koleksi - memeriksa jumlah item data dalam koleksi baru, membandingkan data dengan koleksi yang sudah ada, dan mengatur alarm berdasarkan jumlah dan persentase. Jika jumlah yang ditetapkan (persentase) tidak tercapai, koleksi tidak akan dialihkan dan proses pembangunan akan dianggap gagal, memicu peringatan.
Mengalihkan koleksi - Alias kontrol. Setelah memperbarui Redis, seluruh data alias yang sedang digunakan diarahkan ke CollectionB (
redis key1 = CollectionB
), Redis key2 asli dihapus, dan proses pembangunan selesai.
Pemanggilan Kembali Data
Data partisi Milvus dipanggil beberapa kali untuk menghitung kemiripan antara vektor pengguna, yang diperoleh berdasarkan kata kunci kueri pengguna dan potret pengguna, dan vektor item, dan vektor item TopK dikembalikan setelah penggabungan. Skema alur kerja secara keseluruhan adalah sebagai berikut: alur kerja Tabel berikut mencantumkan layanan-layanan utama yang terlibat dalam proses ini. Dapat dilihat bahwa latensi rata-rata untuk memanggil kembali vektor TopK adalah sekitar 30 ms.
Layanan | Peran | Parameter Masukan | Parameter keluaran | Latensi respons |
---|---|---|---|---|
Akuisisi vektor pengguna | Dapatkan vektor pengguna | info pengguna + kueri | vektor pengguna | 10 ms |
Pencarian Milvus | Hitung kemiripan vektor dan kembalikan hasil TopK | vektor pengguna | vektor item | 10 ms |
Logika Penjadwalan | Pemanggilan dan penggabungan hasil secara bersamaan | Vektor item yang dipanggil kembali multi-saluran dan skor kemiripan | Item TopK | 10 ms |
Proses implementasi:
- Berdasarkan kata kunci kueri pengguna dan potret pengguna, vektor pengguna dihitung oleh model pembelajaran mendalam.
- Dapatkan alias koleksi dari seluruh data yang sedang digunakan dari Redis currentInUseKeyRef dan dapatkan Milvus CollectionName. Proses ini adalah layanan sinkronisasi data, yaitu mengalihkan alias ke Redis setelah seluruh pembaruan data.
- Milvus dipanggil secara bersamaan dan asinkron dengan vektor pengguna untuk mendapatkan data dari partisi berbeda dari koleksi yang sama, dan Milvus menghitung kemiripan antara vektor pengguna dan vektor item, dan mengembalikan vektor item TopK yang mirip di setiap partisi.
- Gabungkan vektor item TopK yang dikembalikan dari setiap partisi, dan beri peringkat hasil dalam urutan terbalik dari jarak kemiripan, yang dihitung menggunakan produk dalam IP (semakin besar jarak antara vektor, semakin mirip mereka). Vektor item TopK akhir dikembalikan.
Melihat ke Depan
Saat ini, pencarian vektor berbasis Milvus dapat digunakan dengan mantap dalam pencarian skenario rekomendasi, dan kinerjanya yang tinggi memberikan kita lebih banyak ruang untuk bermain dalam dimensi model dan pemilihan algoritma.
Milvus akan memainkan peran penting sebagai middleware untuk lebih banyak skenario, termasuk mengingat kembali pencarian situs utama dan rekomendasi semua skenario.
Tiga fitur yang paling dinantikan dari Milvus di masa depan adalah sebagai berikut.
- Logika untuk pengalihan alias peralihan koleksi - mengoordinasikan peralihan di seluruh koleksi tanpa kontributor eksternal.
- Mekanisme pemfilteran - Milvus v0.11.0 hanya mendukung mekanisme pemfilteran ES DSL dalam versi mandiri. Milvus 2.0 yang baru saja dirilis mendukung pemfilteran skalar, dan pemisahan baca/tulis.
- Dukungan penyimpanan untuk Hadoop Distributed File System (HDFS) - Milvus v0.10.6 yang kami gunakan hanya mendukung antarmuka file POSIX, dan kami telah menggunakan GlusterFS dengan dukungan FUSE sebagai backend penyimpanan. Namun, HDFS adalah pilihan yang lebih baik dalam hal kinerja dan kemudahan penskalaan.
Pelajaran yang Dipetik dan Praktik Terbaik
- Untuk aplikasi yang mengutamakan operasi baca, penerapan pemisahan baca-tulis dapat secara signifikan meningkatkan daya pemrosesan dan meningkatkan kinerja.
- Klien Milvus Java tidak memiliki mekanisme koneksi ulang karena klien Milvus yang digunakan oleh layanan pemanggilan berada di dalam memori. Kami harus membangun kumpulan koneksi kami sendiri untuk memastikan ketersediaan koneksi antara klien Java dan server melalui uji detak jantung.
- Permintaan yang lambat kadang-kadang terjadi pada Milvus. Hal ini disebabkan oleh pemanasan yang tidak cukup dari koleksi baru. Dengan mensimulasikan kueri pada koleksi baru, file indeks dimuat ke dalam memori untuk mencapai pemanasan indeks.
- nlist adalah parameter pembuatan indeks dan nprobe adalah parameter kueri. Anda perlu mendapatkan nilai ambang batas yang masuk akal sesuai dengan skenario bisnis Anda melalui eksperimen pengujian tekanan untuk menyeimbangkan kinerja pengambilan dan akurasi.
- Untuk skenario data statis, akan lebih efisien untuk mengimpor semua data ke dalam koleksi terlebih dahulu dan membangun indeks kemudian.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word