41 पॉइंट द्वारा xguru 2023-10-30 | 5 टिप्पणियां | WhatsApp पर शेयर करें

Embeddings क्या हैं?

  • "Embedding" वह प्रक्रिया है जिसमें content को "floating point numbers की array" में बदला जाता है
  • इस array की सबसे अहम बात यह है कि "content की लंबाई" चाहे कुछ भी हो, "array का आकार" हमेशा एक जैसा रहता है
  • array का आकार इस्तेमाल किए जा रहे embedding model से तय होता है, जैसे 300, 1000, 1536 आदि
  • इस number array को समझने का सबसे अच्छा तरीका है इसे "एक बेहद अजीब multi-dimensional space के coordinates" के रूप में देखना
  • content को multi-dimensional space में क्यों रखा जाता है? क्योंकि content की position, खासकर उसके पास मौजूद दूसरे content के आधार पर, उसके बारे में दिलचस्प जानकारी सीखी जा सकती है
  • space में यह position, embedding model की "दुनिया के बारे में अजीब और ज्यादातर हमारे लिए अपठनीय समझ" के अनुसार, content के "semantic meaning" को दर्शाती है
  • embedded content का color, shape, concept या दूसरी कई तरह की विशेषताएं इसमें capture हो सकती हैं
  • इन अलग-अलग numbers का क्या मतलब है, इसे पूरी तरह कोई नहीं समझता, लेकिन यह पता है कि उनकी position का उपयोग content के बारे में उपयोगी जानकारी निकालने में किया जा सकता है

Embeddings का उपयोग करके related content खोजना

  • embeddings से मैंने जो पहला काम हल किया, वह मेरे TIL ब्लॉग के लिए "Related Content" feature बनाना था
  • इसके लिए OpenAI का text-embedding-ada-002 model इस्तेमाल किया गया, जो API के जरिए उपलब्ध है
  • अभी मेरी साइट पर 472 लेख हैं, और हर लेख के लिए 1536-dimensional embedding vector (floating point numbers की array) निकालकर उसे मेरी साइट के SQLite DB में store किया गया है
  • अब किसी खास लेख के related लेख खोजने के लिए उस लेख के embedding vector और DB में मौजूद दूसरे लेखों के बीच cosine similarity निकालकर, distance के हिसाब से सबसे पास के 10 matches लौटाने होते हैं
  • cosine similarity के लिए इस्तेमाल किया गया Python code यह है
def cosine_similarity(a, b):  
    dot_product = sum(x * y for x, y in zip(a, b))  
    magnitude_a = sum(x * x for x in a) ** 0.5  
    magnitude_b = sum(x * x for x in b) ** 0.5  
    return dot_product / (magnitude_a * magnitude_b)  
  • OpenAI की embedding API बहुत सस्ती और आसान है
    • मैंने अपनी TIL वेबसाइट पर लगभग 4 लाख tokens embed किए, और 1,000 tokens पर $0.0001 की दर से कुल खर्च सिर्फ $0.04 आया
    • बस API key के साथ text को POST करना होता है, और यह floating point numbers वाली JSON array लौटा देता है
  • लेकिन यह एक proprietary model है, और कुछ महीने पहले OpenAI ने अपने कुछ embedding models को बंद भी किया था
  • यानी अगर आपने उस model से बड़ी संख्या में embeddings store कर रखे हैं, तो नए model के लिए embeddings फिर से निकालने पड़ेंगे
  • OpenAI ने कहा था कि नए model में re-embedding की लागत की भरपाई की जाएगी, लेकिन proprietary models के मामले में सावधानी जरूरी है
  • इससे बचने का एक तरीका मजबूत open license models का इस्तेमाल है

यह Word2Vec model में कैसे काम करता है, इसे समझना

  • Google Research ने 10 साल पहले Word2Vec नाम के एक शुरुआती embedding model पर एक प्रभावशाली paper प्रकाशित किया था
    • 2013 का paper "Efficient Estimation of Word Representations in Vector Space" embeddings में रुचि बढ़ाने वाला था
  • Word2Vec एक ऐसा model है जो किसी एक शब्द को लेकर उसे 300 numbers की list में बदल देता है; यह list संबंधित शब्दों के अर्थ के बारे में जानकारी capture करती है
  • किसी शब्द को search करने पर उसके Word2Vec representation से cosine distance के आधार पर मिलते-जुलते शब्द पाए जा सकते हैं
  • "france" को खोजने पर "french : 0.70007~", "belgium: 0.69331~", "paris: 0.63349~", "germany: 0.62707~" जैसे मान मिल सकते हैं
  • यह फ्रांसीसीपन और यूरोपीय भूगोल के मिश्रण जैसा है
  • यहां एक बेहद दिलचस्प काम यह है कि इन vectors पर arithmetic operations किए जा सकते हैं
  • "germany" के vector में "paris" जोड़कर और "france" घटाने पर, परिणाम vector "Berlin" के सबसे करीब आता है
  • इस model ने nationality और geography से जुड़े ऐसे विचार पकड़ लिए थे, जिनकी मदद से arithmetic के जरिए दुनिया के बारे में अतिरिक्त तथ्य खोजे जा सकते थे
  • Word2Vec को 1.6 अरब शब्दों के content पर train किया गया था, और आज हम जिन embedding models का उपयोग करते हैं, वे कहीं बड़े datasets पर train होते हैं, इसलिए वे आधारभूत संबंधों की कहीं अधिक समृद्ध समझ capture करते हैं

