Tôi đã xây dựng một Bot Hỏi & Đáp về Code bằng RAG: Những gì đã hiệu quả và những gì đã thất bại
Các lập trình viên của chúng tôi đã mất nhiều ngày tìm kiếm trên Slack và các tài liệu cũ để hiểu về các microservices của mình. Tôi quyết định xây dựng một chatbot để trả lời những câu hỏi này bằng cách sử dụng RAG.
Tôi đã mắc nhiều sai lầm trong quá trình thực hiện. Dưới đây là những gì tôi đã học được.
Những thất bại
- Tôi đã thử đưa tất cả tài liệu vào một prompt duy nhất. Việc này đã chạm giới hạn token, gây ra hiện tượng ảo giác (hallucinations) và tốn quá nhiều chi phí.
- Tôi đã sử dụng chỉ mục TF-IDF cơ bản. Nó thất bại khi người dùng sử dụng các từ đồng nghĩa hoặc các thuật ngữ khác nhau.
- Tôi đã thử chia nhỏ tài liệu thành các chunk 500 ký tự đơn giản. Kết quả trả về rất ngẫu nhiên vì các chunk thường bị cắt ngang giữa câu.
Giải pháp
Tôi đã ngừng coi LLM như một công cụ tìm kiếm. Thay vào đó, tôi biến nó thành một công cụ đọc cho một chỉ mục tìm kiếm chuyên dụng.
Đây là quy trình (pipeline) đã hoạt động hiệu quả:
- Chia nhỏ tài liệu thành các đoạn 300 token với độ chồng lấp (overlap) là 50 token.
- Embed mỗi chunk thành một vector.
- Lưu trữ các vector trong một chỉ mục tìm kiếm tương đồng (similarity search index).
- Tại thời điểm truy vấn, tìm ra 5 chunk tương đồng nhất.
- Chỉ đưa những chunk đó vào LLM để tạo câu trả lời.
Thay đổi này đã giảm 80% hiện tượng ảo giác và cắt giảm chi phí xuống dưới 0,01 USD cho mỗi truy vấn.
Những bài học then chốt
- Kích thước chunk là cực kỳ quan trọng. 150 token thì quá ít ngữ cảnh. 1000 token thì quá nhiều nhiễu. 300 token là con số lý tưởng.
- Độ chồng lấp (overlap) là bắt buộc. Nó giúp ngăn chặn việc mất ngữ cảnh giữa các chunk.
- Sử dụng các mô hình nhỏ để tăng tốc độ. Một mô hình embedding nhỏ đã hoạt động tốt cho các nhu cầu nội bộ của chúng tôi.
- Hãy kiểm tra khả năng truy xuất (retrieval) của bạn. Đừng chỉ dựa vào việc kiểm tra thủ công. Hãy xây dựng một bộ dữ liệu kiểm thử (test set) để đo lường độ chính xác.
RAG không phải là phép màu. Nó là một bài toán kỹ thuật. Nếu các chunk của bạn kém, khả năng truy xuất sẽ kém. Nếu khả năng truy xuất kém, câu trả lời sẽ kém.
Hiện tại chúng tôi đã trả lời chính xác 80% các câu hỏi về onboarding. Điều này nhanh hơn nhiều so với việc chờ đợi một người phản hồi trên Slack.
Bạn xây dựng các trợ lý AI cho tài liệu của mình như thế nào?
Cộng đồng học tập tùy chọn: https://t.me/GyaanSetuAi