Bỏ qua đến nội dung chính

BM25 lexical search

📖 Nội dung bài học

Summary

Khi xây dựng một RAG pipeline, bạn sẽ nhanh chóng nhận ra rằng semantic search đơn thuần không phải lúc nào cũng trả về kết quả tốt nhất. Đôi khi bạn cần khớp chính xác các thuật ngữ mà semantic search có thể bỏ sót. Giải pháp là kết hợp semantic search với lexical search bằng một kỹ thuật gọi là BM25.

Vấn đề với Semantic Search Đơn Thuần

Giả sử bạn đang tìm kiếm một mã sự cố cụ thể như "INC-2023-Q4-011" trong một tài liệu. Mặc dù thuật ngữ chính xác này xuất hiện nhiều lần trong các phần liên quan, semantic search có thể trả về các phần không liên quan, có ý nghĩa tương tự nhưng thực tế không chứa thuật ngữ cụ thể bạn đang tìm kiếm.

Điều này xảy ra vì semantic search tập trung vào ý nghĩa thay vì khớp chính xác. Khi bạn cần khớp thuật ngữ chính xác, bạn cần một cách tiếp cận khác.

Chiến lược Hybrid Search

Giải pháp là chạy hai tìm kiếm song song và hợp nhất kết quả:

  • Semantic Search - Sử dụng embeddings và vector databases để khớp dựa trên ý nghĩa.
  • Lexical Search - Sử dụng tìm kiếm văn bản cổ điển để khớp thuật ngữ chính xác.
  • Merge Results - Kết hợp cả hai bộ kết quả để có độ bao phủ tốt hơn.

BM25 Hoạt Động Như Thế Nào

BM25 (Best Match 25) là một thuật toán phổ biến cho lexical search trong RAG pipelines. Đây là cách nó xử lý một truy vấn tìm kiếm:

Thuật toán tuân theo các bước chính sau:

  1. Tokenize truy vấn - Chia câu hỏi của người dùng thành các thuật ngữ riêng lẻ.
  2. Đếm tần suất thuật ngữ - Xem mỗi thuật ngữ xuất hiện bao nhiêu lần trên tất cả các tài liệu.
  3. Trọng số thuật ngữ theo độ hiếm - Các thuật ngữ ít được sử dụng hơn sẽ có điểm quan trọng cao hơn.
  4. Tìm các kết quả khớp tốt nhất - Trả về các đoạn văn chứa nhiều lần xuất hiện của các thuật ngữ có trọng số cao hơn.

Điểm mấu chốt là các thuật ngữ hiếm như "INC-2023-Q4-011" quan trọng hơn nhiều đối với tìm kiếm so với các từ phổ biến như "a" hoặc "the".

Triển khai BM25 Search

Đây là cách thiết lập một hệ thống BM25 search:


store = BM25Index()

for chunk in chunks:
    store.add_document({"content": chunk})

results = store.search("What happened with INC-2023-Q4-011?", 3)

Việc triển khai BM25 cung cấp API giống như hệ thống semantic search của bạn - cả hai đều có các phương thức add_document()search(), giúp chúng dễ dàng sử dụng cùng nhau.

Kết quả tìm kiếm tốt hơn

Khi bạn chạy cùng một truy vấn qua BM25 mà đã thất bại với semantic search đơn thuần, bạn sẽ nhận được kết quả tốt hơn nhiều. Thay vì trả về các phần không liên quan, BM25 ưu tiên các phần thực sự chứa các thuật ngữ tìm kiếm cụ thể của bạn.

Thuật toán xác định chính xác rằng "INC-2023-Q4-011" là một thuật ngữ hiếm, quan trọng và xếp hạng các tài liệu chứa nó cao hơn nhiều so với các tài liệu chỉ chứa các từ phổ biến từ truy vấn.

Bước tiếp theo

Bây giờ bạn đã có cả hai hệ thống semantic và lexical search hoạt động độc lập, bước tiếp theo là hợp nhất kết quả của chúng. Cách tiếp cận hybrid này mang lại cho bạn những lợi ích tốt nhất của cả hai thế giới - sự hiểu biết ngữ cảnh của semantic search kết hợp với độ chính xác của việc khớp thuật ngữ chính xác từ lexical search.

Cả hai hệ thống tìm kiếm đều sử dụng API tương tự, giúp việc truy vấn cả hai song song và kết hợp kết quả của chúng thành một bộ kết quả toàn diện hơn trở nên đơn giản.

Downloads

🔁 Bài học liên quan

📚 Nguồn & ghi nhận

Bài học có hữu ích không?

Góp ý / Báo lỗiPhát hiện sai sót hoặc có ý tưởng cải thiện?