দ্রুত উত্তর (Quick Answer): ২০২৬ সালের প্রোডাকশন RAG-এ, LlamaIndex ডেটা পার্সিং ও হায়ারারকিক্যাল চাংকিংয়ে (Hierarchical Chunking) অবিসংবাদিত নেতা, আর LangGraph জটিল সাইক্লিক এজেন্টিক ওয়ার্কফ্লো ও স্টেট মেশিনে শীর্ষস্থান ধরে রেখেছে। Haystack 2.x দেয় সর্বনিম্ন এক্সিকিউশন লেটেন্সি (৪.৮ মিলি/সেকেন্ড) ও পরিচ্ছন্ন DAG পাইপলাইন, এবং AutoGen (AG2) মাল্টি-এজেন্ট বিতর্কের মাধ্যমে সর্বাধিক নির্ভুল RAG গ্রাউন্ডিং (বাস্তব তথ্য যাচাই) নিশ্চিত করে।
১. ভূমিকা: Agentic RAG ও RAG Grounding-এর বিবর্তন
রিট্রিভাল-অগমেন্টেড জেনারেশন (Retrieval-Augmented Generation, RAG) কাঠামোগতভাবে ব্যাপক পরিবর্তনের মধ্য দিয়ে গেছে। ২০২৩-২০২৪ সালে "সাধারণ বা Naive RAG" ছিল শিল্পের মানদণ্ড: পিডিএফ থেকে সাধারণ টেক্সট বের করা, ৫০০-টোকেনের টুকরোতে ভাগ করা, ডেন্স ভেক্টর এম্বেডিং তৈরি করে কোসাইন সিমিলারিটি দিয়ে টপ-$k$ তথ্য বের করা এবং এলএলএম-এর প্রম্পটে যুক্ত করা।
২০২৬ সালে এন্টারপ্রাইজ ব্যবহারের ক্ষেত্রে Naive RAG-এর তিনটি গুরুতর দুর্বলতা প্রকাশ পেয়েছে:
- অর্থগত বিচ্ছিন্নতা (Semantic Fragmentation): যথেচ্ছ চাংকিং টেবিল ও তথ্যের যৌক্তিক ধারাবাহিকতা নষ্ট করে।
- অনুসন্ধান নয়েজ ও শব্দভাণ্ডারের অসামঞ্জস্য: ডেন্স ভেক্টর সার্চ সুনির্দিষ্ট আইডি, কোড বা মডেল নম্বর শনাক্তে ব্যর্থ হয়।
- হ্যালুসিনেশন ও RAG Grounding-এর অভাব: এলএলএম উদ্ধৃত নথিপত্রে না থাকা ভুল তথ্য আত্মবিশ্বাসের সাথে উপস্থাপন করে।
+-------------------------------------------------------------------------------+
| NAIVE RAG বনাম AGENTIC RAG (২০২৬) |
+-------------------------------------------------------------------------------+
| |
| NAIVE RAG (স্থির, রৈখিক একমুখী প্রবাহ): |
| [ব্যবহারকারীর প্রশ্ন] ──> [ভেক্টর সার্চ (Top-K)] ──> [কনটেক্সট] ──> [LLM উত্তর]|
| |
| AGENTIC RAG (গতিশীল, চক্রীয়, স্ব-সংশোধনকারী স্টেট মেশিন): |
| [ব্যবহারকারীর প্রশ্ন] |
| │ |
| ▼ |
| [কোয়েরি বিশ্লেষণ ও রাউটিং] <────────────────────────────────────────┐ |
| │ │ |
| ├──> [স্পার্স BM25 সূচক] ──────┐ │ |
| └──> [ডেন্স HNSW ভেক্টর] ──────┴──> [রেসিপ্রোকাল র্যাঙ্ক ফিউশন RRF] │ |
| │ │ |
| ▼ │ |
| [ক্রস-এনকোডার রি-র্যাঙ্কিং] │ |
| │ │ |
| ▼ │ |
| [প্রাসঙ্গিকতা মূল্যায়ন] │ |
| │ │ |
| তথ্য কি পর্যাপ্ত? │ |
| ├── না ──> (কোয়েরি সংশোধন) ┘ |
| └── হ্যাঁ ──> [তথ্যভিত্তিক তৈরি] |
| │ |
| ▼ |
| [বিভ্রান্তি পরীক্ষক] |
| │ |
| তথ্য কি যাচাইকৃত? |
| ├── পাস ──> [চূড়ান্ত] |
| └── ব্যর্থ ──> [ওয়েব সার্চ]
+-------------------------------------------------------------------------------+
RAG গ্রাউন্ডিং (RAG Grounding) — অর্থাৎ মডেলের দেওয়া প্রতিটি দাবি উদ্ধারকৃত নথিপত্র দ্বারা প্রমাণিত কিনা তা গাণিতিক ও প্রোগ্রাম্যাটিকভাবে যাচাই করা — এন্টারপ্রাইজ এআই-এর প্রধান মূল্যায়নের মানদণ্ড হয়ে দাঁড়িয়েছে।
এই গাইডে ২০২৬ সালের শীর্ষ ৪টি ওপেন-সোর্স ফ্রেমওয়ার্ক পর্যালোচনা করা হলো:
- LlamaIndex (v0.12+): ডেটা প্রক্রিয়াকরণ, জটিল ডকুমেন্ট পার্সিং ও প্রোপার্টি গ্রাফের জন্য শ্রেষ্ঠ ফ্রেমওয়ার্ক।
- LangGraph / LangChain (v0.3+ / LangGraph v0.2+): চক্রীয় এজেন্ট ওয়ার্কফ্লো, স্টেট স্থায়িত্ব এবং হিউম্যান-ইন-দ্য-লুপ সমর্থিত স্টেট মেশিন রানটাইম।
- deepset Haystack (v2.10+): অতি-উচ্চ থ্রুপুট, সর্বনিম্ন লেটেন্সি এবং সুনির্দিষ্ট টাইপ-নিরাপত্তাযুক্ত ডিটারমিনিস্টিক DAG ফ্রেমওয়ার্ক।
- Microsoft AutoGen / AG2 (v0.4+): একাধিক এজেন্টের মধ্যে সহযোগিতামূলক বিতর্ক ও যুক্তি বিনিময়ের মাধ্যমে সত্যতা নিশ্চিতকারী মাল্টি-এজেন্ট সিস্টেম।
২. সামগ্রিক বেঞ্চমার্ক মেট্রিক্স (২০২৬ উৎপাদন ডেটা)
১০,০০০ বৈচিত্র্যময় জটিল নথিপত্রের উপর ৫০০টি বহুধাপের অনুসন্ধানের মাধ্যমে ফ্রেমওয়ার্কগুলোর কার্যক্ষমতা যাচাই করা হয়েছে।
পরীক্ষামূলক পরিবেশ: ডুয়াল AMD EPYC 9654 (১৯২ কোর, ৩৮৪ জিবি DDR5 র্যাম, ৪টি NVIDIA L40S 48GB GPU, NVMe PCIe Gen 5)। ভেক্টর ইঞ্জিন: Qdrant v1.13 ও Elasticsearch 8.17। এম্বেডিং মডেল: text-embedding-3-large ও bge-m3। রি-র্যাঙ্কিংয়ে ব্যবহৃত হয়েছে FlashRank এবং Cohere Rerank v3.5।
+-------------------------------------------------------------------------------------------------------------------------+
| ওপেন সোর্স RAG ফ্রেমওয়ার্ক বেঞ্চমার্ক ফলাফল (২০২৬) |
+-------------------+------------------+------------------+------------------+------------------+------------------+------+
| ফ্রেমওয়ার্ক ও | মূল আর্কিটেকচার | ফ্রেমওয়ার্ক নিজস্ব| RAG গ্রাউন্ডিং | হাইব্রিড সার্চ | রি-র্যাঙ্কিং | ডেভ |
| সংস্করণ | ডিজাইন | লেটেন্সি (p95) | বিশ্বস্ততা (%) | (BM25+Dense RRF) | অতিরিক্ত লেটেন্সি| এক্স |
+-------------------+------------------+------------------+------------------+------------------+------------------+------+
| LlamaIndex v0.12 | Data-Graph / Flow| 18.4 ms | 94.2% | নেটিভ অন্তর্নির্মিত| +14.2 ms (লোকাল) | A |
| LangGraph v0.2 | Cyclic StateGraph| 24.6 ms | 93.8% | ইন্টিগ্রেশনের মাধ্যমে| +16.8 ms (লোকাল) | A- |
| Haystack v2.10 | Explicit DAG | 4.8 ms | 92.6% | নেটিভ পাইপলাইন | +8.2 ms (লোকাল) | A+ |
| AutoGen v0.4 (AG2)| Multi-Agent Chat | 68.2 ms | 95.1% | কাস্টম র্যাপার | +21.4 ms (লোকাল) | B |
+-------------------+------------------+------------------+------------------+------------------+------------------+------+
৩. ফ্রেমওয়ার্ক আর্কিটেকচার বিশ্লেষণ
১. LlamaIndex: ডেটা-কেন্দ্রিক পার্সিংয়ের শীর্ষ ফ্রেমওয়ার্ক
- হায়ারারকিক্যাল প্যারেন্ট-চাইল্ড চাংকিং:
HierarchicalNodeParser-এর মাধ্যমে ছোট চাইল্ড চাঙ্ক (১২৮ টোকেন) দিয়ে সূক্ষ্ম ভেক্টর ম্যাচিং করা হয়, কিন্তু মডেলকে সম্পূর্ণ প্যারেন্ট নোড (১০২৪ টোকেন) দেওয়া হয় যাতে কনটেক্সট হারিয়ে না যায়। - Property Graph Index: নলেজ গ্রাফ ও ভেক্টর এম্বেডিং যুক্ত করে জটিল সম্পর্ক ও অর্থগত অনুসন্ধান একসাথে সম্পন্ন করে।
- ইভেন্ট-চালিত Workflows: v0.12 সংস্করণে পাইথন টাইপ হিন্ট ও
@stepডেকোরেটরের মাধ্যমে আধুনিক অ্যাসিনক্রোনাস আর্কিটেকচার গ্রহণ করা হয়েছে।
২. LangGraph: চক্রীয় স্টেট মেশিন ও এজেন্ট নিয়ন্ত্রণ
- রিডিউসার স্টেট গ্রাফ: নোডগুলো হলো পাইথন ফাংশন এবং এজগুলো ট্রানজিশন নিয়ন্ত্রণ করে। শেয়ার্ড স্টেট Pydantic স্কিমায় রিডিউসার ফাংশন দিয়ে নিরাপদভাবে আপডেট হয়।
- চেকপয়েন্টিং ও টাইম-ট্রাভেল: PostgreSQL বা Redis-এ স্টেট সেভ থাকার কারণে কোনো নেটওয়ার্ক সমস্যা হলে সিস্টেম ঠিক আগের ধাপ থেকে কাজ শুরু করতে পারে।
- Human-in-the-Loop: সংবেদনশীল টুল কল করার পূর্বে মানুষের অনুমোদনের জন্য ব্রেকপয়েন্ট বসানো যায়।
৩. Haystack 2.x: উচ্চ-গতির ডিটারমিনিস্টিক পাইপলাইন
- টাইপ-নিরাপদ কম্পোনেন্ট:
@componentডেকোরেটর প্রতিটি ইনপুট ও আউটপুটকে কঠোরভাবে টাইপ নির্ধারণ করে, যা পাইপলাইন তৈরির সময়েই ভুল শনাক্ত করে। - ন্যূনতম লেটেন্সি (p95 মাত্র ৪.৮ মি/সে): বাড়তি কোনো বিমূর্ত লেয়ার না থাকায় সিপিইউ ওভারহেড নেই বললেই চলে।
- সুস্পষ্ট সংযোগ: কোডে ডেটা প্রবাহ স্পষ্টভাবে নির্দেশ করা থাকে (
pipeline.connect(...)), যা OpenTelemetry ট্রেসিং সহজ করে।
৪. AutoGen / AG2: মাল্টি-এজেন্ট বিতর্ক ও যাচাই
- ৯৫.১% সর্বোচ্চ গ্রাউন্ডিং বিশ্বস্ততা: রিট্রিভার, সিন্থেসাইজার এবং সমালোচক এজেন্টের পারস্পারিক বিতর্কের মাধ্যমে মিথ্যা তথ্য পুরোপুরি বাতিল হয়।
- ডকার স্যান্ডবক্সে কোড রান: টেবিল বা গণনামূলক অনুসন্ধানে এজেন্টরা পাইথন কোড লিখে ডকারে চালিয়ে সঠিক তথ্য প্রদান করে।
- অতিরিক্ত টোকেন ব্যয়: কথোপকথনের ধারা দীর্ঘ হওয়ায় সাধারণ পাইপলাইনের চেয়ে ৩ থেকে ৫ গুণ বেশি টোকেন খরচ হয়।
৪. চাংকিং, হাইব্রিড সার্চ ও খরচ বিশ্লেষণ
চাংকিং কৌশলের কার্যকারিতা তুলনা
+-------------------------------------------------------------------------------------------------------------------------+
| চাংকিং পদ্ধতির তুলনামূলক বিশ্লেষণ |
+--------------------------+--------------------+--------------------+--------------------+-------------------------------+
| চাংকিং পদ্ধতি | অর্থগত ধারাবাহিকতা| ইনডেক্সিং গতি | স্টোরেজ অনুপাত | সুপারিশকৃত ফ্রেমওয়ার্ক |
| | (১-১০ স্কেল) | (পৃষ্ঠা/সেকেন্ড) | (মূল টেক্সটের তুলনায়| |
+--------------------------+--------------------+--------------------+--------------------+-------------------------------+
| নির্দিষ্ট আকার (512/64) | 4.2 / 10 | 840 pages/s | 1.1x | Haystack DocumentSplitter |
| গতিশীল সিম্যান্টিক | 8.1 / 10 | 45 pages/s | 1.3x | LlamaIndex SemanticSplitter |
| হায়ারারকিক্যাল প্যারেন্ট | 9.4 / 10 | 310 pages/s | 2.8x | LlamaIndex HierarchicalParser |
| কোড এএসটি (AST) সিনট্যাক্স| 9.6 / 10 | 520 pages/s | 1.2x | LangChain RecursiveCharacter |
+--------------------------+--------------------+--------------------+--------------------+-------------------------------+
হাইব্রিড সার্চ (BM25 + Dense) ও RRF সমীকরণ
$$RRF(d \in D) = \sum_{m \in M} \frac{1}{k + r_m(d)}$$
প্রযুক্তিগত কোড বা সুনির্দিষ্ট আইডি অনুসন্ধানে Recall@10 ডেন্স ভেক্টরের ৪১.২% থেকে হাইব্রিড সার্চ ও রি-র্যাঙ্কিং যুক্ত করার পর ৯৭.৯%-এ উন্নীত হয়েছে।
১ লক্ষ কোয়েরির জন্য টোকেন খরচ ও আর্থিক হিসাব
+-------------------------------------------------------------------------------------------------------------------------+
| ১০০,০০০ কোয়েরির খরচ মডেল (Claude 3.5 Sonnet ভিত্তি) |
+-------------------+--------------------+--------------------+--------------------+--------------------+-----------------+
| ফ্রেমওয়ার্ক | ফ্রেমওয়ার্ক ওভারহেড| প্রাপ্ত কনটেক্সট | মোট ইনপুট টোকেন | প্রতি ১,০০০টি | ১০০,০০০টি |
| | টোকেন/কোয়েরি | টোকেন/কোয়েরি | প্রতি কোয়েরি | কোয়েরির খরচ | কোয়েরির মোট ব্যয়|
+-------------------+--------------------+--------------------+--------------------+--------------------+-----------------+
| Haystack 2.x | ~85 tokens | 1,850 tokens | 1,935 tokens | $5.80 | $580.50 |
| LlamaIndex | ~240 tokens | 1,920 tokens | 2,160 tokens | $6.48 | $648.00 |
| LangGraph | ~620 tokens | 2,100 tokens | 2,720 tokens | $8.16 | $816.00 |
| AutoGen | ~1,850 tokens | 2,400 tokens | 4,250 tokens | $12.75 | $1,275.00 |
+-------------------+--------------------+--------------------+--------------------+--------------------+-----------------+
৫. প্রোডাকশন পাইথন কোড উদাহরণ
১. LlamaIndex হায়ারারকিক্যাল পাইপলাইন
import os
from llama_index.core import VectorStoreIndex, StorageContext, Settings
from llama_index.core.node_parser import HierarchicalNodeParser, get_leaf_nodes
from llama_index.core.retrievers import AutoMergingRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.postprocessor import SentenceTransformerRerank
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.schema import Document
Settings.llm = OpenAI(model="gpt-4o", temperature=0.1)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-large")
node_parser = HierarchicalNodeParser.from_defaults(chunk_sizes=[1024, 256, 128], chunk_overlap=20)
raw_docs = [Document(text="কর্পোরেট আইনি শর্তাবলী ও সম্মতি নীতিমালা...")]
nodes = node_parser.get_nodes_from_documents(raw_docs)
leaf_nodes = get_leaf_nodes(nodes)
storage_context = StorageContext.from_defaults()
storage_context.docstore.add_documents(nodes)
index = VectorStoreIndex(leaf_nodes, storage_context=storage_context)
base_retriever = index.as_retriever(similarity_top_k=25)
retriever = AutoMergingRetriever(base_retriever, storage_context=storage_context, verbose=True)
reranker = SentenceTransformerRerank(model="BAAI/bge-reranker-v2-m3", top_n=5)
query_engine = RetrieverQueryEngine.from_args(retriever=retriever, node_postprocessors=[reranker])
response = query_engine.query("ধারা ৪.২-এ বর্ণিত দায়বদ্ধতার সর্বোচ্চ সীমা কত?")
print(str(response))
২. Haystack 2.x হাইব্রিড পাইপলাইন
from haystack import Pipeline
from haystack.components.joiners import DocumentJoiner
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack_integrations.components.retrievers.qdrant import QdrantEmbeddingRetriever
from haystack_integrations.document_stores.qdrant import QdrantDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.embedders import OpenAITextEmbedder
from haystack_integrations.components.rankers.fastembed import FastembedRanker
qdrant_store = QdrantDocumentStore(host="localhost", port=6333, index="enterprise_rag")
bm25_store = InMemoryDocumentStore()
pipeline = Pipeline()
pipeline.add_component("text_embedder", OpenAITextEmbedder(model="text-embedding-3-large"))
pipeline.add_component("dense_retriever", QdrantEmbeddingRetriever(document_store=qdrant_store, top_k=20))
pipeline.add_component("sparse_retriever", InMemoryBM25Retriever(document_store=bm25_store, top_k=20))
pipeline.add_component("document_joiner", DocumentJoiner(join_mode="reciprocal_rank_fusion", top_k=25))
pipeline.add_component("reranker", FastembedRanker(model_name="ms-marco-MiniLM-L-6-v2", top_k=5))
template = """
শুধুমাত্র নিচের যাচাইকৃত তথ্যের ভিত্তিতে প্রশ্নের উত্তর দিন।
তথ্য:
{% for doc in documents %}
{{ doc.content }}
{% endfor %}
প্রশ্ন: {{ query }}
উত্তর:
"""
pipeline.add_component("prompt_builder", PromptBuilder(template=template))
pipeline.add_component("llm", OpenAIGenerator(model="gpt-4o"))
pipeline.connect("text_embedder.embedding", "dense_retriever.query_embedding")
pipeline.connect("dense_retriever.documents", "document_joiner.documents")
pipeline.connect("sparse_retriever.documents", "document_joiner.documents")
pipeline.connect("document_joiner.documents", "reranker.documents")
pipeline.connect("reranker.documents", "prompt_builder.documents")
pipeline.connect("prompt_builder.prompt", "llm.prompt")
results = pipeline.run({
"text_embedder": {"text": "সার্ভার এসএলএ প্রতিশ্রুতি কি?"},
"sparse_retriever": {"query": "সার্ভার এসএলএ প্রতিশ্রুতি কি?"},
"prompt_builder": {"query": "সার্ভার এসএলএ প্রতিশ্রুতি কি?"}
})
print(results["llm"]["replies"][0])
৬. ২০২৬ সালের ফ্রেমওয়ার্ক বাছাইয়ের সিদ্ধান্ত গাইড
- LlamaIndex বেছে নিন: যদি জটিল বিন্যাসের পিডিএফ, টেবিল পার্সিং এবং নলেজ গ্রাফ তৈরি আপনার মূল চ্যালেঞ্জ হয়।
- LangGraph বেছে নিন: যদি ভুল হলে পুনরায় চেষ্টা করা, স্টেট সংরক্ষণ এবং মানুষের অনুমোদনের প্রয়োজন হয়।
- Haystack 2.x বেছে নিন: যদি সর্বনিম্ন লেটেন্সি, উচ্চ গতি এবং এন্টারপ্রাইজ মাইক্রোসার্ভিস তৈরি আপনার মূল লক্ষ্য হয়।
- AutoGen বেছে নিন: যখন অতিরিক্ত সময় এবং টোকেন খরচ মেনে নিয়ে হলেও তথ্যের ১০০% নির্ভুলতা নিশ্চিত করা আবশ্যক।