শূন্য থেকে একটি RAG তৈরি করা
আমার প্রথম AI ভার্সন আমাকে বলেছিল যে আমি একটি হাইড্রোলিক এক্সকাভেটর বিক্রি করি। আমি এক্সকাভেটর বিক্রি করি না। এটি অত্যন্ত আত্মবিশ্বাসের সাথে আমাকে একটি ভুয়া দাম এবং একটি ভুয়া বর্ণনা দিয়েছিল।
সেই মুহূর্তেই আমি শুধুমাত্র প্রম্পটের ওপর ভরসা করা বন্ধ করে দিয়েছিলাম। আমি একটি নিয়ম মেনে সিস্টেমটি পুনরায় তৈরি করেছি: এটি কেবল ক্যাটালগ থেকে উত্তর দেবে, অথবা একেবারেই উত্তর দেবে না।
Postgres এবং Python ব্যবহার করে আমি কীভাবে একটি নির্ভরযোগ্য RAG (Retrieval-Augmented Generation) সিস্টেম তৈরি করেছি, তা নিচে দেওয়া হলো।
ডেটা প্রস্তুতি বেশিরভাগ টিউটোরিয়াল কঠিন অংশটি বাদ দিয়ে দেয়: ডেটা ক্লিন করা। আমি আমার প্রক্রিয়াটিকে দুটি পর্যায়ে ভাগ করেছি:
- পর্যায় ১: ডিস্কে HTML ফাইল ডাউনলোড করা। আমি প্রতিটি ফাইলের উপরে কমেন্ট হিসেবে মেটাডেটা সেভ করি। এটি প্রক্রিয়াটিকে idempotent করে তোলে। যদি কোনো ফাইল আগে থেকেই থাকে, তবে আমি সেটি এড়িয়ে যাই।
- পর্যায় ২: অফলাইনে ফাইলগুলো পার্স (parse) করা। এটি HTML-কে একটি পরিষ্কার JSON ক্যাটালগে রূপান্তরিত করে।
পার্স করার পর আমি ফিল্ড কভারেজ পরীক্ষা করি। যদি ওজন বা দামের মতো কোনো ফিল্ড খালি থাকে, তবে আমি সাথে সাথে তা শনাক্ত করতে পারি। পরিষ্কার ডেটা বা ক্লিন ডেটাই হলো আসল কাজের জায়গা।
AI অংশ আমি প্রতিটি পণ্যকে একটি টেক্সট ব্লকে রূপান্তর করি এবং bge-m3 মডেল ব্যবহার করে সেটিকে একটি ভেক্টরে (vector) পরিবর্তন করি। আমি Postgres-এ pgvector এক্সটেনশন ব্যবহার করে এই ভেক্টরগুলো সংরক্ষণ করি।
পণ্য খোঁজার জন্য আমি একটি হাইব্রিড সার্চ পদ্ধতি ব্যবহার করি:
- Semantic Search: আপনার প্রশ্নের অর্থের সাথে মিলে যায় এমন পণ্য খুঁজে পেতে ভেক্টর ব্যবহার করে।
- Structured Filters: "Siemens motors under €2000"-এর মতো একটি কুয়েরিকে JSON-এ রূপান্তর করতে আমি একটি LLM ব্যবহার করি। এটি আমাকে ব্র্যান্ড এবং দামের জন্য সঠিক ফিল্টারসহ একটি SQL কুয়েরি চালাতে সাহায্য করে।
একটি মাত্র SQL স্টেটমেন্ট দিয়ে ফাজি সার্চ (fuzzy search) এবং হার্ড ফিল্টার—উভয়ই সম্পন্ন হয়। এটি সবকিছুকে সিঙ্ক্রোনাইজড রাখে।
গার্ডরেল বা সুরক্ষা ব্যবস্থা একটি ভালো RAG-এর জানা উচিত কখন চুপ থাকতে হবে। হ্যালুসিনেশন (hallucination) রোধ করতে আমি দুটি স্তর ব্যবহার করি:
- Similarity Threshold: প্রতিটি ম্যাচ একটি স্কোর পায়। যদি স্কোর নির্ধারিত সীমার নিচে থাকে, তবে আমি ফলাফলগুলো বাদ দিয়ে দিই। যদি কোনো ফলাফল পাস না করে, তবে সিস্টেমটি LLM-কে কল না করেই "not found" বলে দেয়। মডেল যদি ডেটা দেখতেই না পায়, তবে সে হ্যালুসিনেশন করতে পারবে না।
- Strict System Prompt: আমি মডেলটিকে নির্দেশ দিই যেন সে কেবল প্রদান করা পণ্যগুলো থেকেই উত্তর দেয়। যদি পণ্যগুলো অপ্রাসঙ্গিক হয়, তবে তাকে উত্তর দিতে অস্বীকার করতে হবে।
থ্রেশহোল্ড খারাপ আচরণ অসম্ভব করে তোলে। প্রম্পট কেবল ভালো আচরণের জন্য অনুরোধ করে। উভয়টিই ব্যবহার করুন।
কাজের সারসংক্ষেপ
- সতর্কতার সাথে সংগ্রহ করুন।
- সততার সাথে ক্লিন করুন।
- সহজভাবে এমবেড করুন।
- ডিজাইনের মাধ্যমেই প্রত্যাখ্যান নিশ্চিত করুন।
এই প্রত্যাখ্যান করার ক্ষমতাই সিস্টেমটিকে নির্ভরযোগ্য করে তোলে। বিশ্বাস আসে আর্কিটেকচার থেকে, মডেলকে ভালো হওয়ার অনুরোধ করার মাধ্যমে নয়।
উৎস: https://dev.to/utku_catal/building-a-rag-from-scratch-collect-clean-embed-refuse-20ob
ঐচ্ছিক লার্নিং কমিউনিটি: https://t.me/GyaanSetuAi