21 poin oleh GN⁺ 2024-10-25 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
halfenif 2024-10-27

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)