Cào dữ liệu bất đồng bộ (Async Scraping) tốt hơn cho việc nạp dữ liệu RAG
Các hệ thống RAG thường thất bại do dữ liệu bị cũ. Trang web thay đổi nhưng chỉ mục (index) của bạn vẫn giữ nguyên. Khi đó, AI của bạn sẽ đưa ra các câu trả lời sai với độ tự tin cao.
Nhiều người cố gắng khắc phục điều này bằng các trình cào dữ liệu đồng bộ (synchronous scrapers) đơn giản. Bạn tải một trang, trích xuất dữ liệu và cập nhật kho lưu trữ vector (vector store) của mình. Cách tiếp cận này gây ra nhiều vấn đề khi triển khai thực tế (production).
Các vấn đề chính với việc cào dữ liệu đồng bộ:
- Việc tải trang mất nhiều thời gian do JavaScript hoặc các biểu ngữ cookie (cookie banners).
- API của bạn phải chờ trình cào hoàn tất, điều này làm chậm trải nghiệm người dùng.
- Bạn bị cạn kiệt bộ nhớ hoặc quá nhiều socket mở khi chạy các tác vụ song song.
- Các lỗi như quá hạn thời gian (timeout) hoặc giới hạn tốc độ (rate limits) rất khó quản lý.
Cào dữ liệu bất đồng bộ (Async scraping) sử dụng quy trình: gửi (submit), kiểm tra (poll) và lấy kết quả (retrieve). Bạn gửi một tác vụ, nhận một ID công việc (job ID) và kiểm tra kết quả sau đó. Điều này giúp ứng dụng của bạn luôn hoạt động nhanh chóng.
Cách xây dựng một đường ống nạp dữ liệu (ingestion pipeline) đáng tin cậy:
- Tách biệt việc cào dữ liệu khỏi việc xử lý yêu cầu. Ứng dụng của bạn không nên phải chờ trình duyệt tải xong.
- Lưu trữ trạng thái công việc trong cơ sở dữ liệu. Theo dõi URL, trạng thái và các lỗi.
- Sử dụng mã băm nội dung (content hashes). Nếu nội dung trang không thay đổi, đừng thực hiện nhúng lại (re-embed). Điều này giúp tiết kiệm tiền bạc và thời gian.
- Sử dụng hàng đợi thư chết (dead-letter queues). Nếu một công việc thất bại ba lần, hãy ngừng thử lại. Chuyển nó vào một danh sách hiển thị để bạn có thể kiểm tra và khắc phục.
- Xác thực dữ liệu của bạn. Sử dụng một lược đồ (schema) để kiểm tra dữ liệu đã trích xuất trước khi đưa vào kho lưu trữ vector. Một chuỗi rỗng còn tệ hơn cả một công việc bị lỗi.
Cào dữ liệu bất đồng bộ hoạt động tốt nhất cho các cập nhật chạy ngầm và làm mới theo lịch trình. Nó không dành cho các nhu cầu thời gian thực khi người dùng phải chờ đợi một trang web mới nhất.
Nếu người dùng cần dữ liệu ngay lập tức, hãy hiển thị cho họ nội dung đã được lưu trong bộ nhớ đệm (cached content) và cập nhật chỉ mục ở chế độ chạy ngầm.
Optional learning community: https://t.me/GyaanSetuAi