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.
- 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
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
- Load — đọc PDF, Word, HTML, database, API
- Chunk — chia thành đoạn nhỏ 200-1000 tokens
- Embed — chuyển mỗi chunk thành vector bằng embedding model
- Store — lưu vectors vào vector database
Bước 2: Retrieval (Truy xuất) — mỗi query
- Embed query — chuyển câu hỏi thành vector
- Similarity search — tìm top-K chunks gần nhất
- Rerank (optional) — xếp hạng lại bằng cross-encoder
Bước 3: Generation (Sinh câu trả lời)
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
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
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"])
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”