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

A Multi-index RAG pipeline

📖 Nội dung bài học

Màu phông

Trắng

Độ mờ phông

100%

Kích thước phông

100%

Kiểu phông

Arial

Đường viền ký tự

Tóm tắt

Khi bạn có cả tìm kiếm ngữ nghĩa (vector embeddings) và tìm kiếm từ vựng (BM25) hoạt động độc lập, bước tiếp theo là kết hợp chúng thành một pipeline tìm kiếm thống nhất. Cách tiếp cận kết hợp này tận dụng thế mạnh của cả hai phương pháp để mang lại kết quả chính xác hơn.

Tạo một giao diện thống nhất

Cả hai cách triển khai tìm kiếm đều chia sẻ API gần như giống hệt nhau - cả hai đều có các phương thức add_document()search() hoạt động theo cùng một cách. Sự nhất quán này giúp bạn dễ dàng gói chúng trong một class Retriever.

Retriever hoạt động như một người điều phối, chuyển tiếp các truy vấn của người dùng đến cả hai index, thu thập kết quả của chúng và hợp nhất chúng thành một danh sách được xếp hạng duy nhất.

Reciprocal Rank Fusion

Thách thức là hợp nhất kết quả từ các phương pháp tìm kiếm khác nhau sử dụng các hệ thống tính điểm khác nhau. Tìm kiếm vector trả về điểm tương đồng cosine, trong khi BM25 trả về điểm liên quan - bạn không thể chỉ kết hợp trực tiếp các số này.

Thay vào đó, bạn dùng một kỹ thuật gọi là Reciprocal Rank Fusion (RRF). Phương pháp này tập trung vào vị trí xếp hạng của kết quả thay vì điểm số thô của chúng.

Đây là cách nó hoạt động với một ví dụ. Giả sử tìm kiếm vector của bạn trả về các phần 2, 7 và 6 theo thứ tự đó, trong khi BM25 trả về các phần 6, 2 và 7. Để hợp nhất chúng:

Đầu tiên, tạo một bảng hiển thị từng đoạn văn bản và thứ hạng của nó từ cả hai phương pháp tìm kiếm:

  • Phần 2: Xếp hạng 1 từ vector, xếp hạng 2 từ BM25
  • Phần 7: Xếp hạng 2 từ vector, xếp hạng 3 từ BM25
  • Phần 6: Xếp hạng 3 từ vector, xếp hạng 1 từ BM25

Sau đó, áp dụng công thức RRF để tính điểm kết hợp cho từng đoạn:

RRF_score(d) = Σ(1 / (k + rank_i(d)))

Trong đó k là một hằng số (thường là 60, nhưng bạn sẽ dùng 1 để có kết quả rõ ràng hơn) và rank_i(d) là thứ hạng của tài liệu d trong kết quả tìm kiếm thứ i.

Đối với ví dụ của bạn:

  • Phần 2: 1.0/(1+1) + 1.0/(1+2) = 0.833
  • Phần 7: 1.0/(1+2) + 1.0/(1+3) = 0.583
  • Phần 6: 1.0/(1+3) + 1.0/(1+1) = 0.75

Xếp hạng cuối cùng trở thành: Phần 2 (0.833), Phần 6 (0.75), Phần 7 (0.583). Điều này có ý nghĩa trực quan - Phần 2 hoạt động tốt trong cả hai tìm kiếm, Phần 6 có kết quả hỗn hợp và Phần 7 xếp hạng thấp hơn.

Triển khai

Việc triển khai class Retriever rất đơn giản:

class Retriever:
    def __init__(self, *indexes):
        self._indexes = list(indexes)
    
    def add_document(self, document):
        for index in self._indexes:
            index.add_document(document)
    
    def search(self, query_text, k=1, k_rrf=60):
        # Get results from all indexes
        all_results = [index.search(query_text, k) for index in self._indexes]
        
        # Apply reciprocal rank fusion
        # ... merge logic here ...

Phần logic hợp nhất theo dõi thứ hạng tài liệu trên tất cả các kết quả tìm kiếm, tính toán điểm RRF và trả về các tài liệu top-k được sắp xếp theo điểm kết hợp của chúng.

Kiểm tra phương pháp tiếp cận kết hợp

Khi kiểm tra với truy vấn "what happened with INC-2023-Q4-011?", cách tiếp cận kết hợp mang lại kết quả tốt hơn nhiều so với chỉ tìm kiếm vector:

Kết quả bây giờ ưu tiên chính xác:

  1. Phần 10: Phân tích an ninh mạng (báo cáo sự cố thực tế)
  2. Phần 2: Kỹ thuật phần mềm (bối cảnh liên quan)
  3. Phần 5: Diễn biến pháp lý (ít liên quan hơn nhưng vẫn liên quan)

Lợi ích của kiến trúc kết hợp

Thiết kế này cung cấp một số lợi thế:

  • Thiết kế theo module: Mỗi index tìm kiếm được triển khai độc lập với cùng một API
  • Dễ mở rộng: Bạn có thể thêm các phương pháp tìm kiếm mới bằng cách triển khai cùng một giao diện search()add_document()
  • Độ chính xác tốt hơn: Kết hợp sự hiểu biết ngữ nghĩa với đối sánh từ khóa chính xác
  • Hợp nhất linh hoạt: Thuật toán RRF hoạt động bất kể bạn kết hợp bao nhiêu index tìm kiếm

API nhất quán có nghĩa là bạn có thể dễ dàng thêm một index tìm kiếm thứ ba - có lẽ một index chuyên về nhận dạng thực thể được đặt tên hoặc xử lý các loại tài liệu cụ thể - và Retriever sẽ tự động kết hợp kết quả của nó vào bảng xếp hạng cuối cùng.

Nền tảng tìm kiếm kết hợp này cung cấp khả năng truy xuất mạnh mẽ hơn đáng kể so với bất kỳ phương pháp nào, thiết lập pipeline RAG của bạn để có hiệu suất tốt hơn trên nhiều loại truy vấn hơn.

Tải xuống

🔁 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?