আমি বিষয়টি বোঝার জন্য পাইথনে একদম শুরু থেকে RAG তৈরি করেছি

আমি ছয় মাস প্রোডাকশনে LangChain ব্যবহার করেছি। আমি ব্যাখ্যা করতে পারছিলাম না এটি কীভাবে কাজ করে। আমি জানতাম না কেন আমি নির্দিষ্ট মেট্রিক্স বেছে নিয়েছি বা কীভাবে টেক্সট ভেক্টরে রূপান্তরিত হয়। লাইব্রেরিটি এর পেছনের লজিক লুকিয়ে রেখেছিল।

এটি ঠিক করার জন্য, আমি ফ্রেমওয়ার্কটি মুছে ফেলেছি। আমি ৫০০ লাইনের সাধারণ Python ব্যবহার করে একদম শুরু থেকে একটি RAG পাইপলাইন লিখেছি।

ম্যানুয়ালি এই স্ট্যাকটি তৈরি করার মাধ্যমে আমি যা শিখেছি তা নিচে দেওয়া হলো।

ব্ল্যাক বক্সের সমস্যা যখন আপনি হাই-লেভেল লাইব্রেরি ব্যবহার করেন, তখন আপনি নিয়ন্ত্রণ হারিয়ে ফেলেন। আমি দেখেছি মডেলগুলো hallucinate করছে বা ভুল সাইটেশন দিচ্ছে। আমি বুঝতে পারছিলাম না যে ত্রুটিটি chunker, embedding model নাকি prompt-এ ছিল।

যখন আপনি এটি নিজে তৈরি করেন, তখন প্রতিটি লেয়ার পরীক্ষা করা সম্ভব হয়। আপনি LLM-এ পাঠানো সঠিক chunk-গুলো প্রিন্ট করে দেখতে পারেন। একটি বাক্য ঠিক কোথায় ভেঙে গেছে তাও আপনি স্পষ্টভাবে দেখতে পারেন।

RAG-এর পাঁচটি লেয়ার RAG কোনো একটি অ্যালগরিদম নয়। এটি পাঁচটি ভিন্ন প্রক্রিয়ার একটি সমন্বয়:

  • Chunking: টেক্সট কীভাবে ভাগ করা হবে তা নির্ধারণ করা।
  • Embedding: টেক্সটকে গণিতে রূপান্তর করা।
  • Retrieval: সঠিক অংশগুলো খুঁজে বের করা।
  • Prompt Construction: মডেলটিকে কীভাবে আচরণ করতে হবে তা বলা।
  • Generation: চূড়ান্ত উত্তরটি পাওয়া।

তৈরির অভিজ্ঞতা থেকে শিক্ষা

১. Chunking হলো সবচেয়ে গুরুত্বপূর্ণ ধাপ বেশিরভাগ টিউটোরিয়ালে এটি বাদ দেওয়া হয়। আপনি যদি overlap ব্যবহার না করেন, তবে সীমানাগুলোতে (boundaries) আপনি context হারিয়ে ফেলবেন। আমি ক্যারেক্টার-লেভেল overlap সহ একটি sliding window ব্যবহার করেছি। এটি নিশ্চিত করে যে মডেলটি দুটি chunk-এর মধ্যে সংযোগ দেখতে পাচ্ছে।

২. Distance metrics গুরুত্বপূর্ণ আমি ভুল সার্চ রেজাল্ট ডিবাগ করতে ঘণ্টার পর ঘণ্টা ব্যয় করেছি। সমস্যাটি ডেটাতে ছিল না, সমস্যাটি ছিল মেট্রিক্সে। ChromaDB ডিফল্টভাবে L2 distance ব্যবহার করে। Semantic search-এর জন্য আপনার Cosine similarity প্রয়োজন। মাত্র এক লাইনের কোড সবকিছু বদলে দিয়েছে।

৩. Prompts-এর জন্য সীমাবদ্ধতা প্রয়োজন একটি LLM হলো কোনো কিছু সম্পন্ন করার মাধ্যম, কোনো দৈববাণী বা oracle নয়। আপনি যদি অস্পষ্ট প্রশ্ন করেন, তবে এটি একটি উত্তর বানিয়ে ফেলবে। আমি একটি কঠোর refusal template ব্যবহার করতে শিখেছি। আমি মডেলটিকে বলে দিয়েছি: "যদি context-এ উত্তরটি না থাকে, তবে বলো যে তুমি জানো না।" এর ফলে hallucination ৪০% থেকে কমে ৫%-এ নেমে এসেছে।

৪. আপনার রিকোয়েস্টগুলো ব্যাচ আকারে পাঠান প্রতিটি chunk-এর জন্য একটি করে HTTP রিকোয়েস্ট পাঠানো ধীরগতির। ব্যাচ আকারে পাঠালে এটি অনেক দ্রুত হয়। এটি লোকাল মডেলকে কাজের পাইপলাইন তৈরি করতে সাহায্য করে।

৫. নিচ থেকে উপরে পরীক্ষা করুন একদম শেষে টেস্ট লিখবেন না। প্রথমে আপনার chunker পরীক্ষা করুন। তারপর আপনার embedder পরীক্ষা করুন। তারপর আপনার store পরীক্ষা করুন। আপনি যদি শেষে পরীক্ষা করেন, তবে আপনি লজিকের পরিবর্তে বাগ (bugs) পরীক্ষা করছেন।

আপনি যদি অনুভব করেন যে আপনি আপনার AI stack সম্পর্কে সত্যিকার অর্থে বুঝতে পারছেন না, তবে এটি নিজে তৈরি করে দেখুন। কোড লেখা লক্ষ্য নয়, চিন্তা করার প্রক্রিয়াটিই হলো আসল লক্ষ্য।

উৎস: https://dev.to/avinash_zala_1c6f5e7c4af9/i-built-rag-from-scratch-in-python-to-understand-it-heres-what-i-learned-33kf

ঐচ্ছিক লার্নিং কমিউনিটি: https://t.me/GyaanSetuAi