1 पॉइंट द्वारा GN⁺ 2 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Ternlight सर्वर कॉल के बिना ब्राउज़र के अंदर text embedding और similarity search करता है, जिससे छोटे client-side semantic search को तेज़ी से बनाया जा सकता है
  • बेस पैकेज में engine और weights मिलाकर 7MB हैं, mini variant 5MB का है, और यह GPU के बिना CPU पर चलता है
  • @ternlight/base इंस्टॉल करने के बाद embed, similar इम्पोर्ट करके semantic search flow को लगभग 3 lines में बनाया जा सकता है
  • उदाहरण कॉल recipe list में top 3 results को rank करता है, और लगभग 5ms तथा network call न होने पर ज़ोर देता है
  • React docs search demo में यूज़र सवाल दर्ज करता है तो ब्राउज़र में ही search चलता है, और @ternlight/mini का 5MB tier इसे चलाता है

ब्राउज़र के अंदर पूरा होने वाला embedding

  • Ternlight “7MB embedding model” को सामने रखता है, text को milliseconds स्तर पर embed करता है, और सर्वर को कॉल नहीं करता
  • रनटाइम विशेषताएँ

    • कोई API call नहीं
    • engine + weights: 7MB
    • mini variant: 5MB
    • तेज़ embedding: लगभग 5ms
    • केवल CPU, GPU नहीं

इंस्टॉलेशन और उपयोग उदाहरण

  • यह एक npm package के रूप में दिया गया है, और अलग model download step या server के बिना इस्तेमाल किया जा सकता है
  • इंस्टॉल कमांड इस प्रकार है
npm install @ternlight/base
  • @ternlight/base से embed, similar इम्पोर्ट करके semantic search चलाया जाता है
import { embed, similar } from '@ternlight/base';

similar('easy weeknight dinner ideas', recipes, { topK: 3 });
// → ranked matches · ~5 ms · zero network
  • React docs search demo में यूज़र सवाल दर्ज करता है तो ब्राउज़र में search किया जाता है, और @ternlight/mini के 5MB tier पर यह चलता है

