paint-brush
कैसे ColBERT डेवलपर्स को RAG की सीमाओं को पार करने में मदद करता हैद्वारा@datastax
3,242 रीडिंग
3,242 रीडिंग

कैसे ColBERT डेवलपर्स को RAG की सीमाओं को पार करने में मदद करता है

द्वारा DataStax7m2024/03/21
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

कोलबर्ट के बारे में जानें, जो बीईआरटी भाषा मॉडल का उपयोग करके गद्यांश प्रासंगिकता स्कोर करने का एक नया तरीका है जो सघन गद्यांश पुनर्प्राप्ति के साथ समस्याओं को काफी हद तक हल करता है।
featured image - कैसे ColBERT डेवलपर्स को RAG की सीमाओं को पार करने में मदद करता है
DataStax HackerNoon profile picture
0-item


पुनर्प्राप्ति संवर्धित पीढ़ी (आरएजी) अब जनरेटिव आर्टिफिशियल इंटेलिजेंस (एआई) अनुप्रयोगों का एक मानक हिस्सा है। वेक्टर डेटाबेस से प्राप्त प्रासंगिक संदर्भ के साथ अपने एप्लिकेशन प्रॉम्प्ट को पूरक करने से नाटकीय रूप से सटीकता बढ़ सकती है और मतिभ्रम कम हो सकता है। इसका मतलब यह है कि वेक्टर खोज परिणामों में बढ़ती प्रासंगिकता का आपके RAG एप्लिकेशन की गुणवत्ता से सीधा संबंध है।


बड़े भाषा मॉडल (एलएलएम) अपनी संदर्भ विंडो बढ़ाने के बावजूद भी आरएजी के लोकप्रिय और तेजी से प्रासंगिक बने रहने के दो कारण हैं:

  1. एलएलएम प्रतिक्रिया समय और कीमत दोनों संदर्भ लंबाई के साथ रैखिक रूप से बढ़ते हैं।

  2. एलएलएम अभी भी बड़े संदर्भों में पुनर्प्राप्ति और तर्क दोनों के साथ संघर्ष करते हैं।


लेकिन RAG कोई जादू की छड़ी नहीं है. विशेष रूप से, सबसे आम डिज़ाइन, सघन मार्ग पुनर्प्राप्ति (डीपीआर), एक एकल एम्बेडिंग वेक्टर के रूप में क्वेरी और मार्ग दोनों का प्रतिनिधित्व करता है और प्रासंगिकता स्कोर करने के लिए सीधी कोसाइन समानता का उपयोग करता है। इसका मतलब यह है कि डीपीआर सभी प्रासंगिक खोज शब्दों को पहचानने के लिए प्रशिक्षण की व्यापकता वाले एम्बेडिंग मॉडल पर बहुत अधिक निर्भर करता है।


दुर्भाग्य से, ऑफ-द-शेल्फ मॉडल नामों सहित असामान्य शब्दों के साथ संघर्ष करते हैं, जो आमतौर पर उनके प्रशिक्षण डेटा में नहीं होते हैं। डीपीआर भी चंकिंग रणनीति के प्रति अतिसंवेदनशील होता है, जिसके कारण यदि यह बहुत सारी अप्रासंगिक जानकारी से घिरा हो तो एक प्रासंगिक मार्ग छूट सकता है। यह सब एप्लिकेशन डेवलपर पर "पहली बार में इसे ठीक करने" का बोझ पैदा करता है, क्योंकि एक गलती के परिणामस्वरूप आमतौर पर इंडेक्स को नए सिरे से बनाने की आवश्यकता होती है।

कोलबर्ट के साथ डीपीआर की चुनौतियों का समाधान

ColBERT , BERT भाषा मॉडल का उपयोग करके गद्यांश प्रासंगिकता को स्कोर करने का एक नया तरीका है जो डीपीआर के साथ समस्याओं को काफी हद तक हल करता है। पहले कोलबर्ट पेपर का यह चित्र दिखाता है कि यह इतना रोमांचक क्यों है:


यह MS-MARCO डेटासेट के लिए अन्य अत्याधुनिक समाधानों के साथ ColBERT के प्रदर्शन की तुलना करता है। (एमएस-मार्को बिंग क्वेरीज़ का एक सेट है जिसके लिए माइक्रोसॉफ्ट ने सबसे अधिक प्रासंगिक अंशों को हाथ से स्कोर किया है। यह बेहतर पुनर्प्राप्ति बेंचमार्क में से एक है।) नीचे और दाईं ओर बेहतर है।


संक्षेप में, कोलबर्ट विलंबता में थोड़ी सी वृद्धि की कीमत पर अधिकतर जटिल समाधानों के क्षेत्र में आसानी से बेहतर प्रदर्शन करता है।


इसका परीक्षण करने के लिए, मैंने एक डेमो बनाया और ada002 DPR और ColBERT दोनों के साथ 1,000 से अधिक विकिपीडिया लेखों को अनुक्रमित किया। मैंने पाया कि कोलबर्ट असामान्य खोज शब्दों पर काफी बेहतर परिणाम देता है।


