【要約】陸上競技のPDFリザルトをPlaywrightとGeminiでJSON化する設計 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
TFLinkは、陸上競技の大会結果をアプリで扱うためのデータ化において、PDF形式の解析に苦慮している。PDFは人間向けの表示に特化しており、機械的な読み取りが困難なためである。
- ・大会や団体ごとに、順位や氏名、所属などの項目順序が異なる。
- ・種目名が別ページに跨るなど、レイアウトの揺れが激しい。
- ・氏名や所属に不要なスペースが混入し、正規表現のみでは対応しきれない。
- ・DNSやDQといった特殊な状態値が混在し、構造化を阻害する。
// Approach
TFLinkは、全ての解析をAIに頼るのではなく、機械的な処理とAIを使い分ける段階的なパイプラインを構築した。これにより、処理速度の確保と柔軟な対応を両立させている。
- ・Playwrightを用いて、動的なWebページからPDFファイルを確実に取得する。
- ・pdfminer.sixでPDFからテキストを抽出する。
- ・正規表現を用いて、定型的なパターンを高速かつ安定的に構造化する。
- ・正規表現で対応できない複雑なパターンに対し、Geminiをフォールバックとして活用する。
- ・GeminiにはFlash系の軽量モデルを優先的に使用し、コストと速度を最適化する。
- ・抽出後のデータは、Rails APIへ送る前に正規化と検証を行う。
// Result
TFLinkは、解析の各工程を分離することで、エラー発生時の原因特定が容易な設計を実現した。
- ・正規表現とGeminiの役割分担により、精度とコストのバランスを最適化した。
- ・Geminiの利用において、軽量モデル(gemini-2.0-flash等)を優先する設計とした。
- ・データの検証工程を挟むことで、DBへの不正なデータ混入リスクを低減した。
- ・今後は、運用を通じて解析精度を継続的に向上させる方針である。
Senior Engineer Insight
> 「万能なパーサーを作らない」という設計思想は、実務において極めて現実的かつ賢明である。全てをLLMに委ねると、コスト増と非決定的な挙動が運用上のリスクとなる。正規表現による一次処理と、LLMによる二次処理を組み合わせる構成は、スケーラビリティとコスト効率の観点から高く評価できる。ただし、スクレイピング時の負荷制御や、LLMの出力検証の堅牢性をどこまで高められるかが、本番環境での成否を分けるだろう。