Skip to content

Latest commit

 

History

History
273 lines (164 loc) · 32.8 KB

File metadata and controls

273 lines (164 loc) · 32.8 KB

रिट्रीवल ऑगमेंटेड जनरेशन (RAG) आणि व्हेक्टर डेटाबेस

रिट्रीवल ऑगमेंटेड जनरेशन (RAG) आणि व्हेक्टर डेटाबेस

शोध अनुप्रयोगांच्या धड्यात, आपण थोडक्यात शिकले की Large Language Models (LLMs) मध्ये आपला स्वत:चा डेटा कसा समाकलित करायचा. या धड्यात, आपण आपल्या LLM अनुप्रयोगात आपला डेटा ग्राउंडिंग करण्याच्या संकल्पना, प्रक्रियेची यांत्रिकी आणि डेटा संचयित करण्याच्या पद्धती, ज्यात एम्बेडिंग्ज आणि मजकूर दोन्ही समाविष्ट आहेत, यावर अधिक सखोलपणे चर्चा करू.

व्हिडिओ लवकरच येत आहे

परिचय

या धड्यात आपण खालील गोष्टी समजून घेऊ:

  • RAG म्हणजे काय आणि AI (कृत्रिम बुद्धिमत्ता) मध्ये का वापरले जाते याचा परिचय.

  • व्हेक्टर डेटाबेस म्हणजे काय आणि आपल्या अनुप्रयोगासाठी ते कसे तयार करावे.

  • RAG ला अनुप्रयोगात समाकलित करण्याचा व्यावहारिक उदाहरण.

शिकण्याची उद्दिष्टे

हा धडा पूर्ण केल्यानंतर, आपण हे करू शकाल:

  • डेटा रिट्रीवल आणि प्रक्रियेत RAG चे महत्त्व समजावून सांगणे.

  • RAG अनुप्रयोग सेटअप करणे आणि आपला डेटा LLM शी ग्राउंड करणे.

  • LLM अनुप्रयोगांमध्ये RAG आणि व्हेक्टर डेटाबेसचे प्रभावी समाकलन.

आमचे परिस्थिति: आमच्या स्वत:च्या डेटाने आपले LLM सुधारणे

या धड्यासाठी, आम्हाला शिक्षण स्टार्टअपमध्ये आपले स्वत:चे नोट्स जोडायचे आहेत, जेणेकरून चॅटबॉट वेगवेगळ्या विषयांवर अधिक माहिती मिळवू शकेल. आमच्याकडे असलेल्या नोट्सचा वापर करून, शिकणारे अधिक चांगल्या प्रकारे अभ्यास करू शकतील आणि वेगवेगळ्या विषयांचे समज घेण्यास मदत होईल, ज्यामुळे त्यांच्या परीक्षांसाठी पुनरावलोकन करणे सोपे होईल. आम्ही आमच्या परिसं हव्यासाठी वापरू:

  • Azure OpenAI: LLM जे आम्ही चॅटबॉट तयार करण्यासाठी वापरणार आहोत.

  • AI for beginners' lesson on Neural Networks: हा डेटा आमचा LLM ग्राउंड करण्यासाठी.

  • Azure AI Search आणि Azure Cosmos DB: आमचा डेटा संग्रहित करण्यासाठी आणि शोध अनुक्रम तयार करण्यासाठी व्हेक्टर डेटाबेस.

वापरकर्ते त्यांच्या नोट्समधून प्रॅक्टिस क्विझ तयार करू शकतात, पुनरावलोकन फ्‍लॅश कार्ड्स बनवू शकतात आणि संक्षिप्त सारांश तयार करू शकतात. सुरुवात करण्यासाठी, आपण पाहू या RAG काय आहे आणि ते कसे काम करते:

रिट्रीवल ऑगमेंटेड जनरेशन (RAG)

