7 điểm bởi GN⁺ 2024-09-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bài viết tóm tắt trải nghiệm phát triển một web scraper có hỗ trợ AI bằng cách sử dụng tính năng đầu ra có cấu trúc mới của OpenAI

Yêu cầu GPT-4o scrape dữ liệu

  • Thử nghiệm đầu tiên là yêu cầu GPT-4o trích xuất dữ liệu từ một chuỗi HTML
  • Thiết lập đầu ra có cấu trúc bằng mô hình Pydantic
    from typing import List, Dict  
    class ParsedColumn(BaseModel):  
        name: str  
        values: List[str]  
    
    class ParsedTable(BaseModel):  
        name: str  
        columns: List[ParsedColumn]  
    
  • Prompt hệ thống như sau:

    Bạn là chuyên gia web scraping. Bạn sẽ nhận nội dung của một bảng HTML và phải trích xuất dữ liệu có cấu trúc

Phân tích các bảng phức tạp

  • Sau khi thử với các bảng đơn giản, tác giả kiểm thử các bảng phức tạp như dự báo thời tiết 10 ngày của Weather.com
  • GPT-4o đã thêm cột Day/Night và phân tích dữ liệu một cách chính xác
  • Cột Condition không hiển thị trên website nên ban đầu tưởng là hallucination, nhưng khi kiểm tra mã nguồn thì đó là thẻ thực sự tồn tại

Các hàng gộp làm mô hình thất bại

  • Tác giả thử một bảng đơn giản trên Wikipedia (Human Development Index), nhưng mô hình thất bại do các hàng được gộp
  • Đã thử sửa prompt hệ thống nhưng không có hiệu quả

Yêu cầu GPT-4o trả về XPath

  • Để giảm chi phí gọi OpenAI API, tác giả yêu cầu trả về XPath thay vì dữ liệu đã được phân tích
  • Tuy nhiên, mô hình thường trả về XPath sai hoặc nhiều khi không trả dữ liệu

Kết hợp hai cách tiếp cận

  • Tác giả thử cách tiếp cận trích xuất dữ liệu trước, sau đó dùng dữ liệu đó làm tham chiếu để yêu cầu XPath
  • Cách này cho kết quả tốt hơn, nhưng phát sinh vấn đề ảnh bị chuyển thành văn bản

GPT-4o rất đắt đỏ

  • Việc scrape bằng GPT-4o có chi phí rất cao
  • Tác giả bổ sung logic làm sạch để loại bỏ dữ liệu không cần thiết khỏi chuỗi HTML nhằm cắt giảm chi phí

Kết luận và demo

  • Tác giả ấn tượng với chất lượng trích xuất dữ liệu của GPT-4o, nhưng thất vọng vì vấn đề chi phí
  • Có cung cấp một bản demo đơn giản dùng Streamlit
  • Vẫn còn nhiều điểm có thể cải thiện thông qua các thử nghiệmเพิ่มเติม

Tóm tắt của GN⁺

  • Bài viết này khám phá khả năng và giới hạn của web scraping sử dụng AI
  • Cho thấy có thể tận dụng tính năng đầu ra có cấu trúc của GPT-4o để trích xuất chính xác dữ liệu bảng phức tạp
  • Dù tồn tại vấn đề chi phí và một số giới hạn kỹ thuật, tiềm năng của các công cụ web scraping có hỗ trợ AI vẫn rất rõ ràng
  • Các dự án khác cung cấp chức năng tương tự gồm có BeautifulSoup, Scrapy, v.v.

1 bình luận

 
GN⁺ 2024-09-03
Ý kiến trên Hacker News
  • Việc chuyển HTML sang định dạng đơn giản hơn (ví dụ: markdown) rồi đưa cho LLM đã cho kết quả tốt

    • Đã thử dùng Extractus và dom-to-semantic-markdown
    • Nội bộ sử dụng Apify và Firecrawl để chạy Magic Loops trên đám mây
    • Trên Chrome Extension thì dùng dom-to-semantic-markdown
    • Đang nghiên cứu cách trích xuất các phần tử cụ thể thông qua luồng hỗ trợ người dùng
    • Khi đơn giản hóa bài toán, cả GPT-4o mini cũng cho kết quả tốt
  • Với nội dung có cấu trúc (ví dụ: danh sách mục, bảng đơn giản) thì không cần LLM

    • Ban đầu đã làm phiên bản web scraper bằng AI, nhưng heuristic dựa trên thuộc tính và vị trí phần tử nhanh hơn, rẻ hơn và chính xác hơn
    • Với phần lớn website, cách tiếp cận không dùng AI hoạt động rất tốt
    • Cần kiểm tra xem AI có thực sự cần thiết hay không
  • Thật ngạc nhiên là tác giả đã hoàn thành 99% công việc nhưng lại không tải về và thử ollama cho 1% còn lại

    • Mô hình 7B hoặc 30B có thể hoạt động tốt trong trường hợp này
    • Không nhất thiết phải dùng GPT-4o
  • Có người dùng cách chụp ảnh màn hình trang, cắt phần cần thiết rồi gửi cho GPT

    • Cách này hữu ích khi phải làm thủ công để so sánh giá từ nhiều nhà cung cấp khác nhau
    • Có thể tốn kém, nhưng vẫn rẻ hơn dùng người thật và giúp họ làm những việc có ý nghĩa hơn
  • OpenAI gần đây đã công bố Batch API

    • Có thể chuẩn bị tất cả prompt rồi chạy theo lô
    • Chi phí giảm còn một nửa
    • Hữu ích cho các ứng dụng không cần thời gian thực
  • Cách đưa ví dụ HTML rồi yêu cầu đoạn mã beautifulsoup đã tỏ ra hiệu quả

    • Cấu trúc cần scrape được giữ nguyên
    • Dùng LLM cho việc parse thực tế là quá mức cần thiết và có nguy cơ làm sai lệch kết quả
  • Có người thắc mắc liệu đã có "html reducer" hay chưa

    • 90% mã nguồn trang là token không cần thiết
    • Nếu dùng DOM parser để chỉ giữ lại các node có văn bản thì có thể tiết kiệm đáng kể
    • Có dùng readability, nhưng chất lượng giảm trên các website nhiều JS
  • Thay vì scrape trực tiếp bằng GPT-4o, có thể để GPT-4o viết một script web scraper đơn giản

    • Khi phát sinh vấn đề thì dùng vòng lặp prompt
    • Tạo và chạy một bộ giải ràng buộc sẽ hiệu quả hơn
  • Tại Kadoa, họ đang triển khai công việc scrape web tự động hóa bằng AI

    • Ban đầu dùng GPT-3, nhưng sau đó đã phát triển giải pháp hiệu quả hơn về chi phí
    • Dùng codegen để tạo mã trích xuất bằng CSS selector hoặc XPath
    • Dùng LLM nhỏ để làm sạch dữ liệu và ánh xạ sang định dạng mong muốn
    • Dùng LLM như trọng tài để đánh giá chất lượng dữ liệu
    • Kết hợp phương pháp kỹ thuật ETL truyền thống với các bước dùng LLM nhỏ
  • Có người đang xây dựng cơ sở dữ liệu nhạc cổ điển

    • Dùng ChatGPT để trích xuất danh sách sự kiện từ Wikipedia
    • Dùng chatgpt-mini để giảm chi phí
    • Dùng BeautifulSoup(html).text để giảm số lượng token
    • Khi scrape 10.000 trang, việc cung cấp HTML rồi để nó viết mã Python hiệu quả hơn
    • Tính năng from_html của Pandas hữu ích, nhưng không phải bảng nào cũng dùng thẻ <table>