
RAG là gì? Kỹ thuật tăng cường độ chính xác cho AI
RAG (Retrieval Augmented Generation) là kỹ thuật quan trọng giúp cải thiện độ chính xác của Large Language Models. Thay vì chỉ dựa vào knowledge trong training data, RAG cho phép LLM truy cập và sử dụng thông tin từ nguồn dữ liệu bên ngoài.
Nội dung chính
Tại sao cần RAG?
LLMs như GPT-4, Claude có hai vấn đề chính:
- Knowledge cutoff – Chỉ biết thông tin đến thời điểm training
- Hallucination – Có thể “bịa” thông tin khi không chắc chắn
RAG giải quyết bằng cách:
- Tìm kiếm thông tin liên quan từ database
- Đưa thông tin đó vào context cho LLM
- LLM trả lời dựa trên context được cung cấp
Kiến trúc RAG cơ bản
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ Question │────▶│ Retriever │────▶│ Vector DB │
└─────────────┘ └──────────────┘ └─────────────┘
│
▼ (relevant documents)
┌──────────────┐
│ LLM │
└──────────────┘
│
▼
┌──────────────┐
│ Answer │
└──────────────┘Cài đặt RAG với LangChain
1. Chuẩn bị môi trường
pip install langchain langchain-openai chromadb tiktoken2. Load và chunk documents
from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Load documents
loader = PyPDFLoader("company_docs.pdf")
documents = loader.load()
# Split thành chunks
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", " ", ""]
)
chunks = text_splitter.split_documents(documents)3. Tạo vector store
from langchain_openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# Tạo embeddings và lưu vào ChromaDB
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)4. Tạo RAG chain
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(model="gpt-4-turbo")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # hoặc "map_reduce", "refine"
retriever=vectorstore.as_retriever(
search_kwargs={"k": 3} # Top 3 relevant docs
),
return_source_documents=True
)
# Query
result = qa_chain.invoke({"query": "What is our refund policy?"})
print(result["result"])
print("Sources:", result["source_documents"])Vector Databases phổ biến
| Database | Ưu điểm | Use case |
|---|---|---|
| ChromaDB | Đơn giản, embedded | Prototyping |
| Pinecone | Managed, scalable | Production |
| Weaviate | Open source, powerful | Enterprise |
| Qdrant | Fast, Rust-based | High performance |
| pgvector | PostgreSQL extension | Existing Postgres |
Advanced RAG Techniques
Hybrid Search
Kết hợp semantic search với keyword search:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
bm25 = BM25Retriever.from_documents(docs)
vector = vectorstore.as_retriever()
ensemble = EnsembleRetriever(
retrievers=[bm25, vector],
weights=[0.3, 0.7]
)Contextual Compression
Nén context để giữ lại phần quan trọng:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever()
)Evaluation Metrics
- Faithfulness – Câu trả lời có dựa trên context không?
- Answer relevancy – Câu trả lời có liên quan đến câu hỏi?
- Context precision – Context retrieved có chính xác?
- Context recall – Đã lấy đủ context cần thiết chưa?
Fullstack Station Tips
RAG là kỹ thuật cốt lõi cho các ứng dụng AI trong doanh nghiệp:
- Customer support – Q&A từ knowledge base
- Legal/Medical – Tra cứu documents chính xác
- Internal search – Tìm kiếm trong tài liệu công ty
Mẹo khi implement:
- Chunk size ~500-1000 tokens thường tốt nhất
- Overlap 10-20% để không mất context
- Dùng metadata filtering để narrow down search
- Test với nhiều embedding models (OpenAI, Cohere, local)