एक LLM-शक्ती असलेला चॅटबॉट वापरकर्ता प्रश्न प्रक्रिया करून उत्तरे तयार करतो. ते संवादात्मक असावे आणि विस्तृत विषयांवर वापरकर्त्यांशी संवाद साधतो. मात्र, त्याची उत्तरे दिलेल्या संदर्भापुरती आणि त्याच्या मूलभूत प्रशिक्षण डेटापुरती मर्यादित असतात. उदाहरणार्थ, GPT-4 चे ज्ञान कापणी सप्टेंबर 2021 आहे, म्हणजे त्याला त्या नंतर घडलेल्या घटनांची माहिती नाही. याशिवाय, LLM प्रशिक्षित करताना वापरलेला डेटा व्यावसायिक नोट्स किंवा कंपनीच्या उत्पादन मॅन्युअल सारखी गोपनीय माहिती वगळतो.

RAG कसे कार्य करतात

RAG कसे कार्य करतात हे दाखवणारी रेखाचित्र

समजा तुम्हाला तुमच्या नोट्सवरून क्विझ तयार करणारा चॅटबॉट तयार करायचा आहे, तर तुम्हाला ज्ञान आधाराशी कनेक्शन आवश्यक आहे. हेच RAG मदत करते. RAG खालीलप्रमाणे कार्य करतो:

  • ज्ञान आधार: रिट्रीवलपूर्वी, या दस्तऐवजांना अंतर्भूत करणे आणि पूर्वप्रक्रिया करणे आवश्यक आहे, सहसा मोठे दस्तऐवज छोटे तुकड्यांमध्ये विभागणे, त्यांना टेक्स्ट एम्बेडिंगमध्ये रूपांतरित करणे आणि डेटाबेसमध्ये संग्रहित करणे.

  • वापरकर्ता प्रश्न: वापरकर्ता एखादा प्रश्न विचारतो.

  • रिट्रीव्हल: जेव्हा वापरकर्ता प्रश्न विचारतो, तेव्हा एम्बेडिंग मॉडेल आमच्या ज्ञान आधारातून संबंधित माहिती मिळवून आणते, जी अधिक संदर्भ प्रदान करते आणि प्रॉम्प्टमध्ये समाविष्ट केली जाते.

  • ऑगमेंटेड जनरेशन: LLM त्याच्या उत्तरात रिट्रीव्ह झालेल्या डेटाच्या आधारावर सुधारणा करते. त्यामुळे उत्तर फक्त पूर्व-प्रशिक्षित डेटावरच आधारित नसून जोडलेल्या संदर्भातील संबंधित माहितीवरही आधारित असते. LLM नंतर वापरकर्त्याच्या प्रश्नाला उत्तर देतो.

RAG ची आर्किटेक्चर दाखवणारी रेखाचित्र

RAG ची आर्किटेक्चर ट्रान्सफॉर्मर्सचा वापर करून अंमलात आणली आहे, ज्यामध्ये दोन भाग असतात: एनकोडर आणि डीकोडर. उदाहरणार्थ, जेव्हा वापरकर्ता प्रश्न विचारतो, इनपुट टेक्स्ट 'एनकोड' करून अर्थ घेणाऱ्या व्हेक्टरमध्ये रूपांतरित केला जातो, नंतर या व्हेक्टरला आमच्या दस्तऐवज सूचकांकात 'डीकोड' केले जाते आणि वापरकर्ता प्रश्नाच्या आधारावर नवीन टेक्स्ट तयार करतो. LLM आउटपुट तयार करण्यासाठी एनकोडर-डीकोडर मॉडेल दोन्ही वापरतो.

RAG अंमलबजावणीसाठी प्रस्तावित पेपरनुसार दोन पद्धती आहेत: Retrieval-Augmented Generation for Knowledge intensive NLP (natural language processing software) Tasks:

  • RAG-Sequence: प्राप्त दस्तऐवजांचा वापर करून वापरकर्त्याच्या प्रश्नाचे उत्तम शक्य उत्तर भाकित करणे.

  • RAG-Token: दस्तऐवजांचा वापर पुढील टोकन निर्माण करण्यासाठी करणे, नंतर वापरकर्त्याच्या प्रश्नाला उत्तर देण्यासाठी त्यांना पुन्हा रिट्रीव्ह करणे.

