🥚

FirecrawlでRAG用データ作成を無料でやりたい!(2)PageOption編

2024/09/07に公開

モチベーション

LLMによるRAGシステムを構築するにあたって、検索データの準備は手間がかかります。元となるデータが綺麗な文書ならよいのですが、PDFにせよWebページにせよ、必ずしも綺麗な文書でないことが多いです。最近Web記事などでよく目にするようになった。FireCrawlを使えば、ローカル環境でもWebページから綺麗なマークダウンを生成してくれそうなので、実際にできるかチャレンジしています。

前回のおさらいと今回の内容

前回は、Firecrawlをローカル環境で起動し、ローカル環境内のサンプルWebページの情報がMarkdown形式で得られた。HTMLと比べて、タグ情報を含まない分必要な情報を選択的に取得できた。ただし、RAGに使うにはまだまだ余分な目次情報などのデータがある。現実的には、余分な情報の形式はWebページによって異なると想定されるため、予め正規表現で完璧にクレンジングすることは困難だと思われます。そこで、今回はFireCrawlのオプションのうち、PageOptionを駆使することでどこまでクレンジングできるか確認したいと思います。

サマリ

PageOptionのうち、onlyMainContentremoveTags(特にimgタグの削除指定)が有効そう

対象読者

RAGやデータセット作成に興味のある人
ローカル環境やオンプレミス環境へのLLMシステムのデプロイに興味がある人

前提条件

FireCrawl環境が用意できていること。詳しくは前回の記事を参照のこと

データ整形の工夫

机上検討

まずは机上で検討してみましょう。公式ドキュメントのAPIバージョンをv0に変更し、Advanced Scraping Guideを開くといろいろなオプションを見ることができます。
図

このページと、APIリファレンスから読み取れることをまとめると

  • Scrapingのオプションには2種類あり、それぞれ「Page Options」と「Extractor Options」
  • 「Page Option」はWebページからどの情報を取得するのかを指定できる
    • onlyMainContent: trueと指定することでメインコンテンツのみ取得できる
    • removeTagsを指定することで特定のタグを削除できる
    • includeRawHtmlやscreenshotオプションをTrueにすることで追加情報を取得できる
    • 動的ページの場合、waitForで指定した秒数だけロードを待つことも選択肢
    • parsePDFオプションをfalseにすることでPDFページを読み込まないようにもできる
  • 「Extractor Options」は、Scrapingで取得した情報(or生のHTML情報)をLLMで加工し、プロンプトと出力スキーマを指定できる* *デフォルトではOpenAI APIを使うことになっており、スキーマ指定が受けられるLLMモデルのみが対応していると思われる。
    • mode: LLMが加工する対象をScrapingで取得した情報と生のHTMLから選択できる
    • extractionSchema: 加工後の出力をJson Schema形式で指定できる

その他にも細かいオプションについてAPIリファレンスに記載がありますが、今回は割愛します。

PageOptionの指定

それぞれ実際にやってみた

前回のscrape.pyを書き換えて1つずつオプションを試してみました。

onlyMainContent

scrape.py
- scrape_status = app.scrape_url('http://192.168.1.1:8888')
+ scrape_status = app.scrape_url('http://192.168.1.1:8888', params = {'pageOptions': {'onlyMainContent': True})
結果

目次の情報が削除され、当該ページならではの情報のみに絞りこめました。
画像リンクなどはそのままでした。
画像の上下で文章が切断されてしまうため、画像によって望ましくないチャンク分割が発生してしまうかもしれません。マルチモーダルを意識しない場合は削除するのがよさそうです。

サンプルページ1
========

ここはPage 1の内容(前半)です。

画像をはる場所も用意してみました。

![サンプル画像](http://192.168.1.1:8888/sample-image.jpg)

ここはPage 1の内容(後半)です。

removeTags

さきほど残ってしまったimgタグを消してみましょう(文章のみを扱いたいときは常に消してもいいはず)

scrape.py
- scrape_status = app.scrape_url('http://192.168.1.1:8888')
+ scrape_status = app.scrape_url('http://192.168.1.1:8888', params = {'pageOptions': {'onlyMainContent': True, 'removeTags': ['img']})
結果

予想どおりにimgタグが削除され、きれいなデータになってきました。

サンプルページ1
========

ここはPage 1の内容(前半)です。

画像をはる場所も用意してみました。

ここはPage 1の内容(後半)です。

ここからはおまけのようなものなのでダイジェストでお送りします

includeRawHtml

結果

scrape_status['rawHtml']変数にHTMLがstr形式で返却されました

screenshot

結果

機能しませんでした。Firecrawlその2:セルフホストについてにあるように、実装されていない可能性があります。

Discussion