paint-brush
কিভাবে ColBERT ডেভেলপারদের RAG এর সীমা অতিক্রম করতে সাহায্য করেদ্বারা@datastax
3,242 পড়া
3,242 পড়া

কিভাবে ColBERT ডেভেলপারদের RAG এর সীমা অতিক্রম করতে সাহায্য করে

দ্বারা DataStax7m2024/03/21
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

ColBERT সম্বন্ধে জানুন, একটি BERT ভাষা মডেল ব্যবহার করে প্যাসেজের প্রাসঙ্গিকতা স্কোর করার একটি নতুন উপায় যা ঘন প্যাসেজ পুনরুদ্ধারের সাথে সমস্যাগুলির যথেষ্ট সমাধান করে৷
featured image - কিভাবে ColBERT ডেভেলপারদের RAG এর সীমা অতিক্রম করতে সাহায্য করে
DataStax HackerNoon profile picture
0-item


রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) এখন জেনারেটিভ আর্টিফিশিয়াল ইন্টেলিজেন্স (AI) অ্যাপ্লিকেশনের একটি আদর্শ অংশ । একটি ভেক্টর ডাটাবেস থেকে পুনরুদ্ধার করা প্রাসঙ্গিক প্রসঙ্গ সহ আপনার অ্যাপ্লিকেশন প্রম্পটের পরিপূরক নাটকীয়ভাবে নির্ভুলতা বাড়াতে এবং হ্যালুসিনেশন কমাতে পারে। এর মানে হল যে ভেক্টর অনুসন্ধান ফলাফলে প্রাসঙ্গিকতা বৃদ্ধির সাথে আপনার RAG অ্যাপ্লিকেশনের মানের সাথে সরাসরি সম্পর্ক রয়েছে।


RAG জনপ্রিয় এবং ক্রমবর্ধমান প্রাসঙ্গিক থাকার দুটি কারণ রয়েছে যদিও বড় ভাষা মডেল (LLMs) তাদের প্রসঙ্গ উইন্ডো বাড়ায় :

  1. LLM প্রতিক্রিয়া সময় এবং মূল্য উভয়ই প্রসঙ্গ দৈর্ঘ্যের সাথে রৈখিকভাবে বৃদ্ধি পায়।

  2. এলএলএমগুলি এখনও ব্যাপক প্রেক্ষাপট জুড়ে পুনরুদ্ধার এবং যুক্তি উভয়ের সাথে লড়াই করে।


কিন্তু RAG কোন জাদুর কাঠি নয়। বিশেষ করে, সবচেয়ে সাধারণ নকশা, ঘন প্যাসেজ পুনরুদ্ধার (DPR), একটি একক এম্বেডিং ভেক্টর হিসাবে প্রশ্ন এবং প্যাসেজ উভয়কেই উপস্থাপন করে এবং স্কোর প্রাসঙ্গিকতার জন্য সহজবোধ্য কোসাইন সাদৃশ্য ব্যবহার করে। এর মানে ডিপিআর সমস্ত প্রাসঙ্গিক অনুসন্ধান পদ চিনতে প্রশিক্ষণের প্রশস্ততা সহ এমবেডিং মডেলের উপর অনেক বেশি নির্ভর করে।


দুর্ভাগ্যবশত, অফ-দ্য-শেল্ফ মডেলগুলি নাম সহ অস্বাভাবিক পদগুলির সাথে লড়াই করে, যা সাধারণত তাদের প্রশিক্ষণের ডেটাতে থাকে না। ডিপিআর চঙ্কিং কৌশলের প্রতিও অতিসংবেদনশীল হতে থাকে, যার কারণে একটি প্রাসঙ্গিক উত্তরণ মিস হতে পারে যদি এটি প্রচুর অপ্রাসঙ্গিক তথ্য দ্বারা বেষ্টিত থাকে। এই সবগুলিই অ্যাপ্লিকেশন বিকাশকারীর উপর "প্রথমবার এটি সঠিকভাবে পেতে" একটি বোঝা তৈরি করে কারণ একটি ভুলের ফলে সাধারণত সূচীটিকে স্ক্র্যাচ থেকে পুনর্নির্মাণের প্রয়োজন হয়৷

ColBERT এর সাথে DPR এর চ্যালেঞ্জগুলি সমাধান করা