तुम्ही RAG का वापराल?

  • माहिती समृद्धता: मजकूर उत्तरांना अद्ययावत आणि चालू ठेवण्यास मदत करते. त्यामुळे विशिष्ट क्षेत्राच्या कामगिरीत सुधारणा होते कारण ते अंतर्गत ज्ञान आधार वापरते.

  • वापरकर्ता प्रश्नांना संदर्भ देण्यासाठी ज्ञान आधारातील सत्यापित डेटा चा वापर करून बनावट माहिती कमी करते.

  • हे किमतीत किफायतशीर आहे कारण ते LLM चा फाइन-ट्यूनिंग करण्याच्या तुलनेत अधिक किफायतशीर आहेत.

ज्ञान आधार तयार करणे

आमचा अनुप्रयोग आमच्या वैयक्तिक डेटावर आधारित आहे, म्हणजेच "AI For Beginners" अभ्यासक्रमातील न्यूरल नेटवर्क धडा.

व्हेक्टर डेटाबेस

व्हेक्टर डेटाबेस पारंपारिक डेटाबेसपेक्षा वेगळा असून, हा एक विशेष डेटाबेस आहे जो एम्बेड केलेले व्हेक्टर संग्रहित, व्यवस्थापित आणि शोधण्यासाठी डिझाइन केलेला आहे. हे दस्तऐवजांचे संख्यात्मक प्रतिनिधित्व संग्रहित करतो. डेटा मध्ये संख्यात्मक एम्बेडिंग्जमध्ये विभागणी केल्याने आमच्या AI प्रणालीला डेटा अधिक समजणे आणि प्रक्रिया करणे सोपे होते.

आपल्या एम्बेडिंग्ज आम्ही व्हेक्टर डेटाबेसमध्ये संग्रहित करतो कारण LLMs ला इनपुट म्हणून स्वीकारण्याकरिता टोकनच्या संख्येची मर्यादा असते. पूर्ण एम्बेडिंग्ज LLM ला देऊ शकत नसल्याने, त्यांना तुकड्यांमध्ये विभागणे आवश्यक आहे आणि जेव्हा वापरकर्ता प्रश्न विचारतो, तेव्हा प्रश्नाशी सर्वाधिक संबंधित एम्बेडिंग्ज प्रॉम्प्टसह परत दिल्या जातात. तुकडे करणे टोकन्सच्या संख्येवर खर्च कमी करण्यासही मदत करते.

काही लोकप्रिय व्हेक्टर डेटाबेसमध्ये Azure Cosmos DB, Clarifyai, Pinecone, Chromadb, ScaNN, Qdrant आणि DeepLake यांचा समावेश आहे. तुम्ही Azure CLI वापरून Azure Cosmos DB मॉडेल तयार करू शकता खालील आदेशाद्वारे:

az login
az group create -n <resource-group-name> -l <location>
az cosmosdb create -n <cosmos-db-name> -r <resource-group-name>
az cosmosdb list-keys -n <cosmos-db-name> -g <resource-group-name>

मजकूरातून एम्बेडिंग्जपर्यंत

आपला डेटा संग्रहित करण्यापूर्वी, त्याला डेटाबेसमध्ये संग्रहित करण्यासाठी व्हेक्टर एम्बेडिंग्जमध्ये रूपांतरित करणे आवश्यक आहे. जर तुम्ही मोठ्या दस्तऐवजांवर किंवा लांब मजकूरावर काम करत असाल, तर तुम्ही अपेक्षित प्रश्नांनुसार त्यांना तुकड्यांमध्ये विभागू शकता. तुकडे करणे वाक्य पातळीवर किंवा परिच्छेद पातळीवर होऊ शकते. तुकड्यांभोवतीच्या शब्दांपासून अर्थ काढण्यासाठी, तुम्ही तुकड्याला इतर संदर्भ जोडू शकता, उदाहरणार्थ, दस्तऐवज शीर्षक जोडणे किंवा तुकड्याआधी किंवा नंतर काही मजकूर समाविष्ट करणे. तुम्ही डेटाला खालीलप्रमाणे तुकड्यांमध्ये विभागू शकता:

def split_text(text, max_length, min_length):
    words = text.split()
    chunks = []
    current_chunk = []

    for word in words:
        current_chunk.append(word)
        if len(' '.join(current_chunk)) < max_length and len(' '.join(current_chunk)) > min_length:
            chunks.append(' '.join(current_chunk))
            current_chunk = []

    # जर शेवटचा तुकडा किमान लांबीपर्यंत पोहोचला नसेल, तरीही तो जोडा
    if current_chunk:
        chunks.append(' '.join(current_chunk))

    return chunks

