RAG là gì? Cho AI trả lời dựa trên tài liệu của bạn

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Mô hình ngôn ngữ lớn biết nhiều nhưng không biết tài liệu nội bộ của bạn, và đôi khi trả lời rất tự tin nhưng sai. RAG là kỹ thuật phổ biến để khắc phục: tìm tài liệu liên quan trước, rồi đưa cho mô hình đọc khi trả lời. Hãy xem nó hoạt động ra sao.

RAG là gì?

RAG là viết tắt của Retrieval-Augmented Generation, tạm dịch "sinh văn bản có hỗ trợ truy xuất". Ý tưởng đơn giản như thi mở sách: thay vì bắt mô hình nhớ mọi thứ, bạn cho phép nó tra tài liệu trước khi trả lời.

Quy trình hoạt động

  1. Chuẩn bị dữ liệu: thu thập tài liệu (PDF, trang wiki, bài viết), cắt thành các đoạn nhỏ.
  2. Tạo embedding: mỗi đoạn được chuyển thành một dãy số (vector) biểu diễn ý nghĩa của nó. Những đoạn có nghĩa gần nhau sẽ có vector gần nhau.
  3. Lưu trữ: vector được lưu trong cơ sở dữ liệu hỗ trợ tìm kiếm tương đồng.
  4. Truy xuất: khi có câu hỏi, câu hỏi cũng được đổi thành vector và hệ thống tìm vài đoạn gần nhất.
  5. Sinh câu trả lời: các đoạn tìm được được ghép vào yêu cầu gửi cho mô hình, kèm chỉ dẫn "chỉ trả lời dựa trên các đoạn sau".

Vì sao dùng RAG thay vì huấn luyện lại mô hình?

  • Cập nhật dễ: tài liệu đổi thì chỉ cần cập nhật kho dữ liệu, không phải huấn luyện lại.
  • Chi phí thấp hơn: không cần tài nguyên huấn luyện lớn.
  • Có thể dẫn nguồn: bạn biết câu trả lời lấy từ đoạn tài liệu nào, giúp kiểm chứng.
  • Kiểm soát quyền truy cập: chỉ truy xuất tài liệu mà người hỏi được phép xem.

Minh họa bằng code

Đoạn Python dưới đây mô phỏng ý tưởng cốt lõi: tính độ tương đồng cosine giữa vector câu hỏi và các đoạn tài liệu. Trên thực tế, vector đến từ một mô hình embedding, ở đây ta dùng số giả định cho đơn giản:

import math

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a))
    nb = math.sqrt(sum(y * y for y in b))
    return dot / (na * nb)

docs = {
    "Chính sách hoàn tiền": [0.9, 0.1, 0.0],
    "Cách đổi mật khẩu":    [0.1, 0.8, 0.2],
}
query = [0.85, 0.15, 0.05]  # câu hỏi về hoàn tiền

best = max(docs, key=lambda k: cosine(query, docs[k]))
print(best)  # Chính sách hoàn tiền

Những điểm quyết định chất lượng

  • Cách cắt đoạn: đoạn quá dài làm loãng ý, quá ngắn làm mất ngữ cảnh. Thường cắt theo ý hoặc tiêu đề và cho chồng lấn nhẹ.
  • Chất lượng embedding: mô hình hỗ trợ tốt tiếng Việt sẽ tìm đúng hơn.
  • Số đoạn lấy về: quá ít thì thiếu thông tin, quá nhiều thì nhiễu và tốn token.
  • Chỉ dẫn cho mô hình: yêu cầu nói "không tìm thấy thông tin" khi tài liệu không có câu trả lời.
  • Kết hợp tìm kiếm từ khóa và ngữ nghĩa: giúp bắt được tên riêng, mã sản phẩm mà embedding bỏ sót.

Hạn chế

RAG giảm chứ không loại bỏ hoàn toàn việc mô hình trả lời sai. Nếu bước truy xuất lấy nhầm đoạn, câu trả lời vẫn lệch. Vì vậy cần đo chất lượng bằng bộ câu hỏi mẫu, ghi log các câu trả lời kém và cho người dùng thấy nguồn tham chiếu.

Ứng dụng phổ biến

  • Chatbot hỗ trợ khách hàng dựa trên trung tâm trợ giúp.
  • Trợ lý tra cứu tài liệu kỹ thuật, quy định nội bộ.
  • Hỏi đáp trên kho bài giảng hoặc sách.

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

RAG có cần cơ sở dữ liệu vector không?

Không bắt buộc. Với kho tài liệu nhỏ, tìm kiếm từ khóa hoặc lưu vector trong bộ nhớ vẫn đủ dùng. Cơ sở dữ liệu vector hữu ích khi dữ liệu lớn.

Làm sao biết RAG của tôi hoạt động tốt?

Hãy soạn một bộ câu hỏi mẫu kèm đáp án mong đợi, chạy hệ thống và kiểm tra xem đoạn tài liệu truy xuất có đúng không, câu trả lời có bám theo nguồn không.

Kết luận

RAG là cách thực dụng để biến một mô hình ngôn ngữ chung thành trợ lý am hiểu dữ liệu riêng của bạn. Nắm được quy trình cắt, nhúng, tìm và sinh là bạn đã hiểu nền móng của hầu hết chatbot tài liệu hiện nay.

Để làm chủ các kiến thức nền như API, cơ sở dữ liệu và Python phục vụ các dự án như vậy, mời bạn xem khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment