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

Reranking results

📖 Nội dung bài học

Đường viền ký tự

Tóm tắt

Cách tiếp cận truy xuất kết hợp (hybrid retrieval) mà bạn đã xây dựng hoạt động tốt, nhưng vẫn còn một số điểm chưa hoàn thiện. Khi bạn tìm kiếm "what did the eng team do with INC-2023-Q4-011?", bạn mong đợi phần Kỹ thuật phần mềm (Software Engineering) sẽ xếp hạng cao hơn vì nó đề cập cụ thể đến nhóm kỹ thuật và sự cố. Tuy nhiên, phần An ninh mạng (Cybersecurity) vẫn đứng đầu.

Đây là lúc re-ranking xuất hiện - một kỹ thuật hậu xử lý có thể cải thiện đáng kể độ chính xác của việc truy xuất.

Cách re-ranking hoạt động

Re-ranking thêm một bước bổ sung sau quá trình tìm kiếm kết hợp của bạn. Thay vì chỉ trả về kết quả đã hợp nhất từ chỉ mục vector và BM25 của bạn, bạn chuyển các kết quả đó qua một LLM để sắp xếp lại một cách thông minh.

Quy trình rất đơn giản:

  • Chạy tìm kiếm kết hợp hiện có của bạn (vector + BM25)
  • Hợp nhất các kết quả như trước
  • Gửi các kết quả đã hợp nhất đến Claude với một prompt re-ranking
  • Nhận lại một danh sách các tài liệu có liên quan nhất đã được sắp xếp lại

Prompt re-ranking

Cấu trúc prompt rất đơn giản nhưng hiệu quả. Bạn cung cấp cho Claude câu hỏi của người dùng và tất cả các tài liệu ứng viên, sau đó yêu cầu nó trả về những tài liệu có liên quan nhất theo thứ tự giảm dần mức độ liên quan.

Bạn sắp được cung cấp một tập hợp các tài liệu, cùng với id của mỗi tài liệu.
Nhiệm vụ của bạn là chọn {k} tài liệu liên quan nhất để trả lời câu hỏi của người dùng.

Đây là câu hỏi của người dùng:
<question>
{query_text}
</question>

Đây là các tài liệu để lựa chọn:
<documents>
{joined_docs}
</documents>

Phản hồi theo định dạng sau:
```json
{
  "document_ids": str[] # Liệt kê id tài liệu, độ dài {k} phần tử, được sắp xếp theo thứ tự giảm dần mức độ liên quan
}
```

Cân nhắc về hiệu quả

Một tối ưu hóa chính là dùng ID tài liệu thay vì yêu cầu Claude trả về toàn bộ các đoạn văn bản. Nếu bạn yêu cầu Claude trả về văn bản đầy đủ của mỗi tài liệu có liên quan, bạn sẽ lãng phí thời gian chờ nó sao chép một lượng lớn văn bản.

Thay vào đó, gán cho mỗi đoạn văn bản một ID duy nhất trước, sau đó yêu cầu Claude chỉ trả về các ID đó theo thứ tự ưu tiên. Điều này làm cho quá trình re-ranking nhanh hơn nhiều trong khi vẫn cung cấp cho bạn các kết quả đã được sắp xếp lại mà bạn cần.

Triển khai

Hàm re-ranker được gọi tự động sau khi tìm kiếm kết hợp ban đầu của bạn hoàn tất. Đây là cấu trúc cơ bản:

def reranker_fn(docs, query_text, k):
    joined_docs = "\n".join([
        f"""
        <document>
        <document_id>{doc["id"]}</document_id>
        <document_content>{doc["content"]}</document_content>
        </document>
        """
        for doc in docs
    ])
    
    # Build prompt with user question and documents
    # Send to Claude with JSON response format
    # Parse and return reordered document IDs

Bạn có thể tích hợp điều này vào bộ truy xuất của mình bằng cách truyền hàm re-ranker làm tham số:

retriever = Retriever(bm25_index, vector_index, reranker_fn=reranker_fn)

Kết quả

Cách tiếp cận re-ranking cho thấy những cải tiến rõ ràng. Khi kiểm tra truy vấn "what did the eng team do with INC-2023-Q4-011?", phần Kỹ thuật phần mềm hiện xuất hiện đầu tiên, trước phần An ninh mạng. Claude đã xác định thành công rằng người dùng đang hỏi cụ thể về sự tham gia của nhóm kỹ thuật vào sự cố.

Đánh đổi

Re-ranking đi kèm với những đánh đổi cần xem xét:

  • Độ trễ tăng lên: Bây giờ bạn cần đợi một lời gọi LLM bổ sung hoàn tất
  • Độ chính xác được cải thiện: LLM có thể hiểu ngữ cảnh và ý định tốt hơn so với điểm tương đồng thuần túy
  • Cân nhắc về chi phí: Mỗi lần tìm kiếm hiện yêu cầu một lời gọi API LLM

Đối với nhiều ứng dụng, việc cải thiện độ chính xác sẽ biện minh cho độ trễ và chi phí bổ sung, đặc biệt khi việc truy xuất chính xác là rất quan trọng đối với trường hợp sử dụng của bạ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?