- Skald को इस लक्ष्य के साथ विकसित किया गया है कि यह डेटा को किसी third party को भेजे बिना पूरी तरह self-hostable RAG system उपलब्ध कराए
- RAG के घटकों को vector database, embedding model, LLM, reranker, document parser में बाँटा गया है, और हर घटक के लिए open source alternatives प्रस्तुत किए गए हैं
- Skald का डिफ़ॉल्ट local stack Postgres+pgvector, Sentence Transformers, Docling, और custom LLM से बना है
- benchmark नतीजों में cloud-based models (Voyage+Claude) को औसतन 9.45 अंक मिले, जबकि fully local GPT-OSS 20B को 7.10~8.63 अंक दिए गए
- यह तरीका दिखाता है कि data privacy बनाए रखते हुए भी high-performance RAG बनाया जा सकता है
RAG के घटक और open source alternatives
- बुनियादी RAG में vector database, embedding model, LLM शामिल होते हैं, और अतिरिक्त रूप से reranker और document parser भी जोड़े जा सकते हैं
- हर घटक को SaaS की जगह local alternative से बदला जा सकता है
- उदाहरण तालिका में सुझाए गए विकल्प
- Vector DB: Pinecone, Weaviate Cloud → Qdrant, Weaviate, Postgres+pgvector
- Embeddings: OpenAI, Cohere → Sentence Transformers, BGE, E5
- LLM: GPT, Claude → Llama, Mistral, GPT-OSS
- Reranker: Cohere → BGE Reranker, Sentence Transformers Cross-Encoder
- Document Parsing: Reducto → Docling
- Skald एक पूर्ण open source stack की दिशा में काम करता है, जिसमें हर घटक local तौर पर चलता है
Skald का local stack configuration
- Vector DB: Postgres + pgvector का उपयोग
- मौजूदा infrastructure में आसानी से integrate होता है और कई लाख documents तक संभाल सकता है
- Vector Embeddings: डिफ़ॉल्ट रूप से Sentence Transformers (all-MiniLM-L6-v2)
- केवल अंग्रेज़ी के लिए, speed और retrieval performance के बीच संतुलन
- bge-m3 model (multilingual support) का भी परीक्षण किया गया
- LLM: कोई built-in डिफ़ॉल्ट नहीं, इसे user स्वयं चलाता है
- परीक्षण में GPT-OSS 20B को EC2 पर चलाया गया
- Reranker: डिफ़ॉल्ट रूप से Sentence Transformers Cross-Encoder, और multilingual models जैसे bge-reranker-v2-m3 भी इस्तेमाल किए जा सकते हैं
- Document Parsing: Docling का उपयोग, जिसे docling-serve के साथ चलाया गया
प्रदर्शन और deployment परिणाम
- पूरे stack सहित Skald production instance deploy करने में 8 मिनट लगे
- इसमें Postgres, embedding·reranking services, और Docling शामिल थे
- LLM अलग से चलाया गया (llama.cpp का उपयोग)
- test dataset में PostHog website content (लगभग 2000 documents) और स्वयं तैयार किया गया question-answer set शामिल था
- experiment settings
- Vector search topK=100, Reranking topK=50, Query rewriting=Off
- evaluation का केंद्र accuracy था
benchmark परिणामों की तुलना
- Voyage + Claude (cloud configuration)
- औसत स्कोर 9.45, सभी उत्तर सही
- Voyage + GPT-OSS 20B (partially local)
- औसत स्कोर 9.18, अधिकांश उत्तर सही, लेकिन कुछ जानकारी छूटी
- fully local + GPT-OSS 20B
- बेसिक English model (all-MiniLM-L6-v2 + ms-marco-MiniLM-L6-v2) : औसत 7.10
- अंग्रेज़ी queries में सही, लेकिन multilingual, अस्पष्ट queries, और multi-document aggregation में कमज़ोरी
- multilingual model (bge-m3 + mmarco-mMiniLMv2-L12-H384-v1) : औसत 8.63
- Portuguese queries को सफलतापूर्वक संभाला, लेकिन multi-document aggregation में कुछ कमी रही
- मुख्य सीमा है कई documents में बिखरी जानकारी को जोड़कर संभालना
- cloud models अपनी उच्च performance से इसे बेहतर संभालते हैं, लेकिन local environment में अतिरिक्त techniques की ज़रूरत होती है
आगे की योजना
- Skald की योजना local RAG performance को बेहतर बनाने और open source model benchmarks सार्वजनिक करने की है
- लक्ष्य है air-gapped environments में AI tools चलाने वाली कंपनियों के लिए समाधान उपलब्ध कराना
- इच्छुक लोग GitHub(skaldlabs/skald) या Slack community के ज़रिए सहयोग कर सकते हैं
7 टिप्पणियां
यह बात कि RAG के लिए vector DB ज़रूरी है, आखिर शुरू कहाँ से हुई…
वेक्टर DB वगैरह कुछ भी हो, असल में तो बस search implement करना ही काफी होगा...
Gemini :
हाँ, RAG (Retrieval-Augmented Generation) में vector database (Vector Database) के उपयोग की अवधारणात्मक नींव 2020 में संबंधित पेपर पहली बार प्रकाशित होने के साथ ही रखी गई थी।
RAG मूल रूप से retrieval और generation को जोड़ने का तरीका है, और इस retrieval चरण में vector embedding तथा उन्हें कुशलतापूर्वक स्टोर और सर्च करने वाला vector database अनिवार्य भूमिका निभाता है।
💡 RAG और vector DB की शुरुआत
RAG में vector DB की आवश्यकता का विचार निम्नलिखित प्रमुख पेपरों और अवधारणाओं से शुरू हुआ।
vector database के RAG का अनिवार्य तत्व बनने के मूल कारण इस प्रकार हैं।
सारांश: vector DB की ज़रूरत क्यों है
यदि LLM को ऐसे नवीनतम या domain-specific ज्ञान तक पहुँच देनी है, जो उसने training में नहीं सीखा, तो केवल keyword matching (पारंपरिक खोज) से काम नहीं चलेगा; जानकारी को semantic similarity के आधार पर खोजना होगा। vector DB इसी semantic similarity-आधारित खोज को कुशलतापूर्वक करने के लिए RAG framework में स्वाभाविक रूप से एकीकृत की गई मुख्य तकनीक है.
असल में RAG के लिए ज़रूरी चीज़ search functionality है, और dense vector में embedding करके उसे vectorDB में push करना और cosine similarity search करना, search engine को implement करने के कई तरीकों में से बस एक तरीका भर है... ऐसा नहीं है कि vectorDB का इस्तेमाल न करने की कोई खास वजह है, लेकिन अगर पूछें कि क्या यह सचमुच अनिवार्य है, तो लंबे समय से अच्छी तरह इस्तेमाल होते आए search engine algorithms भी बहुत हैं, इसलिए थोड़ा सवाल तो उठता ही है।
क्योंकि यह सस्ता है और ज़्यादातर production LLM भी यही इस्तेमाल करते हैं।
असल में अगर web server के मामले में भी यही तर्क लगाएँ, तो infra फीचर जोड़कर डिस्क पर ही सब कुछ किया जा सकता है, इसलिए dbms की भी ज़रूरत नहीं पड़ेगी lol
यह सही है कि user query के embedding value (vector) को key की तरह इस्तेमाल करने वाली एक तरह की similarity/semantic search के लिए DB की ज़रूरत होती है, और क्योंकि key vector के रूप में होता है, इसलिए vector DB भी सही है।
Hacker News राय
ऐसे सिस्टम बनाते समय मेरी सलाह है कि vector database या embeddings पर ज़रूरत से ज़्यादा अटकें नहीं
full-text search या
grep/rgजैसे टूल कहीं ज़्यादा तेज़ और सस्ते होते हैं, और index को maintain करने की भी ज़रूरत नहीं पड़तीअगर किसी अच्छे LLM को search tool दे दिया जाए, तो वह “dog OR canine” जैसी query खुद बना सकता है और उसे बार-बार बेहतर भी कर सकता है
ऊपर से, इस तरह chunking problem को हल करने की ज़रूरत भी नहीं रहती
इसे Search Sensei पर देखा जा सकता है
पहली बार load होने पर यह लगभग 50MB model weights और onnx runtime डाउनलोड करता है, लेकिन उसके बाद काफ़ी smooth चलता है
उदाहरण के लिए, BM25 यह नहीं समझ पाता कि “j lo” और “jlo” का मतलब Jennifer Lopez है, लेकिन embedding-based search ऐसे typo या alias को काफ़ी अच्छी तरह संभाल लेता है
यह 2016~2024 के 1000 news articles पर search चलाता है
लेकिन अफ़सोस है कि BM25 अकेले का performance सार्वजनिक नहीं किया गया
मेरे छोटे tests में ऐसे cases थे जहाँ query के exact शब्द page में मौजूद थे, फिर भी embedding उन्हें miss कर गया — आख़िर में Ctrl+F जीत गया
lexical search की precision ज़्यादा होती है लेकिन recall कम, और semantic search इसके उलट तरफ़ होता है
लगा कि “NOT” operator की ज़्यादा ज़रूरत है। RAG के बारे में भी और सीखना चाहता हूँ
कुछ agent-style tools को मैंने ऐसी queries अपने-आप बनाते देखा है, लेकिन समझ नहीं आया कि यह prompt से कराया गया है या default behavior है
performance कम होने की एक वजह semantic chunking की कमी भी हो सकती है
अगर पूरे document को embed कर दिया जाए, तो कई concepts मिल जाते हैं और accuracy गिरती है
Spacy जैसे टूल से उसे meaning units में बाँटना चाहिए, और हर chunk किस context में है यह जोड़कर फिर embedding बनानी चाहिए
Anthropic की contextual retrieval approach RAG systems में बहुत असरदार रही है
context generation के लिए GPT OSS 20B model इस्तेमाल किया जा सकता है
लगता है भ्रम इसलिए हुआ क्योंकि test ऐसे सवालों पर था जिनमें कई documents का context जोड़ना पड़ता है
समझ नहीं आता कि semantic search को lexical search से बेहतर मानकर क्यों चला जाता है
2023 में Tantivy(BM25) से तुलना की थी और नतीजों में फ़र्क़ बहुत मामूली था
थोड़ा recall बढ़ भी जाए, तब भी पता नहीं इतना complex setup बनाना उसके लायक है या नहीं
developer tests में recall 90% था, लेकिन real user tests में यह लगभग 30% तक गिर गया
users को documents की exact terminology पता नहीं होती, इसलिए सिर्फ lexical search काफ़ी नहीं था
agent जोड़ सकते हैं, लेकिन latency बढ़ जाती है और user satisfaction घटती है
Wanderfugl में semantic search ऐसे हिस्से भी ढूँढ लेता है जिनका BM25 score कम होता है
आख़िरकार hybrid ranking ही जवाब हो सकता है
आख़िर में यह use case dependent है
मैं ऐसा open source tool ढूँढ रहा हूँ जो email, Slack, GDrive, code, wiki आदि सभी data को local offline mode में query कर सके
खुद से build या customize करने से बचना चाहता हूँ, और अच्छे defaults व model recommendations मिल जाएँ तो बढ़िया होगा
GitHub लिंक
यह basic CRUD support करता है, और vector search enable करने पर documents या notes को embed करता है
embedding provider के रूप में Ollama और OpenAI को support करता है
MCP server semantic + BM25(qdrant fusion) search दोनों देता है, और MCP sampling के ज़रिए responses बनाता है
server खुद जवाब generate नहीं करता, इसलिए किसी भी LLM/MCP client के साथ जोड़ा जा सकता है
यह MCP sampling/RAG pattern बहुत ताकतवर है, और संभव है कि दूसरे data sources के लिए इसका एक generalized open source version भी आए
हम जो टूल इस्तेमाल करते हैं वह haiku.rag है
यह developer-friendly Python code, pydantic-ai आधारित structure, benchmarks, और advanced citation features देता है
यह deep research agent को support करता है, और लंबे समय तक maintain होने वाला सचमुच का open source project है
default embedding model के रूप में हम Sentence Transformers (all-MiniLM-L6-v2) इस्तेमाल कर रहे हैं, लेकिन अब समझ आया कि यह सिर्फ English के लिए है, इसलिए German RAG बनाते समय समस्या हो सकती है
non-English models का performance कैसा है, यह जानना चाहता हूँ
“Retrieval” section में RTEB Multilingual या RTEB German entries देख लें
अगर CPU-based self-hosting कर रहे हैं, तो 100M parameters से कम वाले models पर filter लगाना बेहतर रहेगा
लेकिन German के लिए training data अपेक्षाकृत ज़्यादा है, और multilingual models भी काफ़ी उपलब्ध हैं
ख़ासकर commercial API-based models में ज़्यादातर multilingual support होता है
संबंधित paper के लिए Springer लिंक देख सकते हैं
GPT-4 के दौर में (8K context) मैंने एक script बनाई थी जो पूरी किताब को chunks में बाँटकर GPT-4 में डालती थी और relevant passages search करती थी
तब एक search पर लगभग 1 डॉलर खर्च आता था, लेकिन अब यह बहुत सस्ता हो गया है
Anthropic की contextual retrieval पोस्ट में भी कहा गया है कि अगर document पूरा context में आ सकता है, तो RAG की जगह उसे सीधे डालना बेहतर है
हालाँकि context लंबा होने पर quality गिरती है, और cost व speed भी समस्या बनते हैं
अब पूरी किताब context में डालना भी लगभग 1 cent में संभव है
RAG में सबसे मुश्किल हिस्सा document parsing है
सिर्फ text हो तो ठीक है, लेकिन tables, multi-page tables, charts, table of contents, footnotes जैसी चीज़ें आते ही accuracy तेज़ी से गिर जाती है
इसे बेहतर करने के लिए RAPTOR pattern जैसी approach है, जहाँ LLM content को summarize करता है, questions बनाता है, और फिर उसे vector DB में store करता है
लेकिन हर case में काम करने वाली general-purpose RAG pipeline अब भी एक कठिन चुनौती है
यह भी जानना चाहता हूँ कि vector DB लंबे text groups को बेहतर संभालता है या tabular format को
full-text search को RAG में लागू करने का यह नया नज़रिया दिलचस्प लगा
agent-style tool loop और fuzzy search को संभालने के तरीके पर मिली insight प्रभावशाली थी
जिज्ञासा है कि क्या ऐसे systems के लिए evaluation datasets standardized हैं
अच्छा होगा अगर documents और questions का ऐसा benchmark हो, जिसमें किसी खास document या chunk को सबसे relevant result के रूप में आना चाहिए