ColBERT হল একটি BERT ল্যাঙ্গুয়েজ মডেল ব্যবহার করে প্যাসেজ প্রাসঙ্গিকতা স্কোর করার একটি নতুন উপায় যা DPR এর সাথে সমস্যাগুলিকে যথেষ্টভাবে সমাধান করে। প্রথম ColBERT কাগজের এই চিত্রটি দেখায় কেন এটি এত উত্তেজনাপূর্ণ:


এটি MS-MARCO ডেটাসেটের জন্য অন্যান্য অত্যাধুনিক সমাধানগুলির সাথে ColBERT-এর কর্মক্ষমতা তুলনা করে। (MS-MARCO হল Bing প্রশ্নের একটি সেট যার জন্য মাইক্রোসফ্ট হাত দিয়ে সবচেয়ে প্রাসঙ্গিক প্যাসেজগুলি স্কোর করেছে৷ এটি একটি ভাল পুনরুদ্ধার মানদণ্ড৷) নীচে এবং ডানদিকে ভাল৷


সংক্ষেপে, ColBERT দেরীতে সামান্য বৃদ্ধির খরচে বেশিরভাগ উল্লেখযোগ্যভাবে আরও জটিল সমাধানের ক্ষেত্রে হাতের নাগালে পারফর্ম করে।


এটি পরীক্ষা করার জন্য, আমি একটি ডেমো তৈরি করেছি এবং ada002 DPR এবং ColBERT উভয়ের সাথে 1,000টির বেশি উইকিপিডিয়া নিবন্ধগুলিকে সূচিত করেছি। আমি দেখেছি যে ColBERT অস্বাভাবিক অনুসন্ধান পদগুলিতে উল্লেখযোগ্যভাবে ভাল ফলাফল প্রদান করে।


নিম্নলিখিত স্ক্রিনশটটি দেখায় যে ডিপিআর আব্রাহাম লিঙ্কনের সহযোগী উইলিয়াম এইচ হারন্ডনের অস্বাভাবিক নাম চিনতে ব্যর্থ হয়েছে, যেখানে ColBERT স্প্রিংফিল্ড নিবন্ধে উল্লেখ খুঁজে পেয়েছে। এছাড়াও মনে রাখবেন যে ColBERT এর নং 2 ফলাফল একটি ভিন্ন উইলিয়ামের জন্য, যদিও DPR-এর কোনো ফলাফলই প্রাসঙ্গিক নয়।


উপরের ছবিতে জুম ইন করুন


ColBERT প্রায়শই ঘন মেশিন লার্নিং জার্গনে বর্ণনা করা হয়, কিন্তু এটি আসলে খুব সোজা। আমি দেখাব কিভাবে ColBERT পুনরুদ্ধার এবং DataStax Astra DB- তে Python এবং Cassandra Query Language (CQL) এর কয়েকটি লাইন দিয়ে স্কোরিং প্রয়োগ করা যায়।


বড় ধারণা

প্রথাগত, একক-ভেক্টর-ভিত্তিক ডিপিআরের পরিবর্তে যা প্যাসেজগুলিকে একটি একক "এম্বেডিং" ভেক্টরে পরিণত করে, ColBERT প্যাসেজে প্রতিটি টোকেনের জন্য একটি প্রাসঙ্গিকভাবে প্রভাবিত ভেক্টর তৈরি করে। 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 অপারেটর এবং ভেক্টর সাদৃশ্যের সবচেয়ে সাধারণ পরিমাপ ।)


এটাই হল — আপনি পাইথনের চার লাইনে ColBERT স্কোরিং প্রয়োগ করতে পারেন! এখন আপনি কোলবার্টকে 99% লোকের চেয়ে ভাল বোঝেন যারা X-এ এটি সম্পর্কে পোস্ট করছেন (আগে টুইটার নামে পরিচিত)।


ColBERT কাগজপত্রের বাকি অংশগুলির সাথে ডিল করে:

  1. প্রদত্ত ডেটা সেটের জন্য সর্বোত্তম এম্বেডিং তৈরি করতে আপনি কীভাবে BERT মডেলটিকে সূক্ষ্ম-টিউন করবেন?
  2. আপনি কীভাবে নথির সেটকে সীমাবদ্ধ করবেন যার জন্য আপনি এখানে দেখানো (অপেক্ষাকৃত ব্যয়বহুল) স্কোর গণনা করেন?