एकदा तुकड्यांमध्ये विभागल्यानंतर, आम्ही विविध एम्बेडिंग मॉडेल्स वापरून मजकूर एम्बेड करू शकतो. तुम्ही वापरू शकणारे काही मॉडेल्स म्हणजे: word2vec, OpenAI च्या ada-002, Azure Computer Vision आणि बरेच काही. वापरणाऱ्या मॉडेलची निवड तुमच्या वापराच्या भाषांवर, मजकूर/प्रतिमा/ऑडिओचा प्रकार, त्याचा इनपुट आकार आणि एम्बेडिंग आउटपुटच्या लांबीवर अवलंबून असेल.

OpenAI च्या text-embedding-ada-002 मॉडेलने एम्बेड केलेला मजकूराचा एक उदाहरण:

cat या शब्दाचा एम्बेडिंग

रिट्रीव्हल आणि व्हेक्टर शोध

जेव्हा वापरकर्ता प्रश्न विचारतो, तेव्हा रिट्रीव्हर क्वेरी एनकोडरचा वापर करून त्याला व्हेक्टरमध्ये रूपांतरित करतो, नंतर आमच्या दस्तऐवज शोध अनुक्रमणिकेत संबंधित व्हेक्टर शोधतो जे इनपुटशी संबंधित असतात. नंतर इनपुट व्हेक्टर आणि दस्तऐवज व्हेक्टर दोन्ही मजकूरात रूपांतरित करून ते LLM मध्ये पाठवले जातात.

रिट्रीव्हल

रिट्रीव्हल तेव्हाच होते जेव्हा सिस्टम जलदपणे त्या दस्तऐवजांना शोधते जे शोध निकष पूर्ण करतात. रिट्रीव्हरचे उद्दिष्ट असे दस्तऐवज मिळविणे आहे जे संदर्भ उपलब्ध करून देतात आणि LLM ला आपला डेटा ग्राउंड करण्यास मदत करतात.

आमच्या डेटाबेसमध्ये शोध करण्यासाठी अनेक पद्धती आहेत:

  • कीवर्ड शोध - मजकूर शोधांसाठी वापरले जाते.

  • व्हेक्टर शोध - दस्तऐवजांना टेक्स्टपासून व्हेक्टर प्रतिनिधित्वात रूपांतरित करण्यासाठी एम्बेडिंग मॉडेलचा वापर करते, ज्यामुळे शब्दांच्या अर्थाचा वापर करून समानार्थी शोध (semantic search) केला जातो. रिट्रीव्हल वापरकर्त्याच्या प्रश्नाशी सर्वाधिक जवळच्या व्हेक्टर असलेल्या दस्तऐवजांवरून केले जाते.

  • हायब्रिड - कीवर्ड आणि व्हेक्टर दोन्ही शोधांचे संयोजन.

रिट्रीव्हल करताना जर डेटाबेसमध्ये प्रश्नाशी संबंधित समान प्रतिसाद नसेल, तर सिस्टम सर्वोत्तम माहिती देते, मात्र तुम्ही संदर्भाच्या सुसंगततेसाठी कमाल अंतर सेट करू शकता किंवा कीवर्ड आणि व्हेक्टर शोध यांचे संयोजन करणारा हायब्रिड शोध वापरू शकता. या धड्यात आपण हायब्रिड शोध वापरणार आहोत, म्हणजे व्हेक्टर आणि कीवर्ड दोन्ही शोध. आपण आपला डेटा टुकड्यांसह तसेच एम्बेडिंग्जसह डेटा फ्रेममध्ये संग्रहित करू.

व्हेक्टर सादृश्यता

रिट्रीव्हर ज्ञान डेटाबेसमधून जवळच्या एम्बेडिंग्ज शोधतो, कारण ते समान मजकूर असतात. परिस्थितीत, जेव्हा वापरकर्ता प्रश्न विचारतो, तो प्रथम एम्बेड केला जातो आणि नंतर समान एम्बेडिंग्जशी जुळविला जातो. वेगवेगळ्या व्हेक्टरमधील सादृश्यतेसाठी सर्वसाधारणपणे वापरली जाणारी मोजमाप म्हणजे "कोसाइन सादृश्यता" (cosine similarity) जी दोन व्हेक्टरमधील कोनावर आधारित आहे.

