Tối ưu kết quả trả về từ VectorDB với Scoring và Fingerprint | Xây dựng RAG AI

Giới thiệu

Trong hai phần trước của series Xây dựng RAG AI, chúng ta đã đi qua:

  • Phần 1: Tạo ứng dụng ASP.NET Core (.NET 8) và kết nối với OpenAI Chat Model.

  • Phần 2: Trang bị bộ nhớ cho RAG bằng Vector Database (Qdrant) với cơ chế lưu trữ embedding.

Đến Phần 3 này, chúng ta sẽ cùng nâng cấp khả năng tìm kiếm và truy vấn dữ liệu từ VectorDB. Nếu ở bài trước, hệ thống chỉ dừng lại ở mức “tìm được kết quả liên quan”, thì trong thực tế, chúng ta cần một bước quan trọng hơn: tối ưu hóa kết quả trả về để đảm bảo chính xác – gọn gàng – đáng tin cậy.


Những hạn chế khi chỉ tìm kiếm cơ bản trong VectorDB

Ở mức cơ bản, VectorDB trả về kết quả dựa trên độ tương đồng (similarity) giữa câu hỏi và embedding đã lưu. Tuy nhiên, trong ứng dụng thực tế, điều này có một số hạn chế:

  1. Nhiễu – Có những kết quả tuy khớp vector nhưng lại không thực sự liên quan đến ngữ cảnh.

  2. Dữ liệu trùng lặp – Có thể do nhập liệu nhầm hoặc dữ liệu bị lặp trong cơ sở.

  3. Thiếu độ tin cậy – Kết quả không có trích nguồn, khiến người dùng khó kiểm chứng.

Chính vì vậy, việc chỉ “truy vấn và trả về” là chưa đủ. Chúng ta cần các kỹ thuật bổ sung.


Giải pháp tối ưu kết quả trong RAG AI

1. Lọc nhiễu bằng Scoring

  • Khi người dùng đưa ra câu hỏi, hệ thống sẽ tạo question vector và lấy ra danh sách các hits (kết quả).

  • Thay vì chấp nhận tất cả các hits trong Top K (ví dụ K=5), ta áp dụng thêm ngưỡng điểm (minimum score).

  • Ví dụ: chỉ giữ kết quả có score ≥ 0.25 hoặc 0.5.

  • Nếu tất cả dưới ngưỡng → trả về thông báo "không có kết quả phù hợp".

👉 Điều này giúp loại bỏ nhiễu, giữ lại các kết quả chất lượng và liên quan nhất.


2. Trích nguồn (Citation) để tăng tính minh bạch

  • Thay vì trả về một đoạn văn bản thuần túy, hệ thống sẽ bổ sung thêm:

    • Câu trả lời chính

    • Danh sách context (nguồn tham chiếu)

Ví dụ: câu trả lời AI đưa ra sẽ kèm link, tài liệu hoặc đoạn văn gốc đã được lấy từ VectorDB.
Điều này giúp người dùng tin tưởng hơn vì họ có thể kiểm chứng ngay tại nguồn.


3. Loại bỏ dữ liệu trùng lặp với Fingerprint

  • Trong thực tế, dữ liệu có thể bị nhập nhầm hoặc nạp nhiều lần, dẫn đến cùng một nội dung xuất hiện lặp lại khi truy vấn.

  • Giải pháp: sử dụng Fingerprint hoặc Hash để nhận diện và loại bỏ các bản ghi trùng lặp.

  • Nhờ đó, kết quả trả về sẽ sạch và tinh gọn, không gây khó chịu cho người dùng.


Triển khai kỹ thuật trong code

  • Refactor lại một số phần trong ứng dụng để dễ đọc và dễ quản lý hơn:

    • AppConfig, LMProvider, VectorPlan thay cho các tên cũ không rõ nghĩa.

  • Nguyên tắc clean code: “Tên dài còn hơn tên vô nghĩa”.

  • Xây dựng các hàm filter, dedup, và citation để tích hợp trực tiếp vào pipeline RAG.


Kết luận

Với Scoring, Fingerprint và Citation, hệ thống RAG AI không chỉ đơn giản là tìm kiếm dữ liệu mà đã tiến thêm một bước quan trọng:

  • Chính xác hơn nhờ lọc kết quả kém liên quan.

  • Đáng tin cậy hơn nhờ trích nguồn.

  • Gọn gàng hơn nhờ loại bỏ trùng lặp.

Đây chính là nền tảng để xây dựng một ứng dụng RAG AI mạnh mẽ và thực tế.

Trong Phần 4 của series, chúng ta sẽ tiếp tục đi sâu vào việc tích hợp thêm công cụ và tối ưu pipeline để hệ thống RAG AI trở nên linh hoạt và thông minh hơn.


Tác giả: Bạch Ngọc Toàn

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên