← Quay lại Blog
Công nghệ & AI 30/08/2026 · 10 phút đọc

RAG - Retrieval-Augmented Generation: Kỹ Thuật Nền Tảng AI Chatbot

Sơ đồ minh họa quy trình RAG với vector database và LLM xử lý câu hỏi người dùng

RAG (Retrieval-Augmented Generation) là kỹ thuật kết hợp tìm kiếm thông tin từ cơ sở tri thức và khả năng sinh văn bản của LLM, giúp chatbot AI trả lời chính xác dựa trên dữ liệu thực tế thay vì bịa đặt. Đây là giải pháp nền tảng để xây dựng AI chatbot doanh nghiệp hiểu được tài liệu nội bộ, customer support bot truy cập kho FAQ, hoặc trợ lý ảo tư vấn sản phẩm dựa trên catalog thật.

RAG hoạt động như thế nào?

Quy trình RAG gồm hai pha chính: indexing (xây dựng cơ sở tri thức) và retrieval + generation (trả lời câu hỏi).

Pha 1: Indexing — Xây dựng vector database

  1. Chuẩn bị dữ liệu nguồn: Thu thập tài liệu (PDF, docs, HTML, database records) cần chatbot tham chiếu.
  2. Chia nhỏ thành chunks: Tách văn bản thành các đoạn 200-500 từ (chunking) để tối ưu độ liên quan khi tìm kiếm.
  3. Tạo embeddings: Dùng mô hình embedding (OpenAI text-embedding-3-small, hoặc mô hình mở như BGE, E5) chuyển mỗi chunk thành vector số học (thường 768-1536 chiều).
  4. Lưu vào vector database: Các vector này được index trong Pinecone, Weaviate, Qdrant, hoặc PostgreSQL với extension pgvector để tìm kiếm semantic similarity nhanh.

Pha 2: Retrieval + Generation — Trả lời câu hỏi

  1. User đặt câu hỏi: “Chính sách bảo hành laptop của công ty là gì?”
  2. Embedding câu hỏi: Câu hỏi được chuyển thành vector bằng cùng mô hình embedding.
  3. Semantic search: Vector database tìm top 3-5 chunks có vector gần nhất (cosine similarity cao nhất) với vector câu hỏi.
  4. Prompt augmentation: Các chunks được tìm thấy được ghép vào prompt gửi tới LLM:
    Context:
    [Chunk 1: Chính sách bảo hành...]
    [Chunk 2: Điều kiện áp dụng...]
    
    Question: Chính sách bảo hành laptop của công ty là gì?
    
    Instructions: Trả lời dựa trên Context phía trên. Nếu không tìm thấy, nói "Tôi không có thông tin này."
    
  5. LLM sinh câu trả lời: Mô hình đọc context và tạo câu trả lời tự nhiên, chính xác dựa trên tài liệu thật thay vì bịa.

Tại sao RAG quan trọng với AI chatbot doanh nghiệp?

Khắc phục hallucination

LLM thuần (GPT-4, Claude) được train trên dữ liệu công khai tới một thời điểm cắt (cutoff date), không biết:

  • Thông tin nội bộ công ty (quy trình, chính sách, sản phẩm riêng)
  • Sự kiện mới nhất sau thời điểm training
  • Dữ liệu khách hàng/đơn hàng trong CRM

Khi không biết, LLM có xu hướng “hallucinate” — tự bịa ra câu trả lời nghe hợp lý nhưng sai sự thật.

RAG buộc LLM trả lời dựa trên dữ liệu được cung cấp. Rủi ro giảm mạnh.

Cập nhật tri thức không cần retrain

Fine-tuning một LLM tốn hàng nghìn USD và vài ngày GPU.

RAG? Khác hẳn. Cập nhật kiến thức chatbot chỉ cần:

  1. Thêm/sửa tài liệu nguồn
  2. Chạy lại pipeline embedding + index

