- 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-vec dan 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
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= dan content_rowid=
- Melakukan
INSERT INTO langsung dari tabel dasar articles
- Untuk mengueri tabel FTS5, cukup diperlukan satu pernyataan
SELECT
Membangun pencarian vektor dengan sqlite-vec
sqlite-vec menyediakan penyimpanan vektor dan perbandingan vektor, tetapi tidak membuat embedding
- Dalam contoh ini digunakan ekstensi
sqlite-lembed dan model Snowflake Artic Embed 1.5
- Teks di-embedding dengan
lembed() lalu disimpan ke tabel virtual vec0
- 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
SELECT dan CTE
- Hasil FTS5/vektor bisa diberi bobot peringkat berbeda dengan mengubah
:weight_fts atau :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-vec hanya 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-vec bisa 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, tetapi sqlite-vec hanya 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-vec memungkinkan pencarian yang lebih canggih dengan mempertimbangkan kecocokan kata kunci sekaligus relevansi kontekstual
- Baik saat menambahkan
sqlite-vec ke 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)