आम्ही वापरू शकणाऱ्या इतर सादृश्यतेचे पर्याय म्हणजे युक्लिडियन अंतर जे दोन व्हेक्टरच्या शेवटी असलेल्या बिंदूतील सरळ रेषा आहे आणि डॉट प्रॉडक्ट जे दोन व्हेक्टरमधील अनुक्रमिक घटकांच्या गुणाकाराची बेरीज मोजते.

शोध अनुक्रमणिका

रिट्रीव्हल करताना, आपल्याला शोधास सक्षम करण्यासाठी आपल्याकडे ज्ञान आधारासाठी शोध अनुक्रमणिका तयार करणे आवश्यक आहे. अनुक्रमणिका आपल्या एम्बेडिंग्ज संग्रहित करते आणि मोठ्या डेटाबेसमध्येही सर्वाधिक संबंधित तुकडे पटकन परत आणू शकते. आपण स्थानिकरित्या आपली अनुक्रमणिका तयार करू शकता:

from sklearn.neighbors import NearestNeighbors

embeddings = flattened_df['embeddings'].to_list()

# शोध निर्देशांक तयार करा
nbrs = NearestNeighbors(n_neighbors=5, algorithm='ball_tree').fit(embeddings)

# निर्देशांक विचारण्यासाठी, आपण kneighbors पद्धत वापरू शकता
distances, indices = nbrs.kneighbors(embeddings)

पुनरवर्गीकरण

एकदा तुम्ही डेटाबेसमधून क्वेरी केल्यावर, कदाचित तुम्हाला निकाल सर्वाधिक संबंधिततेनुसार क्रमबद्ध करायचे असतील. पुनरवर्गीकरण करणारा LLM मशीन लर्निंगचा वापर करून शोध निकालांची संबंधितता सुधारतो आणि सर्वाधिक संबंधिततेपासून क्रम लावत आहे. Azure AI Search वापरताना, पुनरवर्गीकरण आपोआप सिमॅंटिक रीरँकर वापरून केले जाते. नजीकच्या शेजाऱ्यांचा वापर करून पुनरवर्गीकरण कसे काम करते याचे उदाहरण:

# सर्वात जुळणारे दस्तऐवज शोधा
distances, indices = nbrs.kneighbors([query_vector])

index = []
# सर्वात जुळणारे दस्तऐवज छापा
for i in range(3):
    index = indices[0][i]
    for index in indices[0]:
        print(flattened_df['chunks'].iloc[index])
        print(flattened_df['path'].iloc[index])
        print(flattened_df['distances'].iloc[index])
    else:
        print(f"Index {index} not found in DataFrame")

सर्व एकत्र आणणे

शेवटचा टप्पा म्हणजे आपला LLM समाकलित करणे जेणेकरून आपला डेटा ग्राउंड केलेल्या उत्तरांचा संदर्भ दिला जाईल. आपण हे खालीलप्रमाणे अंमलात आणू शकतो:

user_input = "what is a perceptron?"

def chatbot(user_input):
    # प्रश्नाला क्वेरी व्हेक्टरमध्ये रूपांतरित करा
    query_vector = create_embeddings(user_input)

    # सर्वाधिक सादृश्य दस्तऐवज शोधा
    distances, indices = nbrs.kneighbors([query_vector])

    # संदर्भ देण्यासाठी क्वेरीमध्ये दस्तऐवज जोडा
    history = []
    for index in indices[0]:
        history.append(flattened_df['chunks'].iloc[index])

    # इतिहास आणि वापरकर्त्याचा इनपुट एकत्र करा
    history.append(user_input)

    # संदेश ऑब्जेक्ट तयार करा
    messages=[
        {"role": "system", "content": "You are an AI assistant that helps with AI questions."},
        {"role": "user", "content": "\n\n".join(history) }
    ]

    # प्रतिसाद तयार करण्यासाठी चॅट पूर्णता वापरा
    response = openai.chat.completions.create(
        model="gpt-4",
        temperature=0.7,
        max_tokens=800,
        messages=messages
    )

    return response.choices[0].message

