Site icon Khoa Phạm BK Blog

Agentic RAG là gì? – Giải thích thuật ngữ, các pattern phổ biến và cách implement

Nếu bạn đang xây dựng hệ thống AI có khả năng trả lời câu hỏi dựa trên dữ liệu nội bộ, hẳn bạn đã nghe qua — hoặc đang dùng — RAG. Nhưng gần đây một thuật ngữ mới xuất hiện ngày càng nhiều trong các tài liệu kỹ thuật: Agentic RAG. Và không ít người đang tự hỏi: đây là buzz word mới hay thực sự có gì khác biệt đáng để học?

Câu trả lời ngắn: khác biệt thực sự — và khá lớn. Bài này sẽ giải thích từng khái niệm liên quan, so sánh rõ ràng, và hướng dẫn cách bắt đầu implement Agentic RAG trong thực tế.

Nhắc lại: RAG truyền thống là gì?

Trước khi nói về Agentic RAG, cần hiểu rõ RAG truyền thống làm gì — và tại sao nó chưa đủ.

RAG (Retrieval-Augmented Generation) là kỹ thuật kết hợp hai bước: retrieve (tìm kiếm thông tin liên quan từ knowledge base) và generate (dùng thông tin đó để trả lời). Thay vì chỉ dựa vào kiến thức có sẵn trong training data — vốn có ngưỡng cutoff và không biết gì về dữ liệu nội bộ của công ty bạn — RAG cho phép LLM truy cập vào nguồn dữ liệu bên ngoài trước khi trả lời.

Luồng của RAG truyền thống rất thẳng, theo một đường:

User hỏi → Embed câu hỏi → Tìm top-K chunk trong vector DB → Nhét vào prompt → LLM trả lời

Đơn giản, dễ implement, và hoạt động tốt cho các câu hỏi đơn giản. Nhưng vấn đề bắt đầu xuất hiện khi câu hỏi phức tạp hơn:

Có một analogy khá hay: RAG truyền thống giống như đến thư viện với một tờ giấy ghi sẵn tên sách cần tìm — nếu sách đó có, bạn lấy được; nếu không, bạn về tay không. Không có khả năng tìm cách khác hay hỏi thủ thư để được gợi ý thêm.

Agentic RAG là gì?

Agentic RAG là kiến trúc bổ sung một lớp agent vào trên RAG pipeline. Thay vì chạy theo đường thẳng cố định, agent có khả năng lập kế hoạch, ra quyết định, lặp lại, và tự điều chỉnh trong suốt quá trình tìm kiếm và trả lời.

Nếu RAG truyền thống là một ống nước — nước chỉ chảy một chiều từ A đến B — thì Agentic RAG là một nhạc trưởng: nó điều phối nhiều nhạc cụ (tools, data sources, verifier) và có thể yêu cầu một phần chơi lại nếu chưa đúng.

Các thuật ngữ cần biết

Khi đi sâu vào Agentic RAG, bạn sẽ gặp một mớ thuật ngữ. Mình tổng hợp lại để bạn có bức tranh tổng thể:

Traditional RAG vs Agentic RAG: So sánh trực tiếp

Traditional RAGAgentic RAG
Luồng xử lýTuyến tính, một chiềuVòng lặp, có thể quay lại
Nguồn dữ liệuMột nguồn cố địnhNhiều nguồn, tự chọn phù hợp
Kiểm tra chất lượngKhông cóTự đánh giá và retry nếu kém
Multi-step reasoningHạn chếTự phân nhỏ và giải quyết từng bước
Chi phíThấpCao hơn (nhiều LLM call hơn)
Độ phức tạpĐơn giảnPhức tạp hơn, cần orchestration
Phù hợp vớiQ&A đơn giản, FAQ botPhân tích phức tạp, enterprise search

Các pattern phổ biến trong Agentic RAG

Không có một kiến trúc Agentic RAG “chuẩn” duy nhất — tùy bài toán mà bạn chọn pattern phù hợp. Đây là bốn pattern được dùng nhiều nhất:

1. Router Pattern

Agent đầu tiên phân tích câu hỏi và quyết định nên đi vào nguồn dữ liệu nào. Ví dụ: câu hỏi về chính sách công ty → đi vào vector DB nội bộ; câu hỏi cần số liệu real-time → đi vào SQL; câu hỏi cần thông tin mới nhất → đi vào web search.

