DBP625

Naive RAG

Jun 21st, 2026
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. # ╔══════════════════════════════════════════════════════════════╗
  2. # ║ Naive RAG — শুধু Dense Vector Search (baseline) ║
  3. # ╚══════════════════════════════════════════════════════════════╝
  4.  
  5. def retrieve_naive(question: str, subject: str = "", class_no: str = "",
  6. k: int = TOP_K, use_metadata_filter: bool = True) -> dict:
  7. """
  8. Naive RAG: শুধু BGE-M3 dense search।
  9. ❌ Multi-query ❌ BM25 ❌ RRF ❌ Reranker
  10. ✅ শুধু একটা embedding search
  11. """
  12. norm_subj = normalize_subject(subject)
  13.  
  14. # ── Metadata filter (hybrid-এর মতোই) ─────────────────────
  15. where_filter = None
  16. if use_metadata_filter and norm_subj:
  17. where_filter = {"subject": {"$eq": norm_subj}}
  18. if class_no:
  19. where_filter = {
  20. "$and": [
  21. {"subject": {"$eq": norm_subj}},
  22. {"class_no": {"$eq": str(class_no)}},
  23. ]
  24. }
  25.  
  26. # ── একটাই dense query (multi-query নেই) ──────────────────
  27. query_prefix = "Represent this sentence for searching relevant passages: "
  28. q_emb = embed_model.encode(
  29. [query_prefix + question], normalize_embeddings=True
  30. ).tolist()
  31.  
  32. query_kwargs = {
  33. "query_embeddings": q_emb,
  34. "n_results": k, # সরাসরি top-k (candidate pool নেই)
  35. "include": ["documents", "metadatas", "distances"],
  36. }
  37. if where_filter:
  38. query_kwargs["where"] = where_filter
  39.  
  40. try:
  41. hits = collection.query(**query_kwargs)
  42. except:
  43. query_kwargs.pop("where", None)
  44. hits = collection.query(**query_kwargs)
  45.  
  46. docs = hits["documents"][0]
  47. metas = hits["metadatas"][0]
  48.  
  49. if not docs:
  50. return {"context": "", "sources": [], "num_chunks": 0, "texts": []}
  51.  
  52. # ── Context build (char limit) ───────────────────────────
  53. final_docs, final_metas, total = [], [], 0
  54. for doc, meta in zip(docs, metas):
  55. if total + len(doc) > CONTEXT_MAX_CHARS:
  56. remaining = CONTEXT_MAX_CHARS - total
  57. if remaining > 200:
  58. final_docs.append(doc[:remaining] + "...")
  59. final_metas.append(meta)
  60. break
  61. final_docs.append(doc)
  62. final_metas.append(meta)
  63. total += len(doc)
  64.  
  65. context = "\n\n---\n\n".join(final_docs)
  66.  
  67. return {
  68. "context": context,
  69. "sources": final_metas,
  70. "num_chunks": len(final_docs),
  71. "texts": final_docs, # hit rate calculation-এর জন্য
  72. }
  73.  
  74. print("✅ retrieve_naive() ready — dense search only")
Add Comment
Please, Sign In to add comment