Mở đầu — vì sao bài này quan trọng
Ở Bài 22 và 23, chúng ta đã dựng được một hệ thống RAG hoàn chỉnh dựa trên vector search: nhúng tài liệu thành embeddings, lưu vào vector database, rồi tìm những đoạn văn "gần nghĩa" nhất với câu hỏi của người dùng. Nghe rất hiện đại, rất "AI". Nhưng khi bạn mang hệ thống đó ra cho người dùng thật, bạn sẽ va phải một sự thật phũ phàng: vector search một mình thường không đủ, và đôi khi còn tệ hơn cả tìm kiếm từ khóa kiểu cũ.
Hãy tưởng tượng bạn làm PM cho một sàn thương mại điện tử như Tiki hoặc Lazada. Một khách hàng gõ vào ô tìm kiếm: "iPhone 15 Pro Max mã A2849". Vector search có thể trả về iPhone 15 thường, iPhone 14 Pro, thậm chí cả ốp lưng iPhone — vì chúng "gần nghĩa" với truy vấn. Nhưng cái mã "A2849" — thứ quan trọng nhất, thứ xác định chính xác sản phẩm — thì bị embedding hòa tan vào một vector mờ nhạt, không khớp chính xác được. Khách hàng tìm một mã cụ thể mà nhận về một mớ sản phẩm na ná. Đó là lúc bạn nhận ra: vector giỏi ngữ nghĩa nhưng dở chính xác.
Hybrid Search — kết hợp vector search và keyword search — sinh ra để giải đúng bài toán này. Đây không phải kỹ thuật phụ trợ "có thì tốt", mà gần như là tiêu chuẩn mặc định cho mọi hệ thống tìm kiếm và RAG nghiêm túc trong năm 2026. Là một AI Product Manager, bạn cần hiểu rõ vì sao hai phương pháp bổ khuyết cho nhau, kết hợp chúng thế nào, và những quyết định sản phẩm nào nằm sau lựa chọn đó.
Khái niệm cốt lõi
Hai loại tìm kiếm, hai điểm mù khác nhau
Keyword search (tìm kiếm từ khóa, hay còn gọi là lexical search, sparse retrieval) hoạt động dựa trên sự khớp chính xác của các từ. Thuật toán kinh điển là BM25 — một công thức tính điểm dựa trên: từ khóa trong truy vấn xuất hiện bao nhiêu lần trong tài liệu (term frequency), và từ đó hiếm hay phổ biến trong toàn bộ kho dữ liệu (inverse document frequency). Từ càng hiếm mà khớp được thì điểm càng cao.
- Điểm mạnh: khớp chính xác mã sản phẩm, tên riêng, thuật ngữ chuyên ngành, số serial, tên thương hiệu. Nếu tài liệu chứa đúng chữ "Vingroup" hay "A2849", BM25 tìm thấy ngay.
- Điểm mù: không hiểu ngữ nghĩa. Người dùng gõ "xe" thì BM25 không biết tài liệu nói về "ô tô" cũng liên quan. Gõ "laptop" sẽ không tìm thấy bài viết dùng từ "máy tính xách tay".
- Điểm mạnh: hiểu ngữ nghĩa và ý định. "Làm sao để giảm cân" khớp được với tài liệu nói về "chế độ ăn kiêng và tập luyện" dù không trùng một từ nào. "Xe" và "ô tô" nằm gần nhau trong không gian vector.
- Điểm mù: hay "trượt" những từ khớp chính xác. Mã sản phẩm, tên viết tắt, từ khóa hiếm, con số cụ thể thường bị làm mờ. Vector cũng kém với những từ ngoài vốn từ huấn luyện của model embedding (out-of-vocabulary), ví dụ tên sản phẩm mới ra mắt.
Vấn đề khó nhất: gộp điểm số như thế nào
Đây mới là phần thú vị về mặt kỹ thuật. BM25 cho ra điểm số có thang đo tùy ý (có thể từ 0 đến vài chục, không giới hạn trên). Cosine similarity cho ra điểm từ -1 đến 1. Hai thang đo này không thể cộng thẳng — như cộng tiền đồng với tiền đô mà không quy đổi. Có hai cách phổ biến để hòa giải:
Cách 1 — Reciprocal Rank Fusion (RRF). Thay vì dùng điểm số, ta chỉ dùng thứ hạng của tài liệu trong mỗi danh sách. Công thức: điểm RRF của một tài liệu = tổng của 1/(k + thứ_hạng) qua từng hệ thống tìm kiếm, với k thường là 60. Ví dụ một tài liệu đứng hạng 1 ở vector và hạng 3 ở keyword sẽ được 1/61 + 1/63. RRF cực kỳ phổ biến vì nó đơn giản, không cần chuẩn hóa thang đo, và hoạt động bền vững trong thực tế. Đây là lựa chọn mặc định tôi khuyên dùng khi mới bắt đầu.
Cách 2 — Weighted Score Fusion. Chuẩn hóa cả hai điểm về cùng thang [0,1] (ví dụ min-max normalization), rồi tính điểm cuối = alpha × điểm_vector + (1 − alpha) × điểm_keyword. Tham số alpha (từ 0 đến 1) cho phép bạn nghiêng về ngữ nghĩa hay từ khóa. Cách này linh hoạt hơn nhưng nhạy cảm với việc chuẩn hóa và cần tinh chỉnh nhiều hơn.
Re-ranking — tầng tinh chỉnh cuối
Hybrid search thường chỉ là bước "truy hồi thô" (retrieval): lấy ra khoảng 20-50 ứng viên tiềm năng. Sau đó người ta thường thêm một tầng re-ranker — một model chuyên biệt (cross-encoder) đọc từng cặp (truy vấn, tài liệu) và chấm điểm độ liên quan chính xác hơn nhiều, rồi sắp xếp lại để lấy top 3-5 đưa vào prompt cho LLM. Bài này tập trung vào tầng hybrid retrieval; re-ranking là một mảnh ghép bổ sung mà bạn nên biết tên để không nhầm lẫn về phạm vi.
Tình huống thực tế
Ví dụ 1 — Sàn TMĐT: từ tỷ lệ tìm-không-ra cao xuống còn thấp
Giả sử một sàn TMĐT tầm trung tại Việt Nam, gọi là ShopV, vận hành tìm kiếm sản phẩm hoàn toàn bằng vector search vì đội kỹ thuật mới "lên đời AI". Sau một tháng, đội data phát hiện tỷ lệ "tìm kiếm trả về 0 kết quả phù hợp" (no-result hoặc người dùng thoát ngay sau khi tìm) lên tới 18%. Đào sâu log, họ thấy phần lớn các truy vấn lỗi rơi vào hai nhóm: mã sản phẩm ("SKU TV-SS-55Q60") và tên model cụ thể ("Galaxy A55 5G").
Vấn đề rõ ràng: vector làm mờ những chuỗi ký tự đặc thù. Đội triển khai hybrid search với RRF, chạy song song BM25 (bắt mã và tên model) cùng vector (bắt các truy vấn mô tả như "tivi màn hình lớn xem bóng đá"). Kết quả sau hai tuần: tỷ lệ no-result tụt từ 18% xuống còn 6%, và tỷ lệ click vào kết quả ở vị trí top 3 tăng đáng kể.
Bài học: với sản phẩm có nhiều định danh chính xác (mã, model, thương hiệu), keyword không phải di sản lỗi thời mà là thành phần không thể thiếu. Đừng bỏ BM25 chỉ vì nó "cũ".
Ví dụ 2 — RAG nội bộ cho công ty bảo hiểm
Một công ty bảo hiểm nhân thọ tại TP.HCM xây trợ lý nội bộ giúp tư vấn viên tra cứu điều khoản hợp đồng. Ban đầu họ dùng vector search thuần. Vấn đề xuất hiện khi tư vấn viên hỏi: "Điều khoản loại trừ của gói An Phúc 2024 là gì?". Vector trả về các đoạn nói chung về "điều khoản loại trừ" của nhiều gói khác nhau, nhưng thường bỏ sót đúng đoạn về gói "An Phúc 2024" — vì tên riêng của gói sản phẩm bị embedding làm mờ, lẫn vào hàng chục gói tên na ná.
Họ chuyển sang hybrid: BM25 đảm bảo đoạn chứa đúng cụm "An Phúc 2024" luôn được kéo lên, trong khi vector đảm bảo hiểu được "điều khoản loại trừ" cũng đồng nghĩa với "các trường hợp không được chi trả". Họ đặt alpha = 0.5 ban đầu rồi tinh chỉnh xuống 0.4 (nghiêng nhẹ về keyword) vì miền dữ liệu này có quá nhiều tên riêng và con số. Độ chính xác của câu trả lời (đo bằng đánh giá thủ công của chuyên gia trên 200 câu hỏi mẫu) tăng từ khoảng 71% lên 89%.
Bài học: trong các miền có nhiều định danh — tên gói, số hợp đồng, ngày tháng, số điều khoản — bạn nên cân alpha nghiêng về keyword. Và quan trọng: hãy đo bằng bộ câu hỏi mẫu của chính miền dữ liệu, đừng tin vào cảm giác.
Ví dụ 3 — Tìm kiếm hỗ trợ kỹ thuật đa ngôn ngữ
Một startup SaaS Đông Nam Á phục vụ khách hàng cả tiếng Việt lẫn tiếng Anh, có kho tài liệu hỗ trợ (help center). Người dùng Việt thường gõ lẫn lộn: "lỗi error 504 khi đăng nhập". Ở đây có cả từ khóa kỹ thuật chính xác ("504") lẫn ý định mô tả ("lỗi khi đăng nhập"). Vector thuần xử lý tốt phần mô tả nhưng hay bỏ sót đúng bài viết về mã lỗi 504; keyword thuần bắt đúng "504" nhưng bỏ lỡ những bài dùng từ "thời gian chờ vượt quá" thay vì "504".
Hybrid giải quyết cả hai vế. Họ còn phát hiện một điều tinh tế: với tiếng Việt, chất lượng BM25 phụ thuộc nặng vào bước tách từ (tokenization) đúng — "đăng nhập" phải được hiểu là một đơn vị, không phải tách rời "đăng" và "nhập". Sau khi dùng bộ tách từ tiếng Việt phù hợp, độ chính xác của nhánh keyword cải thiện rõ rệt.
Bài học: hybrid search không miễn nhiễm với vấn đề ngôn ngữ. Với tiếng Việt, đầu tư vào tách từ (tokenization) cho nhánh keyword là việc đáng làm và thường bị bỏ quên.
Hướng dẫn từng bước
Đây là quy trình triển khai hybrid search mà bạn — với vai trò PM — nên hiểu để dẫn dắt đội kỹ thuật và đặt đúng câu hỏi:
- Chuẩn bị hai nhánh chỉ mục. Đảm bảo kho tài liệu được index theo cả hai cách: một chỉ mục vector (embeddings) và một chỉ mục từ khóa (BM25/full-text). Nhiều vector database hiện đại như Weaviate, Qdrant, Elasticsearch, hoặc pgvector kết hợp Postgres full-text đã hỗ trợ sẵn cả hai.
- Khi có truy vấn, chạy song song. Gửi cùng một truy vấn tới cả hai nhánh, mỗi nhánh trả về danh sách top-N ứng viên (ví dụ top 50 mỗi bên). Chạy song song để không cộng dồn độ trễ.
- Gộp kết quả. Bắt đầu bằng RRF (k=60) vì nó đơn giản và không cần chuẩn hóa thang đo. Nếu cần kiểm soát tinh hơn, chuyển sang weighted fusion với alpha và chuẩn hóa min-max.
- (Tùy chọn) Re-rank. Đưa danh sách đã gộp (ví dụ top 20) qua một cross-encoder re-ranker để lấy ra top 3-5 chính xác nhất.
- Xây bộ đánh giá (eval set) trước khi tinh chỉnh. Soạn 100-200 truy vấn thật, gắn nhãn đâu là kết quả đúng. Đây là tài sản quý nhất — không có nó, mọi tinh chỉnh chỉ là cảm tính.
- Tinh chỉnh alpha và đo lường. Thử các giá trị alpha khác nhau (0.3, 0.5, 0.7), đo các chỉ số như Recall@k, MRR, NDCG trên eval set. Chọn cấu hình tốt nhất cho miền dữ liệu của bạn.
- Theo dõi sau khi lên production. Giám sát tỷ lệ no-result, tỷ lệ click vào top kết quả, và phản hồi người dùng. Hybrid search cần được hiệu chỉnh theo dữ liệu thật.
Lỗi thường gặp & mẹo
Lỗi: cộng thẳng điểm BM25 và cosine. Như đã nói, hai thang đo khác nhau. Cộng thẳng khiến BM25 (điểm có thể lên hàng chục) áp đảo cosine (tối đa 1). Luôn dùng RRF hoặc chuẩn hóa trước khi gộp.
Lỗi: tin rằng vector luôn tốt hơn keyword. Đây là cái bẫy tâm lý phổ biến nhất — nghĩ rằng cái gì "AI" thì hơn cái cũ. Với truy vấn chứa mã, số, tên riêng, keyword thường thắng. Hybrid tồn tại chính vì không cái nào luôn thắng.
Lỗi: bỏ qua tách từ tiếng Việt cho nhánh keyword. BM25 trên tiếng Việt mà tách từ sai sẽ cho kết quả kém. Đầu tư vào tokenizer phù hợp.
Lỗi: không có eval set. Tinh chỉnh alpha bằng cảm giác là tự lừa mình. Một bộ 100-200 truy vấn gắn nhãn sẽ giúp bạn quyết định dựa trên số liệu.
Mẹo: bắt đầu với RRF, đừng tối ưu sớm. RRF cho kết quả tốt ngay mà gần như không cần chỉnh. Chỉ chuyển sang weighted fusion khi bạn thật sự cần kiểm soát chi tiết.
Mẹo: log lại truy vấn nào nhờ nhánh nào. Theo dõi xem kết quả thắng đến từ vector hay keyword giúp bạn hiểu hành vi người dùng và quyết định alpha hợp lý.
Mẹo: cân nhắc độ trễ và chi phí. Chạy hai nhánh tốn tài nguyên hơn một nhánh. Với hệ thống lưu lượng lớn, hãy đo độ trễ thêm vào và cân nhắc cache cho các truy vấn phổ biến.
Bài tập thực hành
- Phân loại truy vấn. Lấy 20 truy vấn thật từ một sản phẩm bạn quen thuộc (app, website công ty bạn). Với mỗi truy vấn, đánh dấu: phương pháp nào sẽ phục vụ tốt hơn — vector, keyword, hay cần cả hai? Đếm xem bao nhiêu phần trăm thật sự cần hybrid.
- Thiết kế eval set mini. Chọn 10 truy vấn, tự tay xác định 1-2 tài liệu/sản phẩm đúng cho mỗi truy vấn. Đây là phiên bản thu nhỏ của bộ đánh giá thực tế.
- Lý luận về alpha. Cho ba kịch bản: (a) tìm kiếm tài liệu pháp lý nhiều số điều khoản, (b) trợ lý hỏi-đáp chăm sóc sức khỏe mô tả triệu chứng, (c) tìm kiếm sản phẩm điện tử. Với mỗi kịch bản, bạn sẽ đặt alpha nghiêng về vector hay keyword? Giải thích trong 2-3 câu.
- (Nâng cao) Vẽ sơ đồ luồng. Vẽ pipeline hybrid search từ truy vấn người dùng đến kết quả cuối, chỉ rõ điểm chạy song song, điểm gộp (RRF), và điểm re-rank tùy chọn.
Tóm tắt
Vector search hiểu ngữ nghĩa nhưng trượt khớp chính xác; keyword search khớp chính xác nhưng mù ngữ nghĩa. Điểm mù của chúng bù trừ cho nhau gần như hoàn hảo, và Hybrid Search là việc chạy cả hai song song rồi gộp kết quả — phổ biến nhất bằng Reciprocal Rank Fusion (RRF) vì nó đơn giản và bền vững, hoặc bằng weighted fusion với tham số alpha khi cần kiểm soát chi tiết. Thử thách kỹ thuật chính là hòa giải hai thang điểm khác nhau, không bao giờ cộng thẳng. Với tiếng Việt, đừng quên đầu tư vào tách từ cho nhánh keyword. Và trên hết — với vai trò PM, tài sản quý nhất của bạn không phải thuật toán mà là bộ eval set: 100-200 truy vấn thật gắn nhãn, để mọi quyết định tinh chỉnh dựa trên số liệu chứ không phải cảm giác. Khi nắm vững hybrid search, bạn đã có nền tảng vững để bước sang các kỹ thuật quản lý kho tri thức ở bài tiếp theo.