Câu hỏi → Router Agent → [Vector DB | SQL Database | Web Search]
                                        ↓
                               Tổng hợp kết quả → LLM → Trả lời

Dùng khi: Hệ thống có nhiều loại dữ liệu khác nhau, câu hỏi của user đa dạng không thể dự đoán trước sẽ cần nguồn nào.

2. Self-RAG Pattern

Sau khi generate câu trả lời, agent tự hỏi: “Câu trả lời này có thực sự giải quyết được câu hỏi gốc không?” Nếu không, agent reformulate query và thực hiện lại quá trình retrieval.

Câu hỏi → Retrieve → Generate → [Đánh giá chất lượng]
                                        ↓              ↓
                                    Đạt yêu cầu    Chưa đạt
                                        ↓              ↓
                                    Trả lời    Rewrite query → Retrieve lại

Dùng khi: Cần độ chính xác cao, không chấp nhận hallucination — ví dụ hệ thống Q&A cho legal, finance, hay y tế.

3. CRAG (Corrective RAG) Pattern

Thay vì đánh giá câu trả lời cuối cùng, CRAG đánh giá từng document ngay sau khi retrieve — trước khi đưa vào LLM. Document nào không đủ liên quan bị loại bỏ; nếu không còn document nào tốt, agent mở rộng tìm kiếm ra web hoặc nguồn khác.

Dùng khi: Knowledge base nội bộ có nhiều “noise” — document lỗi thời hoặc không đủ coverage, cần kết hợp thêm nguồn bên ngoài.

4. Multi-Agent RAG Pattern

Nhiều agent chạy song song, mỗi agent chuyên trách một nguồn dữ liệu riêng. Một orchestrator agent tổng hợp kết quả từ tất cả agent con lại để đưa ra câu trả lời cuối cùng.

                    ┌─ Agent A: search Vector DB ─┐
Câu hỏi → Orchestrator ─ Agent B: query SQL DB ──── Aggregator → Trả lời
                    └─ Agent C: web search ────────┘

Dùng khi: Câu hỏi cần tổng hợp từ nhiều nguồn hoàn toàn khác nhau, cần tốc độ (vì chạy song song), ví dụ hệ thống báo cáo tổng hợp cho C-level.

Framework nào để implement?

Đây là câu hỏi mình nhận được nhiều nhất khi nói về Agentic RAG. Hệ sinh thái đang thay đổi nhanh — đây là bức tranh hiện tại:

LangGraph

Sản phẩm của team LangChain, được thiết kế đặc biệt cho agentic workflow. Điểm mạnh là hỗ trợ cycle natively — khác với các DAG truyền thống chỉ chạy một chiều, LangGraph cho phép agent loop lại các bước trước khi đã đủ điều kiện. Phù hợp cho hệ thống phức tạp với nhiều nhánh rẽ và retry logic.

Chọn khi: Cần workflow phức tạp, nhiều agent, human-in-the-loop, hoặc đang dùng LangSmith để observability.

LlamaIndex

Vốn là framework RAG mạnh nhất về phía retrieval — document ingestion, indexing, và query routing đều rất mature. Gần đây ra thêm LlamaIndex Workflows (event-driven, async-first) để build agentic system. Code Python thuần, ít boilerplate hơn LangGraph.

Chọn khi: Data-heavy workload, cần retrieval quality cao, document đa dạng format (PDF, SQL, Notion, Slack…).

LangChain

Framework ban đầu, vẫn là lựa chọn nhanh nhất để prototype. Ecosystem lớn với hàng trăm integrations. Tuy nhiên team LangChain hiện đang đẩy LangGraph như primary choice cho production agentic system.

Chọn khi: Cần prototype nhanh, thử nghiệm nhiều chiến lược retrieval khác nhau trước khi chốt kiến trúc.

Lưu ý thực tế năm 2026: Context window của các model mới (1M+ tokens) đang đặt ra câu hỏi thú vị: với câu hỏi đơn giản, đôi khi nhét thẳng cả document vào context còn nhanh hơn và chính xác hơn cả một RAG pipeline phức tạp. RAG — đặc biệt Agentic RAG — vẫn cần thiết khi dữ liệu quá lớn, cần cập nhật real-time, hoặc khi cost của việc process cả triệu token mỗi query là không chấp nhận được.