मेरे tools से embeddings निकालना और search करना

  • मैं LLM नाम का एक CLI और Python library बना रहा हूं
  • इसे LLMs के साथ interact करने के CLI के रूप में इस्तेमाल किया जा सकता है, और OpenAPI integration भी संभव है
  • कुछ महीने पहले इस tool में plugins के जरिए embedding models चलाने की सुविधा भी जोड़ी गई थी (SentenceTransformers library का उपयोग संभव है)
  • embedding collection चुनकर मिलती-जुलती चीजें खोजने वाली vibes-based search की जा सकती है
  • मैं Python codebase में symbols खोजने के लिए Symbex tool भी बना रहा हूं; इसके जरिए code के functions के embeddings निकालकर code search engine बनाया जा सकता है
  • (विस्तृत implementation भाग यहां छोड़ा गया है)

CLIP का उपयोग करके text और image को साथ में embed करना

  • इस समय मेरा पसंदीदा embedding model CLIP है
  • यह OpenAI द्वारा जनवरी 2021 में जारी किया गया model है, जो "text और image" दोनों को embed कर सकता है और उन्हें एक ही vector space में रखता है
  • अगर आप "dog" को embed करते हैं, तो आपको 512-dimensional space में एक position मिलती है (यह CLIP configuration पर निर्भर करता है)
  • अगर किसी कुत्ते की photo को embed किया जाए, तो उसे भी उसी space में एक position मिलती है, जो string "dog" की position के काफी करीब होती है
  • यानी text का उपयोग करके related images खोजी जा सकती हैं, या image का उपयोग करके संबंधित text खोजा जा सकता है
  • किसी beach photo को डालने पर "beach: 26.946%", "city: 19.839%", "sunshine: 24.146%" जैसे similarity scores मिल सकते हैं

CLIP से नल खोजना

  • Drew Breunig ने llm-clip plugin के साथ नलों का एक search engine बनाया
  • उसने 20,000 नलों की photos लेकर CLIP चलाया
  • फिर दूसरे नलों जैसे नल खोजे गए, और उनमें से मिलते-जुलते लेकिन सस्ते विकल्प ढूंढना संभव हुआ

RAG से सवालों के जवाब देना

  • ChatGPT इस्तेमाल करने वाले लोगों का आखिरी सवाल लगभग हमेशा एक जैसा होता है
    "मैं इसे अपने notes या अपनी कंपनी के documents के बारे में जवाब देने लायक कैसे बनाऊं?"
  • लोग अक्सर मान लेते हैं कि इसके लिए भारी खर्च करके उस content पर custom model train करना पड़ेगा
  • लेकिन वास्तव में इसकी जरूरत नहीं है; यह LLM और RAG (Retrieval Augmented Generation) से संभव है
  • मुख्य विचार यह है कि "user एक सवाल पूछता है"
    • फिर आपके निजी documents में उस सवाल से संबंधित सामग्री खोजी जाती है
    • उस content के excerpts को मूल सवाल के साथ LLM में डाल दिया जाता है
    • फिर LLM आपके द्वारा अतिरिक्त रूप से दिए गए content के आधार पर सवाल का जवाब दे सकता है
  • यह सस्ता-सा trick है, लेकिन हैरान करने वाली हद तक असरदार है
    • लेकिन इसका बुनियादी version भी ठीक से काम कराने के लिए मेहनत लगती है
    • users जो अनगिनत तरह के सवाल पूछ सकते हैं, उन्हें देखते हुए इसे जितना हो सके उतना मजबूत बनाना पड़ता है
  • RAG की मुख्य समस्या यह तय करना है कि LLM को भेजे जाने वाले prompt में कौन से content excerpts शामिल किए जाएं
  • embeddings से चलने वाली 'vibes-based' semantic search, user के सवाल का जवाब देने में मददगार उच्च-प्रासंगिक content इकट्ठा करने के लिए जरूरी क्षमता है
  • मैंने अपने "ब्लॉग की सामग्री" के लिए इसका एक version बनाकर जारी किया
    • नतीजा यह हुआ कि RAG एक one-line Bash script से संभव हो गया

5 टिप्पणियां

 
edunga1 2023-11-06

मैंने यह लेख देखकर वीकेंड में इसे आज़माया। Korean model आज़माने की कोशिश की, लेकिन environment setup आसान नहीं था, इसलिए ada v2 इस्तेमाल किया, और कुल $0.03 खर्च हुए। अगर कोई नया user है जिसने ChatGPT नहीं इस्तेमाल किया है, तो $5 के free credit से इसे काफ़ी अच्छी तरह आज़मा सकता है, haha

मैंने cosine similarity तक calculate करके तुलना की, और परिणाम समझ में आने वाले थे। लेख साझा करने के लिए धन्यवाद।

 
laeyoung 2023-11-01

लगता है वीकेंड पर इसे एक बार फ़ॉलो करके देखना पड़ेगा

 
donghemul11 2023-10-31

धन्यवाद~

 
seatbelts 2023-10-30

लगता है मुझे अब थोड़ा-बहुत समझ आ रहा है।
धन्यवाद।

 
charo 2023-10-30

आमतौर पर जिन बातों को लेकर जिज्ञासा थी लेकिन अच्छी तरह समझ नहीं पाता था, उनके बारे में बहुत कुछ जानने को मिला। हमेशा अच्छा कंटेंट देने के लिए धन्यवाद।