निम्नलिखित स्क्रीनशॉट से पता चलता है कि डीपीआर अब्राहम लिंकन के सहयोगी विलियम एच. हेरंडन के असामान्य नाम को पहचानने में विफल रहता है, जबकि कोलबर्ट को स्प्रिंगफील्ड लेख में संदर्भ मिलता है। यह भी ध्यान दें कि कोलबर्ट का नंबर 2 परिणाम एक अलग विलियम के लिए है, जबकि डीपीआर का कोई भी परिणाम प्रासंगिक नहीं है।


ऊपर की छवि पर ज़ूम करें


कोलबर्ट को अक्सर गहन मशीन लर्निंग शब्दजाल में वर्णित किया जाता है, लेकिन यह वास्तव में बहुत सीधा है। मैं दिखाऊंगा कि पायथन और कैसेंड्रा क्वेरी लैंग्वेज (सीक्यूएल) की केवल कुछ पंक्तियों के साथ डेटास्टैक्स एस्ट्रा डीबी पर कोलबर्ट पुनर्प्राप्ति और स्कोरिंग को कैसे कार्यान्वित किया जाए।


बड़ा विचार

पारंपरिक, एकल-वेक्टर-आधारित डीपीआर के बजाय जो अनुच्छेदों को एकल "एम्बेडिंग" वेक्टर में बदल देता है, कोलबर्ट अनुच्छेदों में प्रत्येक टोकन के लिए एक प्रासंगिक रूप से प्रभावित वेक्टर उत्पन्न करता है। ColBERT इसी प्रकार क्वेरी में प्रत्येक टोकन के लिए वेक्टर उत्पन्न करता है।


(टोकनीकरण का तात्पर्य एलएलएम द्वारा प्रसंस्करण से पहले इनपुट को शब्दों के अंशों में विभाजित करना है। ओपनएआई टीम के संस्थापक सदस्य आंद्रेज कारपैथी ने अभी एक उत्कृष्ट वीडियो जारी किया है कि यह कैसे काम करता है। )


फिर, प्रत्येक दस्तावेज़ का स्कोर किसी भी दस्तावेज़ एम्बेडिंग में एम्बेड की गई प्रत्येक क्वेरी की अधिकतम समानता का योग है:


 def maxsim(qv, document_embeddings): return max(qv @ dv for dv in document_embeddings) def score(query_embeddings, document_embeddings): return sum(maxsim(qv, document_embeddings) for qv in query_embeddings)


(@ डॉट उत्पाद के लिए PyTorch ऑपरेटर है और वेक्टर समानता का सबसे सामान्य माप है।)


बस इतना ही - आप पायथन की चार पंक्तियों में कोलबर्ट स्कोरिंग लागू कर सकते हैं! अब आप कोलबर्ट को एक्स (पहले ट्विटर के नाम से जाना जाता था) पर इसके बारे में पोस्ट करने वाले 99% लोगों से बेहतर समझते हैं।


कोलबर्ट के शेष कागजात निम्नलिखित से संबंधित हैं:

  1. किसी दिए गए डेटा सेट के लिए सर्वोत्तम एम्बेडिंग उत्पन्न करने के लिए आप BERT मॉडल को कैसे ठीक करते हैं?
  2. आप दस्तावेज़ों के उस सेट को कैसे सीमित करते हैं जिसके लिए आप यहां दिखाए गए (अपेक्षाकृत महंगे) स्कोर की गणना करते हैं?


पहला प्रश्न वैकल्पिक है और इस आलेख के दायरे से बाहर है। मैं पूर्व-प्रशिक्षित कोलबर्ट चेकपॉइंट का उपयोग करूंगा। लेकिन दूसरा डेटास्टैक्स एस्ट्रा डीबी जैसे वेक्टर डेटाबेस के साथ करना सीधा है।

एस्ट्रा डीबी पर कोलबर्ट

कोलबर्ट के लिए RAGatouille नामक एक लोकप्रिय पायथन ऑल-इन-वन लाइब्रेरी है; हालाँकि, यह एक स्थिर डेटासेट मानता है। RAG अनुप्रयोगों की शक्तिशाली विशेषताओं में से एक वास्तविक समय में गतिशील रूप से बदलते डेटा पर प्रतिक्रिया देना है। इसलिए इसके बजाय, मैं प्रत्येक सबवेक्टर के लिए सर्वश्रेष्ठ उम्मीदवारों को स्कोर करने के लिए आवश्यक दस्तावेजों के सेट को सीमित करने के लिए एस्ट्रा के वेक्टर इंडेक्स का उपयोग करने जा रहा हूं।

RAG एप्लिकेशन में ColBERT जोड़ते समय दो चरण होते हैं: अंतर्ग्रहण और पुनर्प्राप्ति।

घूस