1 टिप्पणियां

 
GN⁺ 2 시간 전
Hacker News की राय
  • एक hobby project के तौर पर ब्राउज़र में काम का मॉडल चलाकर देखना चाहता था, इसलिए MiniLM से एक छोटा sentence encoder distill किया और ternary quantization-aware training लागू की
    inference engine भी खुद लिखा और Rust → WASM SIMD के रूप में deploy किया
    यह LLM नहीं, बल्कि embedding model है, इसलिए text डालने पर 384-dimensional vector निकलता है, और दो vectors की cosine similarity से text relevance तय होती है। जैसे “reset my password” और “I forgot my password” का score 0.88 जैसा आता है
    इसे semantic search, FAQ/intent matching, और clustering में इस्तेमाल किया जा सकता है, और on-device चलने की वजह से API dependency के बिना input देते ही semantic search तेज़ी से संभव है
    demo React docs के 2,000 documents को पूरी तरह on-device search करता है: https://ternlight-demo.vercel.app
    npm पर दो tiers हैं: @ternlight/base (7MB, प्रति embedding करीब 5ms, बेहतर embeddings) और @ternlight/mini (5MB transfer, प्रति embedding करीब 2.5ms), और ये Node और browser के लिए bundled हैं
    repository में technical details, MIT license और training pipeline शामिल हैं: https://github.com/soycaporal/ternlight
    जानना चाहता हूं कि on-device embeddings सच में उपयोगी हैं या नहीं, और इनके कौन-से use cases हैं

    • मेरे पास एक dictionary है जो words को OpenStreetMap tags से map करती है, और वह https://codeberg.org/cartes/web/src/branch/master/components... जैसी है
      सोच रहा हूं कि जब user “pancake” type करे तो explicit “pancake = crêpe” dictionary entry लिखे बिना crêpe खोजने में यह मदद करेगा या नहीं
      अगर मैंने सही समझा है, तो library शुरुआत में एक बार 5MB download करती है, और उसके बाद इसे वैसा ही use किया जाता है जैसे अभी Fuse.js use करते हैं—क्या structure ऐसा ही है, यह भी जानना चाहता हूं
      English के अलावा दूसरी languages को यह कितना अच्छा handle करता है, और क्या इसे OpenStreetMap tag wiki से train कराया जा सकता है, यह भी जानना चाहता हूं
    • एक native desktop app में simple semantic search डालने में सच में दिलचस्पी है
      जानना चाहता हूं कि दूसरे ultra-small embedding models से कोई comparison है या नहीं। MiniLM-L6 से शुरू करने की वजह यह थी कि वह इसी class में खास तौर पर अच्छा model है या नहीं, यह तय करना मुश्किल है, क्योंकि दिए गए metrics में सिर्फ “Retrieval (SciFact NDCG@10)” है
      हालांकि claimed performance से काफी फर्क है; i5-4570 के Firefox में 400 per second नहीं, सिर्फ 35 embeddings per second मिल रहे हैं। शक है कि कहीं non-SIMD path पर fallback तो नहीं हो रहा, और native Rust binary भी try करने का इरादा है
    • अभी-अभी पूरे django docs और internal knowledge base को embed किया, और अब दोनों sources को तुरंत search कर सकता हूं
  • शानदार है, लेकिन landing page पर demo शुरू करने के लिए एक button हो तो अच्छा रहेगा। webpage खोलते ही fan के पागलों की तरह घूमने की आवाज़ आई, जिससे मैं काफी चौंक गया

    • सहमत। साथ ही यह याद आकर अच्छा भी लगा कि एक समय था जब computer की आवाज़ सुनकर ही अपनापन से पता चल जाता था कि अभी क्या हो रहा है
    • fan चलना शुरू हुआ तो चौंक गया। हालांकि toaster भी मुझे अक्सर चौंका देता है
    • CPU cycles का extreme उपयोग—किसने कहा था कि सिर्फ GPU ही खास है
  • इसे Astro या किसी general-purpose meta framework plugin के रूप में बनाना अच्छा रहेगा, जो generated सभी HTML files को automatically parse करके एक छोटा embedding database बना दे
    frontend पर इसे lazy-load किया जा सकता है, और शायद HNSW को भी chunks में store करके search query के लिए जरूरी हिस्से ही load किए जा सकते हैं
    उदाहरण के लिए https://pagefind.app/ जैसा, लेकिन पूरी तरह static vector search देने वाला रूप

    • हमारे static site generator में sqlite-vec use करना चाहता था, लेकिन आखिरी बार check करने पर या तो HNSW implement नहीं था, या browser में vector search support अच्छा नहीं था। शायद वह अभी भी full table scan कर रहा था
      महीनों, सालों बाद भी अगर हालत वही है, तो यह project को ठीक से पूरा करने की क्षमता की कमी का संकेत लगता है, और काफी निराशाजनक है। यहां तक कि जिस grant को मैंने support किया था, उसमें मैंने उस project को अच्छा candidate recommend किया था; वे select हो गए और मैं रह गया
      अगर इस क्षेत्र में किसी को अच्छा solution पता हो, या SQLite-vec के बारे में मैं गलत हूं, तो बताएं। हमारे SSG में हमने लगभग तय कर लिया है कि पहले कुछ महीनों तक दूसरे infrastructure पर काम करेंगे, और तब तक यह complete न हुआ तो खुद बना लेंगे
  • यह उस DuckDB HNSW search project के लिए काफी शानदार addition हो सकता है जिसे पहले यहां देखा था: https://github.com/jasonjmcghee/portable-hnsw
    statically hosted Parquet files पर HTTP range requests का इस्तेमाल करके search होना सच में दिलचस्प है
    मुझे लगता है कि ऐसी चीज़ें बड़ी companies के control से बाहर एक अपेक्षाकृत open और distributed search ecosystem में बढ़ सकती हैं

    • मिलते-जुलते idea के तौर पर, static host पर रखे SQLite DB को HTTP range requests और WASM के साथ use करने का तरीका भी दिलचस्प हो सकता है
      https://news.ycombinator.com/item?id=27016630
    • बढ़िया idea है। मुझे range requests और static hosting पर client द्वारा navigate किए जा सकने वाले formats सच में पसंद हैं
  • यह सच में बहुत अच्छा है, और शायद उस चीज़ का missing piece हो सकता है जिसे मैं पहले बनाना चाहता था
    https://github.com/npiesco/absurder-sql इस्तेमाल करके पूरे original corpus को browser के अंदर IndexedDB/SQLite में persist करके store किया जा सकता है
    फिर https://weaviate.io/blog/chunking-strategies-for-rag की तरह सब कुछ पहले से index किए बिना, Ternlight से जरूरत पड़ने पर embedding generation और cache किया जा सकता है
    तब native SQLite के FTS5/BM25 और Ternlight के semantic search को मिलाने वाला Reciprocal Rank Fusion, यानी hybrid search भी संभव हो जाएगा

  • अच्छी तरह बनाया गया है
    इसे 7MB के रूप में promote किया गया है, लेकिन 5MB mini version भी है
    लगता है mini internally 384 नहीं, बल्कि 256-element vector इस्तेमाल करके space घटाता है, और compatibility के लिए आखिर में उसे 384 पर project करता है
    size एक-तिहाई घटता है, लेकिन loss linear नहीं है, इसलिए छोटा data path इस्तेमाल करने पर भी information loss एक-तिहाई से कम लगता है

  • शानदार project है
    पहले मैंने कुछ ऐसा ही try किया था: http://sol.quipu-strands.com/
    browser के अंदर embedding model load करके text को semantically sort करना चाहता था
    HuggingFace से ONNX weights (MPNet, MiniLM) लाया, Transformers.js से embeddings बनाईं, फिर page के अंदर pyodide पर चलने वाले scikit-learn के clusterer का इस्तेमाल किया। सब कुछ client-side चला, और यह पूरी तरह काम कर गया, जिससे मैं हैरान था

  • demo काफी अजीब तरह से काम करता है। उदाहरण के लिए “how to use typescript with createContext” search करने पर top results सिर्फ typescript entries हैं, इसलिए लगता है similarity search fail हो गया

  • धन्यवाद। local models किसी दिन privacy लाएंगे, और ऐसे छोटे embedding models के लिए मुझे पहले से ही एक बेहतरीन use case पता है: product database में सस्ता और तेज़ search
    मेरे मामले में CPU पर निर्भर होना भी एक advantage है

    • अच्छा है। अगर support करने का कोई तरीका हो या roadmap में handle किए जाने वाले concrete use cases हों, तो बताएं
  • क्या 30 सेकंड लगने वाला embedding generation पहले से करके browser को भेजा जा सकता है?
    उसके बाद inference तेज़ और अच्छा है

    • हां, संभव है। server side पर सिर्फ एक बार index run करें और embeddings को frontend पर भेज दें