Tôi đã xây dựng một ứng dụng RAG, sau đó hỏi nó tôi thích loại xe nào. Nó không biết.
Tôi đang xây dựng một công cụ chat với tài liệu có tên là Kenning. Nó sử dụng RAG (Retrieval-Augmented Generation) để cho phép người dùng đặt câu hỏi về các tệp đã tải lên.
Tôi đã xây dựng toàn bộ quy trình từ đầu bằng cách sử dụng:
- Java 21 và Spring Boot
- Spring AI
- PostgreSQL với pgvector
- Ollama (chạy llama3.2:3b và nomic-embed-text)
- Docker Compose
Quy trình hoạt động như sau: Tải tệp lên → Trích xuất văn bản → Chia nhỏ văn bản (chunking) → Chuyển đổi các đoạn thành vector → Lưu trữ trong pgvector → Tìm kiếm các đoạn tương tự → Gửi các đoạn + câu hỏi tới mô hình → Nhận câu trả lời kèm nguồn.
Hệ thống đã hoạt động, nhưng tôi đã gặp phải hai lỗi khác nhau. Chúng trông có vẻ giống nhau, nhưng nguyên nhân lại khác nhau.
Lỗi 1: Mô hình bị bối rối. Tôi đã hỏi: "Dự án này sử dụng mô hình embedding nào?" Tài liệu đã nêu rõ câu trả lời. Mô hình đã truy xuất được văn bản chính xác. Tuy nhiên, nó lại trả lời rằng nó không biết, ngay cả khi nó lặp lại tên mô hình chính xác ở câu tiếp theo.
Giả thuyết của tôi: Mô hình 3B quá nhỏ. Nó đã truy xuất đúng dữ liệu nhưng không thể đưa ra một câu trả lời chắc chắn. Một mô hình lớn hơn có thể sẽ khắc phục được điều này.
Lỗi 2: Mô hình không tìm thấy gì cả. Tôi đã hỏi: "Tôi thích thương hiệu xe hơi nào?" Tài liệu có đề cập rằng tôi thích BMW. Nhưng hệ thống trả về kết quả bằng không. Điểm tương đồng (similarity score) quá thấp để vượt qua ngưỡng thiết lập của tôi.
Giả thuyết của tôi: Sự pha loãng phân đoạn (Chunk dilution). Tài liệu thử nghiệm của tôi khá ngắn. Nó trộn lẫn nhiều chủ đề như Spring AI, OAuth2 và sở thích xe hơi của tôi vào cùng một phân đoạn (chunk). Vector của phân đoạn đó bị pha loãng giữa tất cả các chủ đề đó. Một câu hỏi cụ thể về xe hơi đã mất đi sức nặng trước một phân đoạn quá rộng. Một chiến lược chia nhỏ văn bản tốt hơn sẽ khắc phục được điều này.
Bài học rút ra:
- Các mô hình nhỏ có giới hạn về khả năng suy luận.
- Cách chia nhỏ văn bản (chunking) ngây thơ ảnh hưởng đến độ chính xác của việc truy xuất.
- Việc tìm hiểu nguyên nhân "tại sao" quan trọng hơn là chỉ sửa lỗi.
Kiến trúc này vẫn hoạt động ổn định. Nó chậm và đôi khi sai, nhưng vòng lặp đã hoàn thiện.
Nguồn: https://dev.to/mido-dev/i-built-a-rag-app-then-asked-it-what-car-i-like-it-didnt-know-583n
Cộng đồng học tập tùy chọn: https://t.me/GyaanSetuAi
