21 पॉइंट द्वारा GN⁺ 2024-10-25 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • SQLite के बेसिक full-text search (FTS5) extension को sqlite-vec semantic search के साथ इस्तेमाल करके application में 'hybrid search' बनाया जा सकता है
    • keyword-first, 'semantic' के आधार पर re-ranking, और reciprocal rank fusion जैसे अलग-अलग तरीकों से results को combine किया जा सकता है
    • सबसे बड़ी बात, सब कुछ SQLite के अंदर ही होने की वजह से experiment और prototype को कम लागत में और आसानी से बनाया जा सकता है, और किसी external service की ज़रूरत नहीं पड़ती
  • sqlite-vec और दूसरे vector search tools का मुख्य use case text data के लिए "semantic search" उपलब्ध कराना है
    • केवल full-text search (keyword search) हमेशा अच्छे results नहीं देता
      • "climate change" खोजने पर "global warming" जैसे documents return नहीं होते
      • semantic search का इस्तेमाल करने पर 'माहौल' के आधार पर results खोजे जा सकते हैं, जिससे ज्यादा अर्थपूर्ण और समृद्ध results मिलते हैं
    • लेकिन केवल "semantic search" का इस्तेमाल application के लिए नुकसानदेह हो सकता है

डेमो: NBC News headlines

  • जनवरी 2024 से अगस्त 2024 तक की 14,500 से अधिक headlines वाला dataset इस्तेमाल किया गया
  • कुल 4.3MB text data के साथ यह बहुत छोटा dataset है

FTS5 table बनाना

  • fts_headlines full-text search virtual table बनाना
  • headline column declare करना
  • content= और content_rowid= options configure करना
  • बेसिक articles table से सीधे INSERT INTO
  • FTS5 table को query करने के लिए केवल एक SELECT statement चाहिए

sqlite-vec से vector search बनाना

  • sqlite-vec vector storage और vector comparison देता है, लेकिन embedding generate नहीं करता
  • इस example में sqlite-lembed extension और Snowflake Artic Embed 1.5 모델 का इस्तेमाल किया गया
  • text को lembed() से embed करके vec0 virtual table में store किया जाता है
  • KNN query के लिए केवल एक SELECT statement चाहिए

Hybrid approach 1: "keyword-first"

  • पहले full-text search results return करें, फिर बाकी को vector search से supplement करें
  • इसे CTE से implement किया जा सकता है
  • results को UNION ALL से combine किया जाता है

Hybrid approach 2: Reciprocal Rank Fusion (RRF)

  • FTS5 और vector match results को rank दिया जाता है
  • एक single SELECT query और CTE से implement किया जा सकता है
  • :weight_fts या :weight_vec बदलकर FTS5/vector results की ranking अलग की जा सकती है

Hybrid approach 3: अर्थ के आधार पर re-rank करना

  • केवल FTS5 search चलती है, लेकिन results को vector distance के आधार पर फिर से order किया जाता है
  • इससे केवल keyword match results मिलते हैं, लेकिन बेहतर semantic match ऊपर आ जाते हैं
  • यह BM25 की कमियों को दूर करने में मदद करता है

कौन-सा approach चुनना चाहिए?

  • यह application और use case पर निर्भर करता है
  • email inbox के लिए search engine बनाते समय keyword-first प्राथमिकता ज्यादा उपयुक्त है
  • internal company documents पर RAG बनाते समय RRF अच्छा विकल्प है
  • web app में "duplicate posts" feature बनाते समय अर्थ-आधारित re-ranking अच्छी तरह काम करती है

आगे के सुधार

  • FTS5 query "highlighting" के जरिए document में matching parts दिखा सकती है, लेकिन sqlite-vec केवल query vector और document के बीच L2/cosine distance return करता है
  • FTS5 query में phrase, NEAR query और boolean operators जैसे दूसरे features हैं, लेकिन vector search में इनके साथ काम करना असहज हो सकता है
  • FTS5 + sqlite-vec से hybrid search को scale करना थोड़ा असहज हो सकता है
  • FTS5 table हर बार पूरे dataset पर full search चलाती है, इसलिए metadata filtering या single FTS5 index support नहीं कर पाती
  • sqlite-vec भी ऐसा ही है, लेकिन partitioning और metadata filtering का support जल्द आने वाला है

GN⁺ की राय

  • SQLite का इस्तेमाल करके hybrid search बनाना experiment और prototyping के लिए आसान है, इसलिए यह अलग-अलग applications में उपयोगी लगती है। डेटा एक single file में store होता है, कई queries को एक SELECT statement से test किया जा सकता है, इसकी कोई लागत नहीं है, यह सभी programming languages में काम करती है, और कुछ lines of code से आसानी से implement की जा सकती है
  • हालांकि FTS5 और sqlite-vec के बीच अभी सुधार की गुंजाइश है। FTS5 document में matching parts highlight कर सकती है, लेकिन sqlite-vec केवल query vector और document के बीच की distance return करता है। साथ ही, FTS5 के advanced features को vector search के साथ जोड़ना कुछ असहज हो सकता है
  • इन limitations के बावजूद, SQLite पर आधारित hybrid search एक मजबूत solution है जो data size और application type की परवाह किए बिना keyword search और semantic search दोनों के फायदे उठा सकता है
  • unstructured data से information निकालना और उसे searchable form में बदलना लगातार अधिक महत्वपूर्ण होता जा रहा है। ऐसे में FTS5 जैसी keyword search और sqlite-vec जैसी vector search को मिलाकर ऐसी उन्नत search संभव होती है जो keyword match और contextual relevance दोनों को ध्यान में रखती है
  • मौजूदा search system में sqlite-vec जोड़ते समय, या नया search application बनाते समय, SQLite-आधारित hybrid search पर विचार किया जा सकता है। खासकर embedding model को खुद customize कर पाने की क्षमता इसका बड़ा फायदा है

1 टिप्पणियां

 
halfenif 2024-10-27

प्रोजेक्ट में sqlite में 10 लाख(+) रिकॉर्ड डालकर उन्हें प्रोसेस करने का काम किया गया।

अगर डेटा की मात्रा ज़्यादा हो, तो मुझे लगता है कि एक अच्छा SSD ज़रूरी है। (क्योंकि मैंने SATA SSD इस्तेमाल किया था, इसलिए लगा कि प्रोसेसिंग समय थोड़ा बढ़ गया।)