- SQLite के बेसिक full-text search (FTS5) extension को
sqlite-vecsemantic 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 के लिए नुकसानदेह हो सकता है
- केवल full-text search (keyword search) हमेशा अच्छे results नहीं देता
डेमो: NBC News headlines
- जनवरी 2024 से अगस्त 2024 तक की 14,500 से अधिक headlines वाला dataset इस्तेमाल किया गया
- कुल 4.3MB text data के साथ यह बहुत छोटा dataset है
FTS5 table बनाना
fts_headlinesfull-text search virtual table बनानाheadlinecolumn declare करनाcontent=औरcontent_rowid=options configure करना- बेसिक
articlestable से सीधेINSERT INTO - FTS5 table को query करने के लिए केवल एक
SELECTstatement चाहिए
sqlite-vec से vector search बनाना
sqlite-vecvector storage और vector comparison देता है, लेकिन embedding generate नहीं करता- इस example में
sqlite-lembedextension औरSnowflake Artic Embed 1.5 모델का इस्तेमाल किया गया - text को
lembed()से embed करकेvec0virtual table में store किया जाता है - KNN query के लिए केवल एक
SELECTstatement चाहिए
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
SELECTquery और 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,
NEARquery और 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 को एक
SELECTstatement से 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 टिप्पणियां
प्रोजेक्ट में sqlite में 10 लाख(+) रिकॉर्ड डालकर उन्हें प्रोसेस करने का काम किया गया।
अगर डेटा की मात्रा ज़्यादा हो, तो मुझे लगता है कि एक अच्छा SSD ज़रूरी है। (क्योंकि मैंने SATA SSD इस्तेमाल किया था, इसलिए लगा कि प्रोसेसिंग समय थोड़ा बढ़ गया।)