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 + citations

Chunking 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 + cache

Advanced 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।