প্রথম প্রশ্নটি ঐচ্ছিক এবং এই লেখার সুযোগের বাইরে। আমি পূর্বপ্রশিক্ষিত ColBERT চেকপয়েন্ট ব্যবহার করব। কিন্তু দ্বিতীয়টি DataStax Astra DB এর মতো ভেক্টর ডাটাবেসের সাথে করা সহজ।

Astra DB-তে ColBERT

ColBERT-এর জন্য RAGatouille নামে একটি জনপ্রিয় পাইথন অল-ইন-ওয়ান লাইব্রেরি রয়েছে; যাইহোক, এটি একটি স্ট্যাটিক ডেটাসেট অনুমান করে। RAG অ্যাপ্লিকেশনগুলির শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে একটি হল রিয়েল টাইমে গতিশীলভাবে পরিবর্তিত ডেটাতে সাড়া দেওয়া। তাই পরিবর্তে, আমি প্রতিটি সাবভেক্টরের জন্য সেরা প্রার্থীদের কাছে স্কোর করার জন্য প্রয়োজনীয় নথিগুলির সেট সংকুচিত করতে Astra এর ভেক্টর সূচক ব্যবহার করতে যাচ্ছি।

একটি 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' };


ColBERT লাইব্রেরি ইনস্টল করার পরে ( pip install colbert-ai ) এবং পূর্বপ্রশিক্ষিত BERT চেকপয়েন্ট ডাউনলোড করার পরে, আমি এই টেবিলগুলিতে নথি লোড করতে পারি:


 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)])


(আমি একটি ডেডিকেটেড মডিউলে আমার ডিবি লজিক এনক্যাপসুলেট করতে চাই; আপনি আমার গিটহাব রিপোজিটরিতে সম্পূর্ণ উত্স অ্যাক্সেস করতে পারেন।)

পুনরুদ্ধার

তারপর পুনরুদ্ধার এই মত দেখায়:


 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

এই নিবন্ধটি এবং লিঙ্কযুক্ত সংগ্রহস্থলটি সংক্ষিপ্তভাবে পরিচয় করিয়ে দেয় কিভাবে ColBERT কাজ করে। আপনি আপনার নিজের ডেটা দিয়ে এটি আজই বাস্তবায়ন করতে পারেন এবং অবিলম্বে ফলাফল দেখতে পারেন। AI-তে সবকিছুর মতোই, সর্বোত্তম অনুশীলনগুলি প্রতিদিন পরিবর্তিত হচ্ছে এবং নতুন কৌশলগুলি প্রতিনিয়ত উদ্ভূত হচ্ছে।


অত্যাধুনিক অবস্থার সাথে তাল মিলিয়ে চলাকে আরও সহজ করতে, DataStax এটি এবং অন্যান্য উন্নতিগুলিকে RAGStack- এ রোল করছে, আমাদের উৎপাদন-প্রস্তুত RAG লাইব্রেরি ল্যাংচেইন এবং LlamaIndex-এর সাহায্যে। আমাদের লক্ষ্য হল ডেভেলপারদের RAG অ্যাপ্লিকেশনগুলির জন্য একটি সামঞ্জস্যপূর্ণ লাইব্রেরি প্রদান করা যা তাদের নতুন কার্যকারিতার ধাপে ধাপে নিয়ন্ত্রণে রাখে। কৌশল এবং লাইব্রেরিতে অগণিত পরিবর্তনের সাথে তাল মিলিয়ে চলার পরিবর্তে, আপনার একটি একক স্ট্রীম রয়েছে, যাতে আপনি আপনার অ্যাপ্লিকেশন তৈরিতে ফোকাস করতে পারেন। আপনি আজই RAGStack ব্যবহার করতে পারেন LangChain এবং LlamaIndex-এর জন্য সর্বোত্তম অনুশীলনগুলিকে বাক্সের বাইরে অন্তর্ভুক্ত করতে; ColBERT এর মত অগ্রগতি আসন্ন রিলিজে RAGstack-এ আসবে।


জোনাথন এলিস, ডেটাস্ট্যাক্স দ্বারা


এছাড়াও এখানে উপস্থিত হয়.