Retrieval Augmented Generation (RAG) là một thuật ngữ quá tải. Nó hứa hẹn cả một thế giới, nhưng sau khi phát triển một đường ống RAG, có rất nhiều người trong chúng ta còn tự hỏi tại sao nó không hoạt động tốt như chúng ta đã mong đợi.
Như hầu hết các công cụ khác, RAG dễ sử dụng nhưng khó thành thạo. Sự thật là RAG không chỉ đơn giản là đưa tài liệu vào một cơ sở dữ liệu vector và thêm một LLM phía trên. Điều đó có thể hoạt động, nhưng không phải lúc nào cũng vậy.
Cuốn sách điện tử này nhằm mục đích hướng dẫn bạn làm gì khi RAG nguyên bản không hoạt động. Trong chương đầu tiên này, chúng ta sẽ tìm hiểu về giải pháp thường là đơn giản nhất và nhanh nhất để triển khai cho các đường ống RAG không hoàn hảo - chúng ta sẽ tìm hiểu về rerankers.
Video hướng dẫn cho chương này.
So sánh giữa Cửa sổ Gọi lại và Ngữ cảnh
Trước khi bắt đầu giải pháp, hãy nói về vấn đề. Với RAG, chúng ta đang thực hiện một tìm kiếm ngữ nghĩa trên nhiều tài liệu văn bản — có thể là hàng chục nghìn đến hàng chục tỷ tài liệu.
Để đảm bảo thời gian tìm kiếm nhanh ở quy mô lớn, chúng tôi thường sử dụng tìm kiếm vector - tức là, chúng tôi biến đổi văn bản của mình thành vector, đặt chúng vào không gian vector, và so sánh sự gần gũi của chúng với một vector truy vấn bằng cách sử dụng một độ đo tương đồng như độ đo tương đồng cosin.
Để tìm kiếm vector hoạt động, chúng ta cần các vector. Những vector này về cơ bản là sự nén của 'ý nghĩa' đằng sau một số văn bản thành vector có (thường là) 768 hoặc 1536 chiều. Có mất mát thông tin vì chúng ta đang nén thông tin này thành một vector duy nhất.
Do vì mất thông tin này, chúng ta thường thấy rằng ba tài liệu tìm kiếm vector hàng đầu (ví dụ) sẽ bỏ lỡ thông tin liên quan. Thật không may, quá trình truy xuất có thể trả về thông tin liên quan dưới ngưỡng top_k của chúng ta.
Chúng ta sẽ làm gì nếu thông tin liên quan ở vị trí thấp hơn có thể giúp LLM của chúng ta đưa ra một phản hồi tốt hơn? Cách tiếp cận dễ nhất là tăng số lượng tài liệu chúng ta trả về (tăng top_k) và chuyển chúng tất cả cho LLM.
Phương pháp đo lường chúng ta sẽ sử dụng ở đây là recall — có nghĩa là 'chúng ta đang truy xuất bao nhiêu tài liệu liên quan'. Recall không xem xét tổng số tài liệu đã truy xuất — vì vậy chúng ta có thể gian lận chỉ số và đạt được perfect recall bằng cách trả về mọi thứ.
recall@K = Số tài liệu liên quan được trả về/Số tài liệu liên quan trong tập dữ liệu