- Dengan menggunakan ekstensi pencarian teks penuh bawaan SQLite (FTS5) bersama pencarian semantik
sqlite-vec, kita bisa membuat 'pencarian hibrida' di dalam aplikasi- Hasil dapat digabungkan dengan berbagai cara seperti memprioritaskan kata kunci, penyusunan ulang peringkat berdasarkan 'semantic', dan reciprocal rank fusion
- Yang terpenting, semuanya ada di dalam SQLite, sehingga eksperimen dan pembuatan prototipe bisa dilakukan dengan murah dan mudah tanpa memerlukan layanan eksternal
- Salah satu kasus penggunaan utama
sqlite-vecdan alat pencarian vektor lainnya adalah menyediakan "pencarian semantik" untuk data teks- Pencarian teks penuh (pencarian kata kunci) saja tidak selalu memberikan hasil yang baik
- Saat mencari "climate change", sistem tidak akan mengembalikan dokumen seperti "global warming"
- Dengan pencarian semantik, hasil dapat dicari berdasarkan 'nuansa' sehingga mengembalikan hasil yang lebih kaya makna
- Namun, hanya menggunakan "pencarian semantik" bisa merugikan aplikasi
- Pencarian teks penuh (pencarian kata kunci) saja tidak selalu memberikan hasil yang baik
Demo: Headline NBC News
- Menggunakan dataset yang berisi lebih dari 14.500 headline dari Januari hingga Agustus 2024
- Total data teks hanya 4,3MB, jadi dataset ini sangat kecil
Membuat tabel FTS5
- Membuat tabel virtual pencarian teks penuh
fts_headlines - Mendeklarasikan kolom
headline - Mengonfigurasi opsi
content=dancontent_rowid= - Melakukan
INSERT INTOlangsung dari tabel dasararticles - Untuk mengueri tabel FTS5, cukup diperlukan satu pernyataan
SELECT
Membangun pencarian vektor dengan sqlite-vec
sqlite-vecmenyediakan penyimpanan vektor dan perbandingan vektor, tetapi tidak membuat embedding- Dalam contoh ini digunakan ekstensi
sqlite-lembeddan modelSnowflake Artic Embed 1.5 - Teks di-embedding dengan
lembed()lalu disimpan ke tabel virtualvec0 - Untuk menjalankan kueri KNN, cukup diperlukan satu pernyataan
SELECT
Pendekatan hibrida 1: "kata kunci lebih dulu"
- Kembalikan dulu hasil pencarian teks penuh, lalu lengkapi sisanya dengan pencarian vektor
- Dapat diimplementasikan dengan CTE
- Hasil digabungkan dengan
UNION ALL
Pendekatan hibrida 2: reciprocal rank fusion (RRF)
- Memberikan peringkat pada hasil kecocokan FTS5 dan vektor
- Dapat diimplementasikan dengan satu kueri
SELECTdan CTE - Hasil FTS5/vektor bisa diberi bobot peringkat berbeda dengan mengubah
:weight_ftsatau:weight_vec
Pendekatan hibrida 3: menyusun ulang peringkat berdasarkan makna
- Hanya menjalankan pencarian FTS5, tetapi menyusun ulang hasil berdasarkan jarak vektor
- Hanya mendapatkan hasil yang cocok secara kata kunci, tetapi kecocokan semantik yang lebih baik akan naik ke atas
- Membantu mengatasi kelemahan BM25
Pendekatan mana yang harus dipilih?
- Tergantung pada aplikasi dan kasus penggunaannya
- Jika membangun mesin pencari untuk kotak masuk email, prioritas kata kunci lebih cocok
- Jika membangun RAG untuk dokumen internal perusahaan, RRF adalah opsi yang baik
- Jika membangun fitur "posting duplikat" di web app, penyusunan ulang berdasarkan makna bekerja dengan baik
Peningkatan ke depan
- Kueri FTS5 dapat menampilkan bagian dokumen yang cocok dengan "highlight", tetapi
sqlite-vechanya mengembalikan jarak L2/kosinus antara vektor kueri dan dokumen - Kueri FTS5 juga punya fitur lain seperti frasa, kueri
NEAR, dan operator boolean, tetapi terasa canggung saat dipakai bersama pencarian vektor - Memperluas pencarian hibrida dengan FTS5 +
sqlite-vecbisa terasa kurang mulus - Tabel FTS5 melakukan pencarian penuh pada seluruh dataset setiap kali, sehingga tidak mendukung pemfilteran metadata atau satu indeks FTS5 tunggal
- Hal yang sama juga berlaku untuk
sqlite-vec, tetapi dukungan untuk partisi dan pemfilteran metadata akan segera hadir
Opini GN⁺
- Pencarian hibrida dengan SQLite tampak berguna untuk berbagai aplikasi karena eksperimen dan prototyping-nya mudah. Kelebihannya adalah data disimpan dalam satu file, berbagai kueri bisa diuji dengan satu pernyataan
SELECT, tidak berbiaya, bekerja di semua bahasa pemrograman, dan mudah diimplementasikan hanya dengan beberapa baris kode - Namun, masih ada bagian yang perlu ditingkatkan antara FTS5 dan
sqlite-vec. FTS5 dapat menyorot bagian yang cocok dalam dokumen, tetapisqlite-vechanya mengembalikan jarak antara vektor kueri dan dokumen. Selain itu, saat menggunakan fitur lanjutan FTS5, penggabungannya dengan pencarian vektor bisa terasa canggung - Meski ada keterbatasan ini, pencarian hibrida berbasis SQLite tetap merupakan solusi yang kuat karena dapat memanfaatkan keunggulan pencarian kata kunci dan pencarian semantik sekaligus, tanpa bergantung pada ukuran data atau jenis aplikasi
- Dalam situasi ketika mengekstrak informasi dari data tidak terstruktur dan mengubahnya menjadi bentuk yang bisa dicari semakin penting, menggabungkan pencarian kata kunci seperti FTS5 dengan pencarian vektor seperti
sqlite-vecmemungkinkan pencarian yang lebih canggih dengan mempertimbangkan kecocokan kata kunci sekaligus relevansi kontekstual - Baik saat menambahkan
sqlite-vecke sistem pencarian yang sudah ada maupun saat mengembangkan aplikasi pencarian baru, pencarian hibrida berbasis SQLite layak dipertimbangkan. Terutama karena model embedding itu sendiri dapat dikustomisasi, yang menjadi nilai plus besar
1 komentar
Dalam proyek, saya melakukan pekerjaan memasukkan dan memproses 1 juta(+) data ke SQLite.
Jika jumlah datanya besar, sepertinya diperlukan SSD yang bagus. (Karena saya menggunakan SATA SSD, saya merasa waktu pemrosesannya jadi sedikit lebih lama)