RAG — Retrieval Augmented Generation

Kỹ thuật giúp LLM trả lời chính xác bằng cách truy xuất kiến thức từ dữ liệu riêng — giảm hallucination, cập nhật real-time.

LLM Vector DB Embeddings NLP
Sau bài này bạn sẽ
  • Hiểu RAG là gì và tại sao LLM cần RAG
  • Nắm kiến trúc 3 bước: Ingestion → Retrieval → Generation
  • Biết chọn chunking strategy phù hợp
  • Build RAG pipeline hoàn chỉnh bằng Python + LangChain
  • Đánh giá chất lượng RAG bằng RAGAS framework
Dành cho
AI/ML engineers, backend devs, data scientists
Yêu cầu trước
Python cơ bản, hiểu LLM là gì, có OpenAI API key
⏱️ Thời gian
~25 phút

1. RAG là gì?

Hãy hình dung: LLM giống một chuyên gia có kiến thức rộng nhưng đôi khi bịa câu trả lời. RAG giống đưa cho chuyên gia đó một thư viện tham khảo — trước khi trả lời, họ tra cứu tài liệu phù hợp rồi mới phát biểu.

RAG (Retrieval Augmented Generation) = Truy xuất thông tin liên quan + Sinh câu trả lời. Thay vì LLM trả lời từ “trí nhớ” cũ, RAG tìm dữ liệu mới nhất rồi đưa cho LLM làm context.

Ứng dụng: Chatbot hỗ trợ KH (từ FAQ), trợ lý pháp lý (tra luật), hệ thống nội bộ (tìm policy, tài liệu kỹ thuật). Gartner dự đoán 60%+ enterprise AI sẽ dùng RAG vào 2026.

2. Tại sao LLM cần RAG?

Vấn đề LLM Mô tả RAG giải quyết
Hallucination Bịa thông tin nghe hợp lý Trả lời từ tài liệu thực, có nguồn
Knowledge cutoff Chỉ biết đến lúc training Truy xuất dữ liệu mới real-time
Dữ liệu riêng Không biết nội bộ công ty Index dữ liệu riêng, truy xuất khi cần

3. Kiến trúc 3 bước

Bước 1: Ingestion (Nạp dữ liệu) — chạy 1 lần

  1. Load — đọc PDF, Word, HTML, database, API
  2. Chunk — chia thành đoạn nhỏ 200-1000 tokens
  3. Embed — chuyển mỗi chunk thành vector bằng embedding model
  4. Store — lưu vectors vào vector database

Bước 2: Retrieval (Truy xuất) — mỗi query

  1. Embed query — chuyển câu hỏi thành vector
  2. Similarity search — tìm top-K chunks gần nhất
  3. Rerank (optional) — xếp hạng lại bằng cross-encoder

Bước 3: Generation (Sinh câu trả lời)

prompt template
Dựa trên các thông tin sau:
---
[Chunk 1: nội dung liên quan...]
[Chunk 2: nội dung liên quan...]
---
Hãy trả lời: {user_question}
Chỉ trả lời dựa trên thông tin được cung cấp.
Nếu không tìm thấy, nói "Tôi không có thông tin này."

4. Chunking Strategies

Strategy Cách hoạt động Khi nào dùng
Fixed-size Chia theo tokens cố định (500) Baseline, tài liệu đồng nhất
Recursive Chia theo heading, paragraph, sentence Markdown, HTML có cấu trúc
Semantic Dùng embedding tìm điểm chuyển topic Văn bản dài, nhiều chủ đề
Overlap Chunks chồng nhau 10-20% Kết hợp với mọi strategy

Bắt đầu với: Recursive chunking + 20% overlap + 500 tokens. Tinh chỉnh theo kết quả thực tế.

5. Vector Databases

Database Loại Ưu điểm Free?
Chroma Local Đơn giản nhất, Python-native Open-source
Qdrant Open-source Rust, nhanh, filtering mạnh Self-host
Pinecone Cloud Serverless, auto-scale 100K vectors
Weaviate Open-source Hybrid search (vector+keyword) Self-host
pgvector PostgreSQL ext Dùng chung DB, SQL quen Free

6. Hands-on: Build RAG Pipeline

6.1 Cài đặt

terminal
pip install langchain langchain-openai langchain-community
pip install chromadb pypdf
export OPENAI_API_KEY="sk-your-key"

6.2 Code hoàn chỉnh

python — rag_pipeline.py
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. Load & Chunk
loader = PyPDFLoader("company_policy.pdf")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=100,
    separators=["\n\n", "\n", ". ", " "]
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")

# 2. Embed & Store
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small"
)
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 3. Query
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(
        search_kwargs={"k": 5}
    )
)

answer = qa_chain.invoke(
    "Chính sách nghỉ phép là gì?"
)
print(answer["result"])
📤 Kết quả mong đợi
Created 47 chunks from PDF

Theo chính sách công ty, nhân viên chính thức 
được nghỉ phép 12 ngày/năm. Nhân viên mới 
(dưới 1 năm) được nghỉ theo tỷ lệ tháng đã 
làm việc. Nghỉ phép cần đăng ký trước 3 ngày 
qua hệ thống HR.

7. Kỹ thuật nâng cao 2025

  • Hybrid Retrieval — kết hợp keyword search (BM25) + vector search cho kết quả tốt hơn
  • Query Rewriting — LLM viết lại câu hỏi user cho phù hợp hơn với knowledge base
  • Reranking — sau retrieval, dùng cross-encoder sắp xếp lại theo relevance thực sự
  • Agentic RAG — AI agent tự quyết định khi nào cần search, search ở đâu, cần bao nhiêu context
  • Multi-modal RAG — retrieve cả text, images, tables từ documents

8. Đánh giá chất lượng RAG

Dùng RAGAS framework để đo:

Metric Đo gì? Target
Faithfulness Trả lời trung thực với context? > 0.8
Answer Relevancy Phù hợp với câu hỏi? > 0.8
Context Precision Chunks truy xuất chính xác? > 0.7
Context Recall Bỏ sót thông tin quan trọng? > 0.8

9. Sai lầm & Bước tiếp theo

❌ Sai lầm thường gặp

  • Chunk quá nhỏ → mất ngữ cảnh, câu trả lời rời rạc
  • Chunk quá lớn → nhiều noise, tốn token
  • Embedding model yếu → retrieval kém, trả lời sai
  • Không rerank → top-K có thể chứa chunks không liên quan
  • Prompt không chặt → LLM bịa thêm thay vì nói “không biết”

🔜 Đọc tiếp

  • Graph RAG — RAG + Knowledge Graph cho reasoning phức tạp
  • Embedding — hiểu sâu cách vector embeddings hoạt động
  • n8n — build RAG pipeline no-code