RAG căn bản: hỏi đáp trên chính tài liệu của bạn

Tích hợp & APINâng cao7 phút đọc

Retrieval Augmented Generation nghe phức tạp nhưng bản chất chỉ một câu: tìm đúng vài đoạn liên quan trong kho tài liệu, đưa vào prompt, để Claude trả lời DỰA TRÊN chúng. Guide này cho bạn bản đồ toàn tuyến trước khi viết dòng code đầu tiên.

Bạn sẽ học được
  • Nắm hai pha của RAG: chuẩn bị một lần và phục vụ mỗi câu hỏi
  • Chọn cách cắt tài liệu (chunking) không phá vỡ ngữ nghĩa
  • Biết khi nào cần hybrid search thay vì chỉ semantic
Bạn cần gì
  • Biết Python cơ bản
  • Một kho tài liệu thật muốn hỏi đáp

Vì sao không nhét hết vào context

Context window lớn nhưng hữu hạn — và như bài Working Memory của khóa AI Capabilities chỉ ra, nhồi càng nhiều thứ không liên quan, chất lượng càng giảm. RAG đảo ngược bài toán: thay vì đưa TẤT CẢ, chỉ đưa phần LIÊN QUAN — mỗi câu hỏi một bộ ngữ cảnh riêng, nhỏ và trúng.

Pha 1 — chuẩn bị kho (chạy một lần)

Chất lượng RAG được định đoạt phần lớn ở bước cắt: chunk cắt ngang giữa một điều khoản sẽ không bao giờ được tìm thấy trọn vẹn.

  • Cắt tài liệu thành chunk: mỗi chunk một khối ngữ nghĩa trọn vẹn
  • Embed từng chunk: biến văn bản thành vector số đại diện ý nghĩa
  • Lưu vào vector store cùng metadata (nguồn, trang, ngày)

Cắt theo cấu trúc, không theo độ dài mù

Cách cắt tồi nhất là đếm đủ N ký tự rồi chặt. Cách tốt: tôn trọng cấu trúc tài liệu — theo đề mục, điều khoản, đoạn — và cho hai chunk kề nhau chồng lấn một phần để không mất ngữ cảnh ở đường cắt.

# cắt theo heading, chồng lấn 15%
chunks = split_by_headings(doc)          # mỗi mục một chunk
chunks = merge_small(chunks, min_tokens=200)
chunks = add_overlap(chunks, ratio=0.15) # giữ mạch ở biên

Pha 2 — phục vụ mỗi câu hỏi

Hai câu lệnh trong prompt — "chỉ dựa trên" và "nói rõ nếu thiếu" — là van an toàn chống bịa, đáng giá hơn mọi tinh chỉnh khác.

q_vec   = embed(cau_hoi)
hits    = vector_store.search(q_vec, top_k=5)
context = "\n\n".join(h.text for h in hits)

prompt = f"""Chỉ dựa trên các trích đoạn sau để trả lời.
Nếu không đủ thông tin, nói rõ "tài liệu không đề cập".
Với mỗi ý, ghi nguồn [số trang].

<trich_doan>{context}</trich_doan>

Câu hỏi: {cau_hoi}"""

Hybrid search: khi semantic thôi là chưa đủ

Semantic search giỏi bắt Ý ("nghỉ phép năm" tìm ra "chế độ nghỉ hằng năm") nhưng hay trượt các chuỗi cần khớp CHÍNH XÁC: mã sản phẩm, số điều luật, tên riêng hiếm. Giải pháp chuẩn: chạy song song BM25 (khớp từ khóa) và gộp kết quả hai bên. Dấu hiệu bạn cần nó: người dùng hỏi bằng mã/ID mà hệ thống trả về đoạn "na ná".

Đánh giá trước khi tin

Trước khi khoe demo, hãy chấm điểm: 20 câu hỏi thật kèm đáp án mong muốn, chạy qua pipeline, đếm bao nhiêu câu trả lời đúng VÀ dẫn đúng nguồn. Con số này là baseline — mọi tinh chỉnh (đổi cách cắt, tăng top_k, thêm BM25) phải chứng minh bằng điểm số tăng, không bằng cảm giác.

Nội dung này có hữu ích không?
Kiểm tra kiến thức

Củng cố những gì bạn vừa học

3 câu trắc nghiệm · đạt từ 70% · câu hỏi và đáp án xáo trộn mỗi lần.

Đăng ký nhận bản tin

Chọn chủ đề bạn quan tâm — nhận bài viết chọn lọc và thông báo sự kiện gửi thẳng vào hộp thư.

Bảo mật thông tin. Hủy đăng ký bất cứ lúc nào. Chính sách bảo mật