Webからの情報取得の鍵は「データの正体を見抜くこと」Crawl4AI×ローカルLLMで挑む高精度データ抽出
きっかけ
OpenCode から利用しているローカル LLM(Nemotron 3.5 Super)と Crawl4AI を組み合わせて、「Webサイトの情報をうまく取得できないか?」と考えたのが始まりです。
これまで自作していたツールでは、Playwright を使って一覧ページを直接情報取得していました。しかし、取得した値は文字列のままで、抽出の根拠となったテキストも記録されていませんでした。
実際にこの GUI を使ってWebページを取得してみたところ、ページ種別ごとに「取得できない項目」や「想定外の HTML 構造」が次々と見つかり、一筋縄ではいかないことがわかりました。
学んだこと
1. Crawl4AI の使い勝手
- Windows の venv 環境でも問題なく動作しました。
- ページの取得から Markdown への変換も可能で便利です。
2. 特定のWebページ特有の「抽出の罠」
ページの取得自体よりも**「正しく値を抽出すること」のほうが圧倒的に難しい**と実感しました。例えば、以下のようなトラップがあります。
- 数値の混同
- 表記の誤認
- 構造の誤認
- 項目の混入
- 別データの混入
3. 効果的だった対策
- 原文(evidence)を必ず残す: どのテキストを元にその値と判断したのか、セットで保持します。
- 探索範囲の限定: ページ全体ではなく、対象を絞ってから読み取ります。
- 推測で埋めない: 「-」表記や範囲指定などの曖昧な値は、無理に変換せず空欄(未取得)として扱います。
4. LLM の強みと安全な使い方
- CSS セレクタでは指定しづらい、自然文で書かれたページから情報を読み取る作業には LLM が威力を発揮します。
- ただし、LLM の出力を無条件に信じるのは危険です。「抽出根拠となるテキストが元の本文に実在し、かつその根拠から同じ値が読み取れること」を機械的に照合し、パスしたものだけを採用するようにしました。この検証ステップを入れることで、ハルシネーション(誤情報)の混入を完全に防げます。
5. データ設計と開発の工夫
- HTML のローカル保存: 取得した HTML を保存しておけば、抽出ロジックを修正するたびにサイトへアクセスし直す必要がなくなり、効率的かつサイトへ負荷をかけずに開発できます。
自分なりの理解
本質的な難しさは、「データを取ってくること」ではなく、**「その値が何を意味しているのかを確定させること」**にあると感じました。
同じ数字でも、それが何を意味しているかでデータの価値はまったく異なります。だからこそ、値と抽出根拠(evidence)を常にセットで持ち、確証が持てないものはあえて空欄にしておくアプローチが、結果として最も信頼できるデータを作ることができます。
LLM は非常に優秀な「読み手」ですが、回答をそのまま使うとどうしても誤りが混ざります。「根拠となる原文を書き出させ、プログラム側で照合できたものだけを採用する」というガードレールを設けることで、安全で強力なアシスタントとして活用できるのだと分かりました。
実践へのつなげ方
- 価格監視システムとの連携: 抽出結果(値、根拠、警告フラグ、取得方法)をまとめた JSON を、既存の価格監視システムに渡すようにします。警告フラグが付いている値は自動処理せず、人の目でチェックする運用にします。
- テスト駆動の抽出改善: 新しいサイトやページ形式に対応する際は、まず HTML を一度だけ保存します。そこから罠になりそうなパターンを含んだテスト用データとテストコードを作り、テストを通す形で抽出ロジックを実装していきます。
- 業務への応用: LLM を使って業務データの抽出や要約を行う際も、「根拠を本文から引用させ、機械的に照合する」という検証パターンを一貫して使っていきます。
次に試すこと
まずは気になる物件を GUI から 5 件ほど取得して CSV に出力し、情報を並べて比較してみようと思います。 その中でうまく取れなかった項目や警告が出た項目を 1 つ選び、今回学んだ手順(HTML を保存 → テストを作成 → 抽出コードを修正)に沿って、実際にロジックの改善を試してみる予定です。