Chapter 42
RAG সিস্টেম
RAG Systems
🎬 LLM-কে বই পড়ান
Retrieval-Augmented Generation (RAG) মানে — উত্তর দেওয়ার আগে LLM-কে সংশ্লিষ্ট ডকুমেন্ট retrieve করে context-এ জুড়ে দেওয়া। ফলে hallucination কম, knowledge always fresh।
RAG পাইপলাইন
Document Corpus
↓ chunk + embed
Vector DB (FAISS / Qdrant / pgvector)
User Query
↓ embed
↓ similarity search → top-k chunks
↓ build prompt = {chunks + query}
↓ LLM
Answer + citationsChunking Strategy
- Fixed: 500–1000 token, overlap 50–100।
- Semantic: sentence/paragraph boundary।
- Recursive: heading → paragraph → sentence (LangChain)।
- Late chunking: পুরো doc embed করে পরে slice।
Embedding ও Vector DB
from sentence_transformers import SentenceTransformer
emb = SentenceTransformer("BAAI/bge-m3") # multilingual
import faiss, numpy as np
vecs = emb.encode(chunks, normalize_embeddings=True)
index = faiss.IndexFlatIP(vecs.shape[1]) # cosine via inner-product
index.add(vecs)
# Query
q = emb.encode(["আমার প্রশ্ন"], normalize_embeddings=True)
scores, ids = index.search(q, k=5)Prompt Template
SYSTEM = """তুমি একজন সহকারী। কেবল নিচের context থেকে উত্তর দাও।
যদি context-এ উত্তর না থাকে — বলো 'জানি না'। উৎস হিসেবে [1], [2] cite করো।"""
context = "\n\n".join(f"[{i+1}] {c}" for i,c in enumerate(top_chunks))
user = f"Context:\n{context}\n\nQuestion: {query}"Hybrid Search — Dense + Sparse
Dense (embedding) semantic ধরে, কিন্তু rare keyword মিস করে। BM25-এর মতো sparse search যোগ করে দুটির result fuse (Reciprocal Rank Fusion) করলে accuracy অনেক বাড়ে।
Reranking
# Top-50 retrieve → cross-encoder দিয়ে top-5 rerank
from sentence_transformers import CrossEncoder
ce = CrossEncoder("BAAI/bge-reranker-v2-m3")
pairs = [(query, c) for c in top50]
scores = ce.predict(pairs)
top5 = [c for _,c in sorted(zip(scores, top50), reverse=True)[:5]]Production Architecture
Ingestion:
PDF/HTML → parser → cleaner → chunker → embedder → Qdrant
Query (online):
Query → rewrite (HyDE) → hybrid search → rerank
→ prompt build → LLM (streaming) → cite + cacheAdvanced Patterns
- HyDE: hypothetical answer generate করে তার embedding দিয়ে search।
- Multi-query: একটি প্রশ্নের ৩-৪টি প্যারাফ্রেজ।
- Parent-document retrieval: ছোট chunk match → বড় parent context।
- Self-RAG / CRAG: retrieval quality LLM নিজেই judge।
- GraphRAG: knowledge graph থেকে structured retrieval।
Eval Metrics (RAGAS)
- Faithfulness: উত্তর context-সমর্থিত?
- Answer relevance: প্রশ্নের প্রাসঙ্গিক?
- Context precision / recall: ভালো chunk এসেছে?
🔑 কখন RAG, কখন Fine-tune?
Fresh/changing knowledge, citation দরকার → RAG। Style/persona/format → fine-tune। প্রায়শই সঠিক উত্তর: দুটোই।
সাধারণ ভুল
⚠️ এড়িয়ে চলবেন
- Chunk খুব ছোট/বড় — context fragmented বা noisy।
- Embedding model mismatch — query ও doc আলাদা মডেলে embed।
- Reranker না থাকা — top-1 প্রায়শই ভুল।
- Citation ছাড়া answer — hallucination ধরা যায় না।
অনুশীলন
১. একটি PDF (বইয়ের অধ্যায়) থেকে FAISS-based RAG বানান।
২. Hybrid search (BM25 + dense) যোগ করে recall তুলনা।
৩. RAGAS দিয়ে faithfulness measure করুন।
সারসংক্ষেপ
✨ এই অধ্যায়ে যা শিখলাম
- RAG = retrieve + prompt + generate।
- Hybrid search + rerank → production quality।
- RAGAS দিয়ে systematic eval।