1. Giới thiệu
Vào ngày 8/6/2024, sự kiện TechUp #2 do Sun tổ chức đã diễn ra thành công, thu hút sự chú ý của cộng đồng công nghệ. Sự kiện này tập trung vào hai chủ đề nổi bật: ứng dụng trí tuệ nhân tạo và xây dựng hệ thống RAG - Retrieval Augmented Generation. Tại đây, tôi đã có cơ hội lắng nghe những chia sẻ từ các chuyên gia hàng đầu và học hỏi từ kinh nghiệm thực tiễn của những người tham gia khác. Một trong những quan điểm thú vị từ anh Dũng là về vấn đề mà chatbot của anh gặp phải: nó chỉ trả lời tốt với một số lượng câu hỏi nhất định theo tài liệu được cài đặt sẵn.
Ví dụ, qua câu lệnh results = db.similarity_search(info, k=5)
, chatbot hoạt động hiệu quả với một số thể loại câu hỏi, nhưng lại yêu cầu một số lượng tài liệu k
khác nhau cho các trường hợp khác. Theo các chuyên gia tham gia sự kiện, có nhiều phương pháp giải quyết vấn đề này, bao gồm:
- Điều chỉnh số lượng tài liệu truy xuất (k): Tự động thay đổi giá trị k tùy theo độ phức tạp của câu hỏi hoặc độ tin cậy của mô hình.
- Kỹ thuật Reranking: Sử dụng các mô hình học máy bổ sung để xếp hạng lại kết quả tìm kiếm.
- Phân nhóm câu hỏi: Phân loại câu hỏi thành các nhóm để xây dựng tham số truy vấn tối ưu.
Tôi cũng đã từng gặp phải vấn đề này trong quá trình phát triển hệ thống RAG tại trường Đại học Công nghệ UET. Phương pháp mà tôi thấy hiệu quả là tích hợp phương thức gọi hàm.
Bài viết này sẽ chia sẻ cách sử dụng phương pháp gọi hàm để tối ưu hóa hệ thống RAG, từ đó giúp chatbot tự động chọn nguồn dữ liệu phù hợp và trả lời chính xác hơn.
2. Vấn đề thường gặp khi xây dựng hệ thống RAG
Hệ thống Retrieval Augmented Generation (RAG) đang trở nên phổ biến trong lĩnh vực xử lý ngôn ngữ tự nhiên nhờ vào khả năng kết hợp kiến thức từ mô hình ngôn ngữ với thông tin cụ thể từ dữ liệu. Tuy nhiên, việc xây dựng một hệ thống RAG hiệu quả không phải là dễ.
Theo chia sẻ của anh Phạm Văn Toàn trong bài viết trên Viblo, có nhiều yếu tố cần tối ưu để đảm bảo hệ thống RAG hoạt động hiệu quả. Một trong những vấn đề phổ biến là chatbot có thể hoạt động không nhất quán với các truy vấn khác nhau. Cụ thể, nó có thể trả lời đúng một số câu hỏi nhưng yêu cầu các tài liệu khác nhau cho những truy vấn phức tạp hơn.
Ví dụ, với lệnh results = db.similarity_search(info, k=5)
, chatbot có thể xử lý tốt các câu hỏi đơn giản nhưng có thể thiếu thông tin khi gặp các câu hỏi yêu cầu nhiều nguồn dữ liệu hơn.
Vấn đề này chủ yếu do hệ thống RAG truyền thống sử dụng giá trị cố định cho số lượng tài liệu cần truy xuất mà không tính đến sự khác biệt về yêu cầu của từng truy vấn. Điều này dẫn đến trải nghiệm người dùng không tốt.
3. Giải pháp: Tích hợp phương thức gọi hàm
Để khắc phục vấn đề về số lượng tài liệu truy xuất cố định trong hệ thống RAG truyền thống, tôi đề xuất giải pháp tích hợp phương thức gọi hàm. Phương pháp này cho phép lựa chọn nguồn dữ liệu phù hợp hơn với từng truy vấn cụ thể.
Gọi hàm là một tính năng nổi bật của các mô hình ngôn ngữ hiện đại, cho phép chúng tương tác với các API bên ngoài. Mô hình không chỉ dựa vào kiến thức đã huấn luyện mà còn có thể gọi các hàm để truy xuất thông tin, thực hiện tính toán hoặc thực hiện các hành động cụ thể.
Một số mô hình ngôn ngữ hỗ trợ gọi hàm bao gồm:
- GPT-3.5 Turbo, GPT-4 (OpenAI)
- Gemini 1.0 và 1.5 Pro (Google AI)
- Llama 3 (Meta) - có thể tinh chỉnh qua fine-tuning.
Lý do tôi chọn phương pháp này cho dự án trợ lý ảo tại Đại học Công nghệ UET là bởi tính linh hoạt và khả năng mở rộng của nó.
Lợi ích của việc tích hợp gọi hàm:
- Tối ưu hóa quá trình truy xuất: Mô hình có thể tự động xác định việc cần truy xuất dữ liệu hay không.
- Linh hoạt lựa chọn nguồn dữ liệu: Có khả năng gọi nhiều hàm truy xuất tùy theo nguồn và định dạng khác nhau.
- Nâng cao khả năng xử lý câu hỏi phức tạp: Có thể phối hợp thông tin từ nhiều nguồn khác nhau.
- Kiểm soát luồng thông tin tốt hơn: Giúp cải thiện cách thức truy cập và sử dụng thông tin.
4. Các bước triển khai
Để triển khai hệ thống RAG tích hợp gọi hàm cho dự án UET AI, tôi đã thực hiện những bước sau:
4.1. Thu thập và xử lý dữ liệu
Bước đầu tiên là thu thập dữ liệu từ các nguồn như website, tài liệu nội bộ, cơ sở dữ liệu,... và tiến hành xử lý để loại bỏ thông tin nhiễu.
4.2. Chia dữ liệu và lưu trữ index
Phân loại và lưu trữ dữ liệu vào các thư mục khác nhau dựa trên chủ đề, chẳng hạn như:
- uet_info: Thông tin về trường, như lịch sử, cơ cấu tổ chức,
- programs: Thông tin về các chương trình đào tạo của trường.
Mỗi thư mục sau đó được chuyển thành index riêng biệt sử dụng thư viện FAISS và model embedding "text-embedding-3-large" của OpenAI.
4.3. Tạo phương thức truy xuất dữ liệu
Xây dựng các phương thức truy xuất cho từng index. Ví dụ với index "uet_info", tôi có:
python
def about_uet(info):
db = FAISS.load_local("uet_index",...)
results = db.similarity_search(info, k=5)
return results
4.4. Mô tả công cụ và tích hợp gọi hàm
Mô tả các hàm truy xuất cho mô hình ngôn ngữ hiểu và sử dụng, ví dụ for about_uet()
.
4.5. Cơ chế hoạt động của gọi hàm
Đưa vào quy trình xử lý yêu cầu của chatbot.
4.6. Hạn chế ảo giác của mô hình
Thêm thông điệp nhắc nhở mô hình sử dụng thông tin từ các hàm truy xuất trước khi dùng kiến thức của nó.
4.7. Triển khai thử nghiệm và hiệu chỉnh
Kiểm thử với nhiều loại câu hỏi và điều chỉnh các thông số hệ thống để cải thiện hiệu suất.
5. Ưu điểm và nhược điểm của tích hợp RAG với gọi hàm
5.1. Ưu điểm
- Tối ưu quá trình truy xuất.
- Linh hoạt và khả năng mở rộng.
- Nâng cao khả năng xử lý câu hỏi phức tạp.
- Kiểm soát tốt hơn luồng thông tin.
5.2. Nhược điểm
- Yêu cầu tài nguyên lớn hơn.
- Khó khăn trong gỡ lỗi.
- Cần kiến thức chuyên môn cao.
6. Kết luận
Bài viết đã trình bày phương pháp tích hợp gọi hàm vào hệ thống RAG nhằm tối ưu hóa khả năng truy xuất thông tin và xử lý ngôn ngữ tự nhiên của chatbot. Mặc dù có một số hạn chế, nhưng lợi ích mà phương pháp này mang lại là rất đáng giá. Hy vọng bạn sẽ thử nghiệm và khám phá áp dụng phương pháp này cho các dự án của mình.
source: viblo