Ví dụ thực tế: Xây dựng Agentic RAG đơn giản với LangGraph

Hãy xem qua một ví dụ cụ thể — implement Self-RAG pattern với LangGraph. Đây là skeleton code để bạn có thể hình dung cấu trúc:

from langgraph.graph import StateGraph, END
from typing import TypedDict, List

# Định nghĩa state của graph
class RAGState(TypedDict):
    question: str
    documents: List[str]
    generation: str
    retry_count: int

# Node 1: Retrieve documents
def retrieve(state: RAGState):
    docs = vectorstore.similarity_search(state["question"], k=4)
    return {"documents": docs}

# Node 2: Grade documents — loại bỏ document không liên quan
def grade_documents(state: RAGState):
    relevant_docs = []
    for doc in state["documents"]:
        score = grader_llm.invoke({
            "question": state["question"],
            "document": doc
        })
        if score == "relevant":
            relevant_docs.append(doc)
    return {"documents": relevant_docs}

# Node 3: Generate answer
def generate(state: RAGState):
    answer = llm.invoke({
        "context": state["documents"],
        "question": state["question"]
    })
    return {"generation": answer}

# Node 4: Kiểm tra answer có đủ tốt không
def grade_generation(state: RAGState):
    score = answer_grader.invoke({
        "question": state["question"],
        "generation": state["generation"]
    })
    return score  # "useful" hoặc "not useful"

# Node 5: Rewrite query nếu cần
def rewrite_question(state: RAGState):
    better_question = question_rewriter.invoke(state["question"])
    return {
        "question": better_question,
        "retry_count": state["retry_count"] + 1
    }

# Điều kiện: tiếp tục hay kết thúc
def decide_next_step(state: RAGState):
    if state["retry_count"] >= 2:
        return END  # Tránh vòng lặp vô tận
    if len(state["documents"]) == 0:
        return "rewrite_question"
    return "generate"

# Build graph
workflow = StateGraph(RAGState)
workflow.add_node("retrieve", retrieve)
workflow.add_node("grade_documents", grade_documents)
workflow.add_node("generate", generate)
workflow.add_node("rewrite_question", rewrite_question)

workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "grade_documents")
workflow.add_conditional_edges("grade_documents", decide_next_step)
workflow.add_edge("generate", END)
workflow.add_edge("rewrite_question", "retrieve")

app = workflow.compile()

Nhìn vào code, bạn có thể thấy điểm khác biệt cốt lõi so với RAG truyền thống: add_conditional_edges là nơi agent “ra quyết định” — dựa vào chất lượng document retrieve được, nó có thể đi thẳng sang generate hoặc quay lại rewrite câu hỏi và retrieve lại. Đây chính là vòng lặp mà RAG truyền thống không có.

Khi nào dùng Agentic RAG — và khi nào không cần?

Agentic RAG mạnh hơn, nhưng không có nghĩa là luôn phù hợp hơn. Thực tế, có những trường hợp bạn nên cân nhắc kỹ:

✅ Nên dùng Agentic RAG khi:

❌ Không nhất thiết cần Agentic RAG khi:

Tổng kết

Agentic RAG không phải buzz word — đây là bước tiến hóa tự nhiên khi bài toán enterprise trở nên phức tạp hơn khả năng của RAG pipeline tuyến tính. Nhưng cũng không nên overengineer từ đầu: bắt đầu với RAG truyền thống, xác định rõ điểm nào đang fail, rồi mới thêm dần lớp agentic vào những chỗ thực sự cần.

Những điểm cốt lõi cần nhớ:

Nếu bạn đang build hệ thống RAG cho production, điểm bắt đầu thực tế nhất là: implement Router pattern trước — nó đơn giản nhất trong bốn pattern trên nhưng đã giải quyết được phần lớn vấn đề của RAG truyền thống với dữ liệu đa nguồn.

Chúc anh em code vui! 🚀


Tags: #rag #agenticrag #llm #ai #langchain #langgraph #llamaindex #vectordatabase #machinelearning

Exit mobile version