7 ポイント 投稿者 GN⁺ 2024-09-03 | 1件のコメント | WhatsAppで共有
  • OpenAIの新しい構造化出力機能を使って、AI支援Webスクレイパーを開発した経験をまとめた記事

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]  
    
  • システムプロンプトは次のとおり:

    あなたはWebスクレイピングの専門家です。HTMLテーブルの内容を受け取り、構造化データを抽出しなければならない

複雑なテーブルをパースする

  • シンプルなテーブルを試した後、Weather.comの10日間天気予報のような複雑なテーブルをテスト
  • GPT-4oはDay/Night列を追加し、データを正確にパース
  • Condition列がWebサイト上で見えなかったためハルシネーションかと思われたが、ソースコードを確認すると実在するタグだった

結合された行がモデルを壊す

  • Wikipediaのシンプルなテーブル(Human Development Index)をテストしたが、結合された行のためモデルが失敗
  • システムプロンプトを修正してみたが効果はなかった

GPT-4oにXPathの返却を依頼する

  • OpenAI API呼び出しコストを下げるため、パース済みデータの代わりにXPathを返すよう依頼
  • しかし、モデルが誤ったXPathを返したり、データを返さなかったりすることが多かった

2つのアプローチを組み合わせる

  • データを抽出した後、それを参照してXPathを要求するアプローチを試行
  • この方法はより良い結果をもたらしたが、画像がテキストに変換される問題が発生

GPT-4oは非常に高価

  • GPT-4oを使ったスクレイピングはコストが高い
  • HTML文字列から不要なデータを除去するクリーンアップロジックを追加してコストを削減

結論とデモ

  • GPT-4oのデータ抽出品質には驚かされたが、コスト面では失望
  • Streamlitを使った簡単なデモを提供
  • さらなる実験により改善の余地が多い

GN⁺のまとめ

  • この記事はAIを使ったWebスクレイピングの可能性と限界を探っている
  • GPT-4oの構造化出力機能を活用し、複雑なテーブルデータを正確に抽出できることを示す
  • コスト面の問題といくつかの技術的制約はあるが、AI支援Webスクレイピングツールの潜在力を確認できる
  • 類似機能を提供する他のプロジェクトとしてはBeautifulSoup、Scrapyなどがある

1件のコメント

 
GN⁺ 2024-09-03
Hacker Newsの意見
  • HTMLをシンプルな形式(例: markdown)に変換してからLLMに渡す方法が成功していた

    • Extractusとdom-to-semantic-markdownを試した
    • 内部ではApifyとFirecrawlを使ってMagic Loopsをクラウドで実行している
    • Chrome Extensionではdom-to-semantic-markdownを使っている
    • ユーザーサポートのフローを通じて特定の要素を抽出する方法を探っている
    • 問題を単純化することでGPT-4o miniでも成功した
  • 構造化されたコンテンツ(例: 項目リスト、簡単なテーブル)にはLLMは不要

    • WebスクレイパーをAIで最初のバージョンとして作ったが、要素の属性と位置ベースのヒューリスティックのほうが、より速く、安く、正確だった
    • ほとんどのWebサイトでは非AIアプローチが非常によく機能する
    • 本当にAIが必要か確認すべき
  • 投稿者が作業の99%を終えたのに、残り1%のためにollamaをダウンロードしてテストしなかったのは意外

    • 7Bまたは30Bモデルがこのケースではうまく機能するかもしれない
    • GPT-4oは必要ない
  • ページのスクリーンショットを撮り、必要な部分を切り取ってGPTに渡す方法を使っている

    • さまざまなベンダーの価格比較を手作業で行わなければならないときに便利
    • コストは高くなり得るが、実際の人間よりは安く、より意味のある作業ができるようになる
  • OpenAIが最近Batch APIを発表した

    • すべてのプロンプトを準備してからバッチで実行できる
    • コストが半分に下がる
    • リアルタイムではないアプリケーションに有用
  • HTMLの例を提示し、beautifulsoupのコードスニペットを求める方法が効果的だった

    • スクレイピングしたい構造が同じまま維持される
    • 実際のパースにLLMを使うのはやりすぎで、結果が歪むリスクがある
  • 「html reducer」のようなものがあるのか気になる

    • ページソースの90%は不要なトークン
    • DOMパーサーを使ってテキストのあるノードだけを残せば、かなりの節約効果があるはず
    • readabilityを使っているが、JSの多いWebサイトでは品質が落ちる
  • GPT-4oで直接スクレイピングする代わりに、GPT-4oに簡単なWebスクレイパーのスクリプトを書かせることができる

    • 問題が発生したらプロンプトループを使う
    • 制約ソルバーを作って実行するほうが効率的
  • KadoaでAI自動化Webスクレイピングに取り組んでいる

    • 当初はGPT-3を使っていたが、コスト効率の高いソリューションを開発した
    • CSSセレクターまたはXPath抽出コードを生成するコード生成を使う
    • 小規模なLLMを使ってデータを整理し、望む形式にマッピングする
    • LLMを審判として使い、データ品質を評価する
    • 伝統的なETLエンジニアリング手法と小規模LLMのステップを組み合わせている
  • クラシック音楽のデータベースを構築中

    • ChatGPTを使ってWikipediaからイベント一覧を抽出している
    • chatgpt-miniを使ってコストを削減している
    • BeautifulSoup(html).textを使ってトークン数を減らしている
    • 10,000ページをスクレイピングするときは、HTMLを渡してPythonコードを書かせるほうが効率的だった
    • Pandasのfrom_html機能は便利だが、すべてのテーブルが<table>タグを使っているわけではない