Khi hệ thống AI của bạn ‘ngơ ngác’ trước những từ khóa đặc thù
Bạn vừa hoàn thiện chatbot RAG cho công ty và tự tin đem đi demo. Sếp gõ một mã sản phẩm cụ thể: “Thông số kỹ thuật của Dell XPS 9315”. Thay vì trả về đúng mẫu máy đó, chatbot lại luyên thuyên về dòng XPS 13 nói chung hoặc tệ hơn là một mẫu máy đời cũ. Kết quả? Sếp thất vọng, còn bạn thì bối rối.
Vấn đề không nằm ở dữ liệu. Dữ liệu đã nằm sẵn trong Vector Database, nhưng AI lại không thể ‘nhặt’ ra đúng thứ bạn cần. Thực tế triển khai các dự án Enterprise AI cho thấy: Vector Search rất giỏi hiểu ý định nhưng lại thường xuyên ‘đầu hàng’ trước mã SKU, tên riêng hoặc thuật ngữ chuyên ngành. Đây chính là lúc Hybrid Search xuất hiện để cứu cánh.
Bản chất vấn đề: Tại sao Vector Search đơn thuần là chưa đủ?
Vector Search hoạt động dựa trên việc nén ngữ nghĩa văn bản thành một dãy số (Embedding). Khi nén, mô hình ưu tiên giữ lại ‘mùi vị’ chung của câu văn hơn là các ký tự chính xác.
Hãy nhìn vào ví dụ này: “iPhone 13” và “iPhone 14” có tọa độ vector cực kỳ gần nhau. Trong mắt AI, chúng đều là điện thoại cao cấp của Apple. Nếu người dùng cần tìm linh kiện thay thế chính xác cho đời 13, hệ thống có thể trả về kết quả đời 14 vì độ tương đồng ngữ nghĩa lên tới 98%.
Ngược lại, Keyword Search (như thuật toán BM25) lại hoạt động như một gã thợ soi chữ. Nó không cần biết “iPhone” là gì, nó chỉ quan tâm văn bản có khớp chính xác từng ký tự hay không. Điểm yếu của nó là sự máy móc. Nếu người dùng gõ “smartphone táo khuyết”, nó sẽ hoàn toàn ‘mù tịt’ vì không tìm thấy chữ nào trùng khớp.
Hybrid Search: Sự kết hợp ‘song kiếm hợp bích’
Thay vì đánh đổi, Hybrid Search kết hợp cả Dense Retrieval (Vector Search – hiểu ngữ nghĩa) và Sparse Retrieval (Keyword Search – khớp từ khóa).
Trong một dự án tra cứu tài liệu kỹ thuật mình từng thực hiện, việc chuyển từ Vector Search thuần túy sang Hybrid Search đã giúp chỉ số Top-1 Accuracy tăng từ 62% lên tận 89%. Qdrant hiện là một trong những engine hiếm hoi hỗ trợ cơ chế này cực kỳ tối ưu ngay từ lõi (native support).
Hướng dẫn triển khai với Qdrant và Python
Để bắt đầu, bạn cần cài đặt qdrant-client. Mình khuyến khích dùng thêm fastembed để xử lý embedding ngay tại máy mà không cần gọi API bên ngoài.
pip install qdrant-client fastembed
Bước 1: Khởi tạo Client
Chúng ta sẽ dùng chế độ :memory: của Qdrant để demo nhanh mà không cần cài đặt Docker phức tạp.
from qdrant_client import QdrantClient
# Chạy trực tiếp trên RAM để thử nghiệm
client = QdrantClient(":memory:")
Bước 2: Thiết lập Collection ‘lai’
Điểm mấu chốt nằm ở đây. Bạn phải định nghĩa cả vectors_config (cho Dense) và sparse_vectors_config (cho Keyword).
from qdrant_client.models import Distance, VectorParams, SparseVectorParams
client.create_collection(
collection_name="hybrid_rag_demo",
vectors_config={
"dense": VectorParams(size=384, distance=Distance.COSINE)
},
sparse_vectors_config={
"sparse": SparseVectorParams()
}
)
Bước 3: Nạp dữ liệu thông minh
Qdrant có tính năng cực hay là tự động hóa việc tạo vector. Bạn chỉ cần đưa văn bản thô vào, hệ thống sẽ tự lo phần còn lại.
documents = [
"Laptop Dell XPS 9315 core i7 thế hệ 12",
"Macbook Pro M2 màn hình Retina 14 inch",
"Hướng dẫn xử lý lỗi E01 máy giặt Electrolux"
]
# Qdrant tự động sinh cả Dense và Sparse vector
client.add(
collection_name="hybrid_rag_demo",
documents=documents
)
Bước 4: Truy vấn kết hợp
Hệ thống sẽ sử dụng thuật toán RRF (Reciprocal Rank Fusion) để trộn kết quả từ hai phương pháp tìm kiếm lại với nhau.
results = client.query(
collection_name="hybrid_rag_demo",
query_text="Lỗi E01 máy giặt",
limit=3
)
for hit in results:
print(f"Kết quả: {hit.metadata['document']} | Score: {hit.score:.4f}")
3 lưu ý ‘xương máu’ khi triển khai thực tế
Sau nhiều lần ‘vấp ngã’ khi đưa Hybrid Search lên production, đây là những kinh nghiệm mình rút ra:
- Cân chỉnh trọng số: Không phải dự án nào cũng cần tỷ lệ 50/50. Với dữ liệu chứa nhiều mã kỹ thuật hoặc log, hãy ưu tiên trọng số cho Keyword Search cao hơn.
- Vấn đề tiếng Việt: Sparse Vector phụ thuộc nặng vào việc tách từ. Bạn nên dùng thêm các thư viện như
pyvihoặcundertheseađể tiền xử lý văn bản trước khi đưa vào Qdrant nhằm tránh việc tìm “máy giặt” lại ra “máy cày”. - Chi phí tài nguyên: Việc lưu hai loại vector sẽ làm tăng dung lượng lưu trữ khoảng 20-30%. Tuy nhiên, đây là cái giá quá rẻ để đổi lấy sự chính xác của hệ thống.
Lời kết
Đừng để chatbot của bạn trở nên vô dụng chỉ vì không tìm thấy một mã sản phẩm. Kết hợp Hybrid Search với một bước Reranking bằng Cross-Encoder chính là bộ đôi hoàn hảo cho mọi hệ thống RAG hiện nay. Quy trình chuẩn sẽ là: Tìm kiếm Hybrid -> Rerank top 10 -> Đưa vào LLM. Chúc các bạn thành công với dự án AI của mình!