Vài phút đến vài giờ tùy khối lượng. Không đụng vào mô hình LLM.

Chi phí hợp lý hơn fine-tuning

Phương phápChi phí ban đầuChi phí vận hànhThời gian cập nhật
Fine-tuning$5,000-50,000+ (training)Thấp (chỉ API calls)Vài ngày
RAG$0-500 (setup infra)Vừa (API + vector DB)Vài phút - vài giờ

Với SME và startup, RAG là điểm khởi đầu hợp lý trước khi đầu tư vào fine-tuning khi quy mô đủ lớn.

Kiến trúc RAG cơ bản

┌─────────────┐
│   User      │
│  Question   │
└──────┬──────┘

       v
┌─────────────────┐      ┌──────────────────┐
│  Embedding      │─────>│ Vector Database  │
│  Model          │      │  (semantic search)│
└─────────────────┘      └────────┬─────────┘

                                  v
                         ┌────────────────┐
                         │ Top-K Chunks   │
                         └────────┬───────┘

                                  v
┌─────────────────────────────────────────┐
│  LLM (GPT-4, Claude, Llama)             │
│  Prompt = Context (chunks) + Question   │
└──────────────────┬──────────────────────┘

                   v
              ┌─────────┐
              │ Answer  │
              └─────────┘

Các thành phần chính

  1. Document loader: Đọc PDF, DOCX, HTML, scrape web, kết nối database.
  2. Text splitter: Chia văn bản thành chunks (LangChain RecursiveCharacterTextSplitter, LlamaIndex SentenceSplitter).
  3. Embedding model: OpenAI text-embedding-3-small (phổ biến), text-embedding-3-large (chất lượng cao hơn), hoặc mô hình mở BGE/E5 để tự host.
  4. Vector store:
    • Managed cloud: Pinecone (dễ nhất), Weaviate Cloud
    • Self-hosted: Qdrant, Milvus, PostgreSQL + pgvector
  5. LLM: GPT-4, Claude 3.5 Sonnet (API), hoặc Llama 3, Mistral (tự host)
  6. Orchestration framework: LangChain, LlamaIndex — quản lý toàn bộ pipeline

Triển khai RAG từng bước (Python + LangChain)

Bước 1: Cài đặt dependencies

pip install langchain openai pinecone-client tiktoken pypdf

Bước 2: Load tài liệu và chia chunks

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Load PDF
loader = PyPDFLoader("policy.pdf")
documents = loader.load()

# Chia chunks 500 ký tự, overlap 50 để giữ ngữ cảnh
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)

Bước 3: Tạo embeddings và index vào Pinecone

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
import pinecone

# Khởi tạo Pinecone
pinecone.init(api_key="YOUR_KEY", environment="us-west1-gcp")
index_name = "company-policies"

# Tạo embeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# Index vào Pinecone
vectorstore = Pinecone.from_documents(
    chunks, 
    embeddings, 
    index_name=index_name
)

Bước 4: Xây dựng RAG chain

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

# LLM
llm = ChatOpenAI(model_name="gpt-4", temperature=0)

# Retrieval QA chain
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",  # đơn giản nhất
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)

# Sử dụng
answer = qa_chain.run("Chính sách bảo hành laptop là gì?")
print(answer)

Các chiến lược nâng cao

Hybrid search (kết hợp keyword + semantic)

Vector search thuần đôi khi bỏ lỡ kết quả chứa từ khóa chính xác. Hybrid search kết hợp:

  • BM25 (keyword-based, như Google truyền thống)
  • Dense vector (semantic similarity)

Weaviate và Qdrant hỗ trợ hybrid search native. Kết quả được merge theo trọng số (ví dụ 70% semantic + 30% keyword).

Re-ranking

Sau khi retrieval trả về top-K chunks (thường K=10-20), dùng một mô hình re-ranker (Cohere Rerank API, hoặc cross-encoder như ms-marco-MiniLM) để sắp xếp lại theo độ liên quan chính xác hơn, rồi lấy top-3 đưa vào LLM. Điều này nâng chất lượng câu trả lời mà không tăng context length quá nhiều.

Query transformation

Câu hỏi người dùng thường mơ hồ hoặc thiếu ngữ cảnh. Trước khi embedding, dùng LLM viết lại câu hỏi thành dạng rõ ràng hơn:

  • HyDE (Hypothetical Document Embeddings): Tạo một “câu trả lời giả định” từ câu hỏi, sau đó dùng câu trả lời đó để search thay vì câu hỏi gốc.
  • Multi-query: Sinh ra 3-5 biến thể của câu hỏi, search song song, merge kết quả.

Agent-based RAG

Thay vì pipeline tuyến tính, dùng AI Agent để quyết định:

  • Câu hỏi này cần tra vector DB không, hay LLM trả lời trực tiếp được?
  • Cần query nhiều nguồn khác nhau (vector DB + SQL database + API)?
  • Kết quả đủ tin cậy chưa, hay cần refine query và search lại?

LangChain Agent + Tools, hoặc LlamaIndex Query Engine cho phép xây dựng logic này.

So sánh RAG vs Fine-tuning

Tiêu chíRAGFine-tuning
Mục đíchTruy cập tri thức mới/nội bộHọc phong cách, domain-specific reasoning
Chi phíThấp-Vừa ($50-500/tháng)Cao ($5k-50k+ training)
Cập nhật kiến thứcNhanh (phút-giờ)Chậm (ngày-tuần)
Trích nguồnDễ (trả về chunk nguồn)Khó (mô hình không nhớ nguồn)
HallucinationThấp (ground truth từ docs)Vẫn có thể xảy ra
Use case tốt nhấtQ&A, support, search nội bộChuyên môn hóa ngôn ngữ/logic

Kết hợp cả hai: Nhiều hệ thống production fine-tune LLM trên domain (ví dụ y tế, pháp lý) để hiểu thuật ngữ tốt hơn, RỒI dùng RAG để truy cập tri thức cụ thể. Đây là kiến trúc hybrid mạnh nhất.

Thách thức khi triển khai RAG

Chunking tối ưu

  • Chunk quá nhỏ (100-200 ký tự): Mất ngữ cảnh, semantic search kém
  • Chunk quá lớn (1000+ ký tự): Tốn token, nhiễu thông tin, vượt context window

Chiến lược: Bắt đầu với 400-600 ký tự, overlap 10-20%. Thử nghiệm với test set để tìm sweet spot cho domain riêng.

Context window limits

GPT-4 Turbo có 128K tokens, Claude 3.5 Sonnet 200K, nhưng:

  • Càng dài context, chi phí càng cao
  • LLM đôi khi “lạc” ở giữa context dài (lost-in-the-middle phenomenon)

Giải pháp: Chỉ đưa top-3 chunks liên quan nhất vào prompt. Nếu cần nhiều hơn, dùng re-ranking hoặc summarization trước.

Độ trễ (latency)

RAG thêm bước retrieval, khiến response chậm hơn LLM thuần:

  • Embedding câu hỏi: ~50-200ms
  • Vector search: ~50-300ms (tùy kích thước DB)
  • LLM generation: 1-5 giây

Tối ưu: Cache embeddings cho câu hỏi phổ biến, dùng vector DB có index tốt (HNSW trong Qdrant/Weaviate), hoặc pre-compute embeddings offline.

Chất lượng dữ liệu nguồn

RAG chỉ tốt bằng dữ liệu đưa vào. Nếu tài liệu nguồn:

  • Lỗi thời, mâu thuẫn nhau
  • Viết kém, thiếu cấu trúc
  • Quá chuyên môn mà người dùng hỏi bằng ngôn ngữ đời thường

→ Chatbot sẽ trả lời sai hoặc không tìm được thông tin.

