Contextual Retrieval: sửa lỗi gốc rễ của RAG
Tóm tắt
Chunk mất ngữ cảnh khiến RAG tìm sót. Contextual Retrieval cho Claude viết ngữ cảnh ngắn đặt đầu mỗi chunk; kết hợp BM25 và rerank, Anthropic báo giảm 67% lỗi truy xuất với chi phí đánh chỉ mục thấp nhờ prompt caching.
RAG (Retrieval-Augmented Generation) là cách phổ biến nhất để LLM trả lời dựa trên tài liệu của bạn: cắt tài liệu thành đoạn (chunk), tìm các đoạn liên quan, rồi đưa vào prompt. Khái niệm này được đặt tên trong bài báo của Lewis và cộng sự (Facebook AI, 2020). Vấn đề kinh điển: khi cắt nhỏ, mỗi chunk mất ngữ cảnh. Một đoạn ghi "Doanh thu tăng 3% so với quý trước" không cho biết công ty nào, quý nào, nên tìm kiếm bỏ lỡ nó. Anthropic đề xuất kỹ thuật Contextual Retrieval để vá đúng lỗ hổng này.
Ý tưởng: gắn ngữ cảnh vào từng chunk
Trước khi embed và đánh chỉ mục, cho Claude đọc toàn bộ tài liệu cùng từng chunk, rồi sinh một đoạn giải thích ngắn (thường 50–100 token) đặt lên đầu chunk:
Trước: "Doanh thu tăng 3% so với quý trước."
Sau: "Đoạn này trích từ báo cáo quý 2/2023 của ACME, nói về
doanh thu quý; doanh thu quý 1 là 314 triệu USD.
Doanh thu tăng 3% so với quý trước."
Chunk đã có ngữ cảnh được dùng cho cả hai chỉ mục: Contextual Embeddings (tìm theo nghĩa) và Contextual BM25 (tìm theo từ khoá).
Kết quả Anthropic công bố
Đo bằng tỷ lệ truy xuất thất bại (1 − recall@20), trung bình trên nhiều lĩnh vực:
| Cấu hình | Tỷ lệ thất bại | Giảm |
|---|---|---|
| Embedding thường | 5,7% | - |
| Contextual Embeddings | 3,7% | 35% |
| + Contextual BM25 | 2,9% | 49% |
| + Reranking | 1,9% | 67% |
Cấu hình reranking trong thí nghiệm: lấy 150 chunk đầu, rerank, giữ 20 chunk tốt nhất. Đưa 20 chunk vào prompt cho kết quả tốt hơn 5 hay 10.
Chi phí có đáng không?
Sinh ngữ cảnh cho mọi chunk nghe đắt, nhưng nhờ prompt caching (tài liệu chỉ nạp một lần, các chunk dùng lại cache), Anthropic ước tính chi phí một lần khoảng 1,02 USD cho mỗi triệu token tài liệu. Đây là chi phí lúc đánh chỉ mục, không phải mỗi lần truy vấn.
Pipeline đầy đủ
- Cắt tài liệu thành chunk (vài trăm token, cân nhắc ranh giới và độ chồng lấn).
- Với mỗi chunk, gọi Claude (model nhỏ, có cache tài liệu) để sinh ngữ cảnh.
- Embed "ngữ cảnh + chunk" và đánh chỉ mục BM25 trên cùng văn bản.
- Khi truy vấn: tìm song song cả hai chỉ mục, gộp kết quả, rerank, lấy top-K.
- Đưa chunk vào prompt, yêu cầu trích dẫn nguồn.
Rủi ro và lưu ý
- Có khi không cần RAG: theo Anthropic, kho kiến thức dưới khoảng 200.000 token có thể đưa thẳng cả vào prompt (kết hợp caching), đơn giản hơn nhiều.
- Prompt sinh ngữ cảnh nên tuỳ biến: thêm bảng thuật ngữ của ngành bạn thường tốt hơn prompt chung chung.
- Reranking thêm độ trễ và chi phí ở mỗi truy vấn; đo đánh đổi trên lưu lượng thật.
- Nhiều chunk hơn có thể gây nhiễu: số K tối ưu phải tìm bằng eval, không chọn theo cảm tính.
Áp dụng thế nào?
- Dev: Xây bộ eval 50–100 câu hỏi kèm chunk đúng; đo recall@20 trước và sau khi thêm ngữ cảnh, rồi mới thêm BM25 và rerank.
- Tech Lead: Chạy bước sinh ngữ cảnh bằng Batch API kết hợp caching để giảm chi phí đánh chỉ mục; lưu ngữ cảnh riêng để có thể tái sử dụng.
- PM: Khi chatbot nội bộ "không tìm thấy" thông tin có thật trong tài liệu, đó thường là lỗi truy xuất, không phải lỗi model. Ưu tiên sửa truy xuất trước.
Nguồn & tham khảo
- Introducing Contextual Retrieval — Anthropic
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks — Lewis et al. (arXiv)