chatbot(user_input)

आमच्या अनुप्रयोगाचे मूल्यांकन

मूल्यांकन मेट्रिक्स

  • पुरवलेल्या प्रतिसादांची गुणवत्ता, जे नैसर्गिक, प्रवाही आणि मानवीसारखे वाटते.

  • डेटाची ग्राउंडेडनेस: प्रतिसाद पुरवलेल्या दस्तऐवजांवरून आला आहे का याचे मूल्यांकन.

  • संबंधितता: प्रतिसाद विचारलेल्या प्रश्नाशी जुळतो व संबंधित आहे का याचे मूल्यांकन.

  • प्रवाहीपणा - प्रतिसाद व्याकरणिकदृष्ट्या योग्य आहे का.

RAG (रिट्रीवल ऑगमेंटेड जनरेशन) आणि व्हेक्टर डेटाबेस वापरण्याचे वापर प्रकरणे

अनेक वेगवेगळ्या वापर प्रकरणे आहेत जेथे फंक्शन कॉल्स तुमचे अनुप्रयोग सुधारू शकतात:

  • प्रश्न आणि उत्तर: तुमच्या कंपनीचा डेटा एखाद्या चॅटबॉटमध्ये ग्राउंड करणे जे कर्मचारी प्रश्न विचारण्यासाठी वापरू शकतात.

  • शिफारस प्रणाली: जिथे तुम्ही अशा प्रणाली तयार करू शकता जी समान मूल्ये मिलवते उदा. चित्रपट, रेस्टॉरंट्स वगैरे.

  • चॅटबॉट सेवा: तुम्ही चॅटचा इतिहास संग्रहित करू शकता आणि वापरकर्त्याच्या डेटानुसार संभाषण वैयक्तिकृत करू शकता.

  • व्हेक्टर एम्बेडिंग्जवर आधारित प्रतिमा शोध, उपयोगी जेव्हा प्रतिमा ओळख आणि अनियमितता शोधणी केली जाते.

सारांश

आम्ही RAG च्या मुलभूत भागांवर चर्चा केली आहे, आपल्या डेटाला अनुप्रयोगात जोडणे, वापरकर्त्याचा प्रश्न आणि आउटपुट. RAG तयार करणे सोपे करण्यासाठी, तुम्ही Semanti Kernel, Langchain किंवा Autogen सारख्या फ्रेमवर्कचा वापर करू शकता.

असाइनमेंट

रिट्रीवल ऑगमेंटेड जनरेशन (RAG) ची शिकत राहण्यासाठी तुम्ही बनवू शकता:

  • तुमच्या पसंतीच्या फ्रेमवर्कचा वापर करून अनुप्रयोगासाठी फ्रंट-एंड तयार करा.

  • LangChain किंवा Semantic Kernel यापैकी कोणताही फ्रेमवर्क वापरा आणि आपला अनुप्रयोग पुनःनिर्माण करा.

धडा पूर्ण केल्याबद्दल अभिनंदन 👏.

शिक्षण येथे थांबत नाही, प्रवास सुरू ठेवा

हा धडा पूर्ण केल्यावर, आमच्या Generative AI Learning collection ला भेट द्या आणि तुमच्या जनरेटिव्ह AI ज्ञानाचा स्तर पुढे वाढवा!


अस्वीकरण: हे दस्तऐवज AI अनुवाद सेवा Co-op Translator चा वापर करून अनुवादित केलेले आहे. आम्ही अचूकतेसाठी प्रयत्न करतो, तरी कृपया लक्षात ठेवा की स्वयंचलित अनुवादांमध्ये चुका किंवा अचूकतेसंबंधी त्रुटी असू शकतात. मूळ दस्तऐवज त्याच्या स्थानिक भाषेत अधिकृत स्रोत मानला पाहिजे. महत्त्वाच्या माहितीकरिता व्यावसायिक मानवी अनुवाद करण्याचा सल्ला दिला जातो. या अनुवादाच्या वापरामुळे उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थलागीसाठी आम्ही जबाबदार नाही.