Giải pháp: Audit và làm sạch dữ liệu trước khi index. Viết tài liệu theo chuẩn “answer-first” (câu trả lời ngắn gọn đầu tiên, chi tiết sau) để LLM dễ trích xuất.

Công cụ và framework phổ biến

TênLoạiĐiểm mạnh
LangChainOrchestration frameworkEcosystem lớn, nhiều integrations, phù hợp prototype nhanh
LlamaIndexData frameworkTối ưu cho RAG, nhiều chiến lược indexing/retrieval nâng cao
PineconeVector database (managed)Serverless, dễ dùng, scale tự động
WeaviateVector database (self-hosted/cloud)Hybrid search, multi-tenancy, GraphQL API
QdrantVector database (self-hosted/cloud)Hiệu năng cao, Rust-based, filtering mạnh
pgvectorPostgreSQL extensionDùng DB quen thuộc, không cần infra mới, phù hợp data nhỏ-vừa
HaystackNLP frameworkProduction-ready, hỗ trợ cả RAG và semantic search

Lựa chọn cho người mới: LangChain + Pinecone free tier + OpenAI API = stack đơn giản nhất để chạy POC trong vài giờ.

Kết luận

RAG biến LLM từ “người trả lời chung chung” thành “chuyên gia am hiểu tri thức tổ chức”.

Ba điểm mạnh cốt lõi:

  • Cập nhật tri thức nhanh (phút, không phải ngày)
  • Chi phí hợp lý (trăm USD, không phải chục nghìn)
  • Giảm hallucination (ground truth, không bịa đặt)

Fine-tuning thuần không làm được cả ba.

Nếu bạn đang xây dựng chatbot customer support, trợ lý nội bộ doanh nghiệp, hoặc công cụ tìm kiếm thông minh, RAG là bước đầu tiên đáng thử. Bắt đầu từ POC đơn giản với LangChain + Pinecone, thu thập phản hồi thực tế, rồi từng bước tối ưu chunking, re-ranking, và hybrid search khi quy mô tăng.

Đọc thêm:

Câu hỏi thường gặp

RAG là gì?

RAG (Retrieval-Augmented Generation) là kỹ thuật kết hợp giữa tìm kiếm thông tin (retrieval) và sinh văn bản bằng AI (generation). Khi nhận câu hỏi, hệ thống RAG tìm kiếm các đoạn văn bản liên quan từ cơ sở tri thức, sau đó đưa vào ngữ cảnh prompt để LLM tạo câu trả lời chính xác dựa trên dữ liệu thật thay vì bịa đặt.

RAG khắc phục được vấn đề gì của LLM?

RAG giải quyết hallucination (bịa đặt thông tin), giới hạn kiến thức tới thời điểm training, và không biết dữ liệu riêng của tổ chức. Thay vì chỉ dựa vào trí nhớ đã học, RAG cho phép LLM truy cập tri thức mới nhất hoặc nội bộ công ty trong lúc trả lời.

Triển khai RAG cần công nghệ gì?

Stack cơ bản gồm: (1) LLM API (OpenAI, Anthropic, hoặc mô hình mở như Llama), (2) Vector database (Pinecone, Weaviate, Qdrant, hoặc PostgreSQL + pgvector), (3) Embedding model để chuyển văn bản thành vector, (4) Framework orchestration (LangChain, LlamaIndex). Chi phí khởi động thấp nếu dùng dịch vụ cloud managed.

RAG có tốn kém không?

Chi phí phụ thuộc quy mô. Startup/SME có thể bắt đầu từ $50-200/tháng với Pinecone free tier + OpenAI API. Doanh nghiệp lớn tự host vector DB và fine-tune mô hình mở có thể kiểm soát chi phí dài hạn tốt hơn, nhưng cần đầu tư infrastructure.

#RAG#AI#chatbot#vector-database#LLM#machine-learning