क्योंकि प्रत्येक दस्तावेज़ खंड के साथ कई एम्बेडिंग जुड़ी होंगी, मुझे दो तालिकाओं की आवश्यकता होगी:


 CREATE TABLE chunks ( title text, part int, body text, PRIMARY KEY (title, part) ); CREATE TABLE colbert_embeddings ( title text, part int, embedding_id int, bert_embedding vector<float, 128>, PRIMARY KEY (title, part, embedding_id) ); CREATE INDEX colbert_ann ON colbert_embeddings(bert_embedding) WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT' };


कोलबर्ट लाइब्रेरी स्थापित करने ( pip install colbert-ai ) और पूर्व-प्रशिक्षित बीईआरटी चेकपॉइंट डाउनलोड करने के बाद, मैं इन तालिकाओं में दस्तावेज़ लोड कर सकता हूं:


 from colbert.infra.config import ColBERTConfig from colbert.modeling.checkpoint import Checkpoint from colbert.indexing.collection_encoder import CollectionEncoder from cassandra.concurrent import execute_concurrent_with_args from db import DB def encode_and_save(title, passages): db = DB() cf = ColBERTConfig(checkpoint='checkpoints/colbertv2.0') cp = Checkpoint(cf.checkpoint, colbert_config=cf) encoder = CollectionEncoder(cf, cp) # encode_passages returns a flat list of embeddings and a list of how many correspond to each passage embeddings_flat, counts = encoder.encode_passages(passages) # split up embeddings_flat into a nested list start_indices = [0] + list(itertools.accumulate(counts[:-1])) embeddings_by_part = [embeddings_flat[start:start+count] for start, count in zip(start_indices, counts)] # insert into the database for part, embeddings in enumerate(embeddings_by_part): execute_concurrent_with_args(db.session, db.insert_colbert_stmt, [(title, part, i, e) for i, e in enumerate(embeddings)])


(मैं अपने DB तर्क को एक समर्पित मॉड्यूल में समाहित करना पसंद करता हूं; आप मेरे GitHub रिपॉजिटरी में पूर्ण स्रोत तक पहुंच सकते हैं।)

बहाली

फिर पुनर्प्राप्ति इस तरह दिखती है:


 def retrieve_colbert(query): db = DB() cf = ColBERTConfig(checkpoint='checkpoints/colbertv2.0') cp = Checkpoint(cf.checkpoint, colbert_config=cf) encode = lambda q: cp.queryFromText([q])[0] query_encodings = encode(query) # find the most relevant documents for each query embedding. using a set # handles duplicates so we don't retrieve the same one more than once docparts = set() for qv in query_encodings: rows = db.session.execute(db.query_colbert_ann_stmt, [list(qv)]) docparts.update((row.title, row.part) for row in rows) # retrieve these relevant documents and score each one scores = {} for title, part in docparts: rows = db.session.execute(db.query_colbert_parts_stmt, [title, part]) embeddings_for_part = [tensor(row.bert_embedding) for row in rows] scores[(title, part)] = score(query_encodings, embeddings_for_part) # return the source chunk for the top 5 return sorted(scores, key=scores.get, reverse=True)[:5]


यहां सबसे प्रासंगिक-दस्तावेज़ भाग ( db.query_colbert_ann_stmt ) के लिए क्वेरी निष्पादित की जा रही है:


 SELECT title, part FROM colbert_embeddings ORDER BY bert_embedding ANN OF ? LIMIT 5


बुनियादी बातों से परे: RAGStack

यह आलेख और लिंक किया गया भंडार संक्षेप में बताता है कि कोलबर्ट कैसे काम करता है। आप इसे आज ही अपने डेटा के साथ लागू कर सकते हैं और तत्काल परिणाम देख सकते हैं। एआई में हर चीज की तरह, सर्वोत्तम प्रथाएं प्रतिदिन बदल रही हैं, और नई तकनीकें लगातार उभर रही हैं।


अत्याधुनिक स्थिति के साथ तालमेल बनाए रखना आसान बनाने के लिए, डेटास्टैक्स इसे और अन्य संवर्द्धन को RAGStack में ला रहा है, जो हमारी उत्पादन-तैयार RAG लाइब्रेरी है, जो लैंगचेन और लामाइंडेक्स का लाभ उठा रही है। हमारा लक्ष्य डेवलपर्स को RAG अनुप्रयोगों के लिए एक सुसंगत लाइब्रेरी प्रदान करना है जो उन्हें नई कार्यक्षमता के चरण-अप के नियंत्रण में रखता है। तकनीकों और पुस्तकालयों में असंख्य परिवर्तनों के साथ तालमेल बिठाने के बजाय, आपके पास एक ही स्ट्रीम है, जिससे आप अपने एप्लिकेशन के निर्माण पर ध्यान केंद्रित कर सकते हैं। लैंगचेन और लामाइंडेक्स के लिए सर्वोत्तम प्रथाओं को शामिल करने के लिए आप आज RAGStack का उपयोग कर सकते हैं; कोलबर्ट जैसे अग्रिम आगामी रिलीज में रैगस्टैक में आएंगे।


जोनाथन एलिस, डेटास्टैक्स द्वारा


यहाँ भी दिखाई देता है.