Xây dựng một Local RAG Chatbot trong 30 phút
Tôi đã tải một tài liệu đặc tả API dài 40 trang lên chatbot cục bộ của mình. Tôi đã hỏi về giới hạn tốc độ (rate limit) cho một endpoint cụ thể.
Bot trả lời chỉ trong ba giây. Nó trích dẫn chính xác phần tài liệu đó.
Điều tuyệt vời nhất là gì? Nó hoàn toàn miễn phí ($0). Mọi thứ đều chạy trên laptop của tôi bằng .NET 8, Ollama và React. Không có dữ liệu nào rời khỏi máy của tôi.
Hầu hết các hướng dẫn đều bảo bạn sử dụng OpenAI. Cách đó hiệu quả cho các bản demo, nhưng lại không phù hợp cho công việc thực tế vì:
- Quyền riêng tư: Bạn không muốn dữ liệu nhạy cảm của công ty nằm trong quy trình huấn luyện trên đám mây.
- Chi phí: Việc gửi các tệp lớn đến một LLM sẽ khiến chi phí tăng lên nhanh chóng.
- Ảo giác (Hallucinations): Các mô hình thường quên mất phần giữa của các tài liệu dài.
Giải pháp chính là RAG (Retrieval-Augmented Generation). Thay vì gửi toàn bộ tệp PDF, bạn chỉ gửi những đoạn (chunks) có liên quan.
Đây là cách tôi xây dựng pipeline này:
• Trích xuất văn bản (Text Extraction): Tôi sử dụng PdfPig để trích xuất văn bản từ các tệp PDF.
• Chia nhỏ (Chunking): Tôi chia văn bản thành các đoạn 500 từ với độ chồng lấp (overlap) là 50 từ. Sự chồng lấp này đảm bảo mô hình không bỏ lỡ các câu trả lời nằm rải rác giữa hai đoạn.
• Nhúng (Embeddings): Tôi sử dụng mô hình nomic-embed-text thông qua Ollama để chuyển đổi văn bản thành các vector.
• Kho lưu trữ vector (Vector Store): Tôi đã xây dựng một danh sách lưu trữ trong bộ nhớ (in-memory list) đơn giản, sử dụng độ tương đồng cosine (cosine similarity) để tìm các kết quả khớp nhất.
• Tạo phản hồi (Generation): Tôi sử dụng llama3.2 để trả lời các câu hỏi chỉ dựa trên các đoạn văn bản đã tìm thấy.
Ba bài học tôi rút ra được trong quá trình xây dựng:
- Sử dụng thời gian chờ (timeout) dài: Các mô hình cục bộ cần thời gian để tải vào bộ nhớ. Tôi đã đặt
HttpClienttimeout là 5 phút để tránh lỗi trong quá trình khởi động lạnh (cold starts). - Kỹ thuật đặt câu lệnh (Prompt engineering) là then chốt: Tôi yêu cầu mô hình chỉ được trả lời bằng cách sử dụng DUY NHẤT ngữ cảnh được cung cấp. Điều này giúp giảm 80% hiện tượng ảo giác.
- Việc chia nhỏ (Chunking) rất quan trọng: Tôi chia nhỏ theo từ thay vì theo ký tự. Điều này giúp kích thước đoạn văn có thể dự đoán được và nằm trong giới hạn của mô hình.
Bạn có thể chạy toàn bộ stack này ngay tại máy cục bộ. Đây là một công cụ đạt chuẩn chuyên nghiệp với ngân sách 0 đồng.
Xem toàn bộ nhật ký xây dựng và mã nguồn tại đây:
Cộng đồng học tập (tùy chọn): https://t.me/GyaanSetuAi
