7P by neo 16일전 | favorite | 댓글 1개
  • OpenAI의 새로운 구조화된 출력 기능을 사용하여 AI 지원 웹 스크래퍼를 개발한 경험을 요약한 글

GPT-4o에게 데이터 스크래핑 요청하기

  • 첫 번째 실험은 GPT-4o에게 HTML 문자열에서 데이터를 추출하도록 요청
  • Pydantic 모델을 사용하여 구조화된 출력을 설정함
    from typing import List, Dict  
    class ParsedColumn(BaseModel):  
        name: str  
        values: List[str]  
    
    class ParsedTable(BaseModel):  
        name: str  
        columns: List[ParsedColumn]  
    
  • 시스템 프롬프트는 다음과 같음:

    당신은 웹 스크래핑 전문가임. HTML 테이블의 내용을 받아 구조화된 데이터를 추출해야 함

복잡한 테이블 파싱하기

  • 간단한 테이블을 실험한 후, Weather.com의 10일간의 날씨 예보와 같은 복잡한 테이블을 테스트함
  • GPT-4o는 Day/Night 열을 추가하여 데이터를 정확히 파싱함
  • Condition 열이 웹사이트에서 보이지 않아 Hallucination인 줄 알았으나, 소스 코드를 검사해보니 존재하는 태그였음

결합된 행이 모델을 망가뜨림

  • Wikipedia의 간단한 테이블(Human Development Index)을 테스트했으나, 결합된 행 때문에 모델이 실패함
  • 시스템 프롬프트를 수정해보았으나 효과가 없었음

GPT-4o에게 XPath 반환 요청하기

  • OpenAI API 호출 비용을 줄이기 위해, 파싱된 데이터 대신 XPath를 반환하도록 요청함
  • 그러나, 모델이 잘못된 XPath를 반환하거나 데이터를 반환하지 않는 경우가 많았음

두 접근법 결합하기

  • 데이터를 추출한 후, 이를 참조하여 XPath를 요청하는 접근법을 시도함
  • 이 방법이 더 나은 결과를 제공했으나, 이미지가 텍스트로 변환되는 문제 발생

GPT-4o는 매우 비쌈

  • GPT-4o를 사용한 스크래핑은 비용이 많이 듦
  • HTML 문자열에서 불필요한 데이터를 제거하는 클린업 로직을 추가하여 비용을 절감함

결론 및 데모

  • GPT-4o의 데이터 추출 품질에 놀랐으나, 비용 문제로 실망함
  • Streamlit을 사용한 간단한 데모를 제공함
  • 더 많은 실험을 통해 개선할 부분이 많음

GN⁺의 정리

  • 이 글은 AI를 사용한 웹 스크래핑의 가능성과 한계를 탐구함
  • GPT-4o의 구조화된 출력 기능을 활용하여 복잡한 테이블 데이터를 정확히 추출할 수 있음을 보여줌
  • 비용 문제와 일부 기술적 한계가 존재하지만, AI 지원 웹 스크래핑 도구의 잠재력을 확인할 수 있음
  • 비슷한 기능을 제공하는 다른 프로젝트로는 BeautifulSoup, Scrapy 등이 있음
Hacker News 의견
  • HTML을 간단한 형식(예: markdown)으로 변환한 후 LLM에 전달하는 것이 성공적이었음

    • Extractus와 dom-to-semantic-markdown을 사용해 봄
    • 내부적으로 Apify와 Firecrawl을 사용하여 Magic Loops를 클라우드에서 실행함
    • Chrome Extension에서는 dom-to-semantic-markdown을 사용함
    • 사용자 지원 흐름을 통해 특정 요소를 추출하는 방법을 탐구 중임
    • 문제를 단순화하여 GPT-4o mini에서도 성공을 거둠
  • 구조화된 콘텐츠(예: 항목 목록, 간단한 테이블)에는 LLM이 필요하지 않음

    • 웹 스크래퍼를 AI로 초기 버전을 만들었으나, 요소 속성과 위치 기반의 휴리스틱이 더 빠르고 저렴하며 정확했음
    • 대부분의 웹사이트에서는 비AI 접근 방식이 매우 잘 작동함
    • AI가 정말 필요한지 확인해야 함
  • 글 작성자가 99%의 작업을 완료하고 나머지 1%를 위해 ollama를 다운로드하여 테스트하지 않은 것이 놀라움

    • 7B 또는 30B 모델이 이 경우에 잘 작동할 수 있음
    • GPT-4o가 필요하지 않음
  • 페이지의 스크린샷을 찍고 필요한 부분을 잘라내어 GPT에 전달하는 방법을 사용함

    • 다양한 공급업체의 가격 비교를 위해 수동으로 작업해야 할 때 유용함
    • 비용이 많이 들 수 있지만, 실제 사람보다 저렴하고 더 의미 있는 작업을 할 수 있게 함
  • OpenAI가 최근 Batch API를 발표함

    • 모든 프롬프트를 준비한 후 배치로 실행할 수 있음
    • 비용이 절반으로 줄어듦
    • 비실시간 애플리케이션에 유용함
  • HTML 예제를 제공하고 beautifulsoup 코드 스니펫을 요청하는 방법이 효과적이었음

    • 스크래핑하려는 구조가 동일하게 유지됨
    • LLM을 실제 파싱에 사용하는 것은 과도하며 결과가 왜곡될 위험이 있음
  • "html reducer"가 있는지 궁금함

    • 페이지 소스의 90%가 불필요한 토큰임
    • dom 파서를 사용하여 텍스트가 있는 노드만 유지하면 상당한 절감 효과가 있을 것임
    • readability를 사용하지만, JS가 많은 웹사이트에서는 품질이 떨어짐
  • GPT-4o로 직접 스크래핑하는 대신 GPT-4o가 간단한 웹 스크래퍼 스크립트를 작성하게 할 수 있음

    • 문제가 발생하면 프롬프트 루프를 사용함
    • 제약 해결사를 만들고 실행하는 것이 더 효율적임
  • Kadoa에서 AI 자동화 웹 스크래핑 작업을 진행 중임

    • 초기에는 GPT-3를 사용했으나 비용 효율적인 솔루션을 개발함
    • CSS 선택자 또는 XPath 추출 코드를 생성하는 코드젠을 사용함
    • 작은 LLM을 사용하여 데이터를 정리하고 원하는 형식으로 매핑함
    • LLM을 심판으로 사용하여 데이터 품질을 평가함
    • 전통적인 ETL 엔지니어링 방법과 작은 LLM 단계를 결합함
  • 클래식 음악 데이터베이스를 구축 중임

    • ChatGPT를 사용하여 위키피디아에서 이벤트 목록을 추출함
    • chatgpt-mini를 사용하여 비용을 절감함
    • BeautifulSoup(html).text를 사용하여 토큰 수를 줄임
    • 10,000 페이지를 스크래핑할 때 HTML을 제공하고 파이썬 코드를 작성하게 하는 것이 더 효율적이었음
    • Pandas의 from_html 기능이 유용하지만, 모든 테이블이 <table> 태그를 사용하지 않음