Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 5 — RAG cơ bản: cho agent trả lời dựa trên kiến thức của bạn

Đã đọc 0/8 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

RAG là gì

RAG (Retrieval-Augmented Generation) = truy xuất thông tin liên quan rồi nhồi vào prompt để LLM sinh câu trả lời có căn cứ. Nói ngắn: thay vì để model trả lời bằng kiến thức chung (dễ bịa), ta cung cấp đúng đoạn tài liệu của bạn và yêu cầu model chỉ dựa vào đó.

RAG là cách phổ biến nhất để agent "nhớ" một kho kiến thức lớn (hàng nghìn trang) mà không thể nhồi hết vào context window.

Kiến trúc RAG tối thiểu

Câu hỏi --> [Embed] --> [Vector store: tìm top-K chunk]
                                    |
                                    v
     PROMPT = system + "Ngữ cảnh:" + chunk_1..K + câu hỏi
                                    |
                                    v
                              [LLM] --> câu trả lời + trích dẫn

RAG chính là cầu nối giữa vector store (Bài 4) và LLM: retrieval lấy nguyên liệu, generation nấu thành câu trả lời.

Các bước xây một pipeline RAG chạy được

  • Chuẩn bị kho: chunk + embed + index tài liệu (đã học Bài 4).
  • Nhận câu hỏi, embed nó bằng cùng model.
  • Retrieve: lấy top-K chunk gần nhất, kèm metadata nguồn.
  • Xây prompt: đặt các chunk vào một khối "Ngữ cảnh", ra chỉ dẫn rõ: chỉ trả lời dựa trên ngữ cảnh; nếu không có thông tin thì nói không biết.
  • Generate: gọi LLM, yêu cầu kèm trích dẫn nguồn.
  • Hậu kiểm: kiểm tra câu trả lời có bám ngữ cảnh không (đặc biệt với domain nhạy cảm).

Code ngắn: một vòng RAG

def rag_answer(question, collection):
    hits = collection.query(query_texts=[question], n_results=4)
    context = "\n---\n".join(hits["documents"][0])
    prompt = f"""Bạn là trợ lý hỗ trợ. CHỈ dùng NGỮ CẢNH dưới đây.
Nếu ngữ cảnh không đủ, hãy nói "Tôi không có thông tin này".

NGỮ CẢNH:
{context}

CÂU HỎI: {question}
Trả lời kèm nguồn:"""
    return llm(prompt)

Hai câu chỉ dẫn "chỉ dùng ngữ cảnh" và "nói không biết nếu thiếu" là thứ ngăn model bịa — đừng bỏ.

Khung tư duy chất lượng RAG: chuỗi thất bại

Khi RAG trả lời sai, lỗi luôn nằm ở một trong ba mắt xích:

  • Retrieval sai: không lấy được chunk đúng → chunking/embedding/top-K có vấn đề.
  • Context đủ nhưng generation lệch: model bỏ qua ngữ cảnh hoặc bịa thêm → prompt chưa đủ nghiêm.
  • Kho thiếu: thông tin không tồn tại trong tài liệu → cần bổ sung nguồn.
Luôn debug theo thứ tự: chunk lấy về có đúng không? trước, rồi mới xét câu trả lời.

Checklist một pipeline RAG lành mạnh

  • [ ] Prompt có ràng buộc "chỉ dùng ngữ cảnh" và "được phép nói không biết"?
  • [ ] Có trả kèm trích dẫn/nguồn để người dùng kiểm chứng?
  • [ ] Đã kiểm tra thủ công top-K trên vài câu hỏi thật?
  • [ ] Có xử lý trường hợp retrieval rỗng (không tìm thấy gì)?
  • [ ] Có giới hạn tổng token của context để không tràn cửa sổ?

Sai lầm thường gặp

  • Đổ lỗi cho LLM khi retrieval mới là thủ phạm. Model không thể trả lời đúng nếu chunk lấy về sai — hãy in chunk ra mà xem.
  • Không cho phép "không biết". Ép model luôn trả lời khiến nó bịa khi ngữ cảnh thiếu.
  • Nhồi quá nhiều chunk. top-K = 20 làm loãng tín hiệu, tăng chi phí và dễ "lost in the middle".
  • Bỏ qua trích dẫn. Người dùng không kiểm chứng được, và bạn không debug được khi sai.
  • Coi RAG thay được mọi memory. RAG giỏi truy xuất kiến thức tĩnh; nó không thay cho profile có cấu trúc hay dữ liệu realtime.

Tổng kết

RAG = retrieval (từ vector store) + generation (LLM bị ràng buộc bám ngữ cảnh). Đây là cách chuẩn để agent trả lời dựa trên kiến thức riêng của bạn mà không cần fine-tune. Bài sau ta ghép RAG và các loại memory vào một agent hoàn chỉnh.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi