আপনার তৈরি করা চ্যাটবট বা সার্চ ইঞ্জিন যখন লম্বা ডকুমেন্ট থেকে সঠিক উত্তর খুঁজে পায় না, তখন ভেক্টর ডেটাবেস সেই সমস্যার সমাধান দেয়। এটি টেক্সট, ছবি বা অডিওকে সংখ্যার অ্যারেতে রূপান্তর করে এবং অতি দ্রুত মিল খুঁজে বের করে। এই টিউটোরিয়ালে আমরা দেখব RAG পদ্ধতিতে ভেক্টর ডেটাবেসের ভূমিকা, এর পেছনের ধারণা, জনপ্রিয় টুল এবং হাতে–কলমে কোড উদাহরণ।
ভেক্টর ডেটাবেস কী?
ভেক্টর ডেটাবেস হল এমন একটি স্টোরেজ সিস্টেম যা ডেটাকে উচ্চমাত্রার ভেক্টর (সংখ্যার অ্যারে) হিসেবে সংরক্ষণ করে। প্রচলিত ডেটাবেস যেখানে ঠিক মিল (exact match) খোঁজে, ভেক্টর ডেটাবেস শব্দের অর্থ বা কনটেক্সটের ভিত্তিতে কাছাকাছি মিল (approximate nearest neighbor) খুঁজে দেয়। প্রতিটি ডেটা পয়েন্টকে একটি এম্বেডিং মডেল (যেমন OpenAI Ada, Sentence–Transformers) ভেক্টরে রূপান্তর করে, আর সেই ভেক্টরগুলোর মধ্যে দূরত্ব মেপে সাদৃশ্য নির্ণয় করা হয়।
এর প্রধান তিনটি উপাদান হলো:
- এম্বেডিং জেনারেটর: টেক্সট/ইমেজকে ভেক্টরে রূপান্তর করে।
- ইনডেক্সিং ইঞ্জিন: ভেক্টরগুলোকে এমনভাবে সাজায় যাতে দ্রুত খোঁজা যায় (FAISS, HNSW ইত্যাদি অ্যালগরিদম)।
- মেটাডেটা স্টোর: ভেক্টরের পাশাপাশি টাইটেল, সোর্স, ট্যাগের মতো অতিরিক্ত তথ্য জমা রাখে।
RAG-এ ভেক্টর ডেটাবেস কেন অপরিহার্য?
Retrieval–Augmented Generation (RAG) পদ্ধতিতে LLM–কে বাইরের জ্ঞান সরবরাহ করতে একটি রিট্রিভাল স্টেপ জুড়ে দেওয়া হয়। এই ধাপে ভেক্টর ডেটাবেসই মুখ্য ভূমিকা পালন করে। ইউজারের প্রশ্নকে এম্বেডিং-এ রূপান্তর করে ডেটাবেস থেকে সবচেয়ে প্রাসঙ্গিক ডকুমেন্ট বা চাঙ্ক বের করা হয়, তারপর সেগুলো LLM–এর প্রম্পটে জুড়ে দিয়ে সঠিক ও আপ–টু–ডেট উত্তর তৈরি করা হয়।
RAG–এ ভেক্টর ডেটাবেস ব্যবহারের সুবিধা:
- সিমান্টিক সার্চ: শুধু কীওয়ার্ড নয়, অর্থ বুঝে মিল খোঁজে।
- রিয়েল–টাইম পারফরম্যান্স: লক্ষ লক্ষ ভেক্টরের মধ্যেও মিলিসেকেন্ডে উত্তর দেয়।
- ডাইনামিক নলেজ বেস: সহজেই নতুন ডেটা যোগ করা যায়, মডেল রি–ট্রেনিং লাগে না।
- হ্যালুসিনেশন কমানো: নির্দিষ্ট ডকুমেন্ট থেকে তথ্য টেনে আনে, ফলে LLM বানানো উত্তর দেওয়ার সম্ভাবনা কমে।
হাতে–কলমে: ChromaDB দিয়ে ভেক্টর সার্চ
অনেক ভেক্টর ডেটাবেস আছে — Pinecone (ক্লাউড–বেসড), Weaviate, FAISS (লাইব্রেরি), Qdrant ইত্যাদি। সহজে শুরু করতে আমরা ChromaDB ব্যবহার করব, যা ওপেন–সোর্স ও পাইথনে সহজেই চলে।
# প্রথমে লাইব্রেরি ইনস্টল: pip install chromadb sentence-transformers
import chromadb
from sentence_transformers import SentenceTransformer
# এম্বেডিং মডেল সেটআপ
embedder = SentenceTransformer('all-MiniLM-L6-v2')
# Chroma ক্লায়েন্ট তৈরি (ইন–মেমোরি/পারসিস্ট)
client = chromadb.PersistentClient(path="./my_vectordb")
# একটি কালেকশন (টেবিলের মতো) তৈরি বা লোড
collection = client.get_or_create_collection(
name="rag_docs",
metadata={"hnsw:space": "cosine"} # সিমিলারিটি মেট্রিক
)
# ডকুমেন্ট যোগ করা
documents = [
"বাংলাদেশের রাজধানী ঢাকা।",
"ভারতের রাজধানী নয়াদিল্লি।",
"ফ্রান্সের রাজধানী প্যারিস।"
]
ids = ["doc1", "doc2", "doc3"]
# এম্বেডিং জেনারেট করে ইনসার্ট
embeddings = embedder.encode(documents).tolist()
collection.add(
embeddings=embeddings,
documents=documents,
ids=ids
)
# প্রশ্ন থেকে এম্বেডিং তৈরি করে সার্চ
query = "দক্ষিণ এশিয়ার সবচেয়ে বড় দেশের রাজধানী কী?"
query_embedding = embedder.encode([query]).tolist()
results = collection.query(
query_embeddings=query_embedding,
n_results=2
)
print("প্রাপ্ত ডকুমেন্ট:", results['documents'])
# আউটপুট: [['ভারতের রাজধানী নয়াদিল্লি।'], ['বাংলাদেশের রাজধানী ঢাকা।']]
উপরের কোডে দেখা যাচ্ছে, all-MiniLM-L6-v2 মডেল টেক্সটকে ৩৮৪–মাত্রার ভেক্টরে রূপান্তর করেছে। collection.add() দিয়ে ডেটা ইনসার্ট করার পর query() মেথড সরাসরি প্রশ্নের ভেক্টর দিয়েই নিকটতম ডকুমেন্ট ফিরিয়েছে। RAG পাইপলাইনে এই রেজাল্টই LLM–কে দেওয়া হবে।
সেরা অনুশীলন ও সতর্কতা
- ডকুমেন্ট চাঙ্কিং: বড় টেক্সটকে ছোট ছোট অর্থপূর্ণ খণ্ডে (চাঙ্ক) ভাগ করুন। চাঙ্ক ওভারল্যাপ রাখলে কনটেক্সট নাড়াচাড়া ভালো হয়।
- এম্বেডিং মডেল নির্বাচন: যে ভাষায় কাজ করছেন, উপযুক্ত মডেল নিন। মাল্টি–লিঙ্গুয়াল মডেল (যেমন
paraphrase-multilingual-MiniLM-L12-v2) বাংলাসহ একাধিক ভাষায় কার্যকর। - মেটাডেটা ফিল্টারিং: ডেটা ইনসার্টের সময়
metadata={"source": "website_A", "date": "2025-01-01"}যোগ করলে পরবর্তীতে ফিল্টার করে সার্চ করা যায়। এতে রিট্রিভাল আরও প্রাসঙ্গিক হয়। - পারফরম্যান্স মনিটরিং: ডেটা বাড়লে ইন্ডেক্স টাইপ (HNSW, IVF) ও কনফিগারেশন টিউন করুন। অনেক ডেটাবেসে
efবাMপ্যারামিটার দিয়ে স্পিড ও এক্যুরেসি ট্রেড–অফ করা যায়। - ক্যাশিং: একই প্রশ্ন বারবার এলে এম্বেডিং ক্যাশে রাখুন; এতে API কল ও খরচ কমবে। ChromaDB নিজেই কিছু ক্যাশিং করে, তবে প্রোডাকশনে রেডিস–জাতীয় লেয়ার যোগাযোগ্য।
ভেক্টর ডেটাবেস ছাড়া আধুনিক RAG সিস্টেম কল্পনা করাই কঠিন। সঠিক টুল ও চাঙ্কিং স্ট্র্যাটেজি নিলে এটি আপনার অ্যাপ্লিকেশনকে হয়ে উঠবে অনেক বেশি বুদ্ধিদীপ্ত ও নির্ভরযোগ্য।