【ITニュース解説】Cracking PDF Catalogs: AI to Airtable for SKUs and Prices
2026年10月23日に「Dev.to」が公開したITニュース「Cracking PDF Catalogs: AI to Airtable for SKUs and Prices」について初心者にもわかりやすく解説しています。
ITニュース概要
PDFカタログからの商品情報手動入力は非効率だった。従来のPythonでは多様なPDFに対応できず、困難に。そこで、PDFから抽出したテキストをLLM(大規模言語モデル)に渡し、欲しい情報をJSON形式で自動抽出するシステムを構築。手作業が大幅に減り、様々なPDFに対応可能に。生産性も向上した。
ITニュース解説
eコマースを運営していると、様々な仕入先(ベンダー)から商品のカタログがPDF形式で送られてくることがよくある。これらのPDFカタログから、商品の品番(SKU)、商品名、価格といった情報を自社のデータベース(ここではAirtableというWebデータベース)に登録する作業は、非常に手間がかかる業務の一つである。仕入先ごとにカタログの形式は異なり、きれいに整理されたものもあれば、スキャンされたもの、あるいはレイアウトが複雑で読みにくいものも存在する。これらの情報を一つ一つ手作業でコピー&ペーストしていると、多くの時間と労力がかかり、タイプミスも発生しやすく、常に最新の情報に更新することが難しいという課題があった。
この手作業の負担を軽減するため、最初に考えられたのはプログラミングによる自動化だった。Pythonというプログラミング言語を使って、PDFからテキストを抽出し、特定のパターンを見つけ出すことでデータを取得しようと試みた。具体的には、「pdfplumber」や「PyPDF2」といったPythonライブラリを使用し、PDFファイルを開いて中のテキストを読み出したり、表形式のデータを抽出したりする方法を試した。そして、読み出したテキストの中から、品番や価格といった必要な情報を見つけ出すために、「正規表現(regex)」と呼ばれる、文字列のパターンを記述する特殊な記法を用いてデータの抽出を試みた。
しかし、この方法はうまくいかないことが多かった。PDFのレイアウトがシンプルで一貫している場合は機能したものの、カタログの20%程度にしか対応できなかった。例えば、商品情報が整理された表形式ではなく、文章の中に散りばめられていたり、画像の中に埋め込まれていたりすると、テキストの抽出がうまくいかず、正規表現も機能しなかった。仕入先がカタログのレイアウトを変更するたびに、新しい正規表現パターンを作成する必要があり、これは終わりのない作業に感じられた。「Table extraction failed for page X: could not find any explicit or implicit lines(Xページから表を抽出できませんでした:明示的または暗黙の線が見つかりませんでした)」というエラーメッセージは、当時の苦労を象徴する言葉だった。
また、PDFを画像に変換し、そこから文字を読み取るOCR(Optical Character Recognition:光学文字認識)の技術も検討された。しかし、様々なフォントやレイアウトに対応するには、OCRの認識精度が十分ではなかったため、この方法も信頼できるデータ抽出には至らなかった。さらに、特定のテンプレートに基づいてデータを抽出するSaaS(Software as a Service)型のツールも試されたが、新しい仕入先やカタログのデザイン変更があるたびに、手動で新しいテンプレートを設定し直す必要があり、そのためのサブスクリプション費用もかさむため、小規模な事業者にはコスト面で課題があった。
これらの試行錯誤の末、ついに画期的な解決策が見つかった。それが「LLM(Large Language Model:大規模言語モデル)」の活用である。LLMは、人間が話す言葉や文章を理解し、生成する能力を持つ人工知能の一種で、まるで賢い人間のように文章を読み解き、質問に答えたり、要約したりすることができる。ふと、「このLLMにPDFのテキストを読ませたら、SKUや価格、商品説明を教えてくれるのではないか」というアイデアが浮かんだ。いくつかの試行錯誤の結果、このアイデアが有効であることが分かった。ただし、LLMが直接PDFファイルを読み解くわけではなく、まずはPDFからすべてのテキストを抽出するプロセスが必要だった。
解決策は、以下のシンプルな三段階のアプローチで実現された。
第一段階として、PDFからの生テキスト抽出を行う。以前に試した「pdfplumber」で表形式のデータ解析を試みて失敗した経験から、ここではよりシンプルに、PDFに含まれるすべての目に見えるテキストを抽出することに専念した。「pypdf」というPythonライブラリ(「PyPDF2」の現代版でメンテナンスされているもの)を用いると、これを簡単に行うことができる。このPythonコードは、指定されたPDFファイルを開き、各ページからテキストを順に抽出して、一つの大きなテキスト文字列として結合する。このテキストは、元のPDFのレイアウトに関わらず、すべての文字情報が羅列された状態であり、しばしば非常にごちゃごちゃとした読みにくい形をしている。
第二段階として、この抽出した生テキストをLLMに与え、必要な情報を抽出する。「プロンプト」と呼ばれる、LLMに対する指示文がここで非常に重要となる。LLMは与えられた指示に基づいて動作するため、何をどう抽出してほしいのかを明確かつ具体的に伝える必要がある。ここでは、APIの利用料を抑えるために、自分でサーバーに「llama-3-70b-instruct」というLLMを構築し、「Ollama」というツールを通じて利用した。LLMに与えるプロンプトでは、LLMに「あなたは製品情報抽出の専門家である」と役割を与え、具体的な抽出項目(SKU、製品説明、価格)、説明の簡潔さ、価格の形式、複数製品への対応、情報が見つからない場合の対応、そして最も重要な「JSON形式での出力」を指示している。LLMは、この非常に構造化されていない生テキストを、まるで人間が文章を読み解くかのように理解し、SKUとそれに紐づく説明や価格を推論して、指定されたJSON形式で出力した。最初の段階で100%完璧ではないものの、約90%の精度で、人間が少し修正すれば使えるレベルのデータが生成された。LLMの言語理解能力が、複雑なレイアウトや文脈から必要な情報を識別する上で大きな力を発揮した結果である。
第三段階として、Airtableへのデータ連携を行う。LLMから出力されたJSONデータは、Pythonスクリプトと「pyairtable」というライブラリを使って、Airtableデータベースに自動的に登録される。この際、LLMによって抽出された新しい情報には、デフォルトで「Needs Review(レビューが必要)」というステータスが設定されるようにした。これにより、人間が最終的に確認し、必要に応じて修正を加えるプロセスが明確になり、自動化されたワークフローの中に人間のチェックポイントを組み込むことができた。
この新しいアプローチにより、劇的な効果が得られた。これまで複雑な20ページのカタログを処理するのに半日もかかっていた作業が、PDF一つあたり約30秒で完了するようになった。作業チームは、カタログの更新作業に対して抱いていたうんざりするような気持ちから解放された。この方法は、仕入先がレイアウトを大きく変更したり、新しい仕入先のカタログが入ってきたりしても、正規表現を書き直したり、新しいテンプレートを設定したりする必要がない。ほとんどのPDFカタログに対して「一度設定すれば後は自動的に処理される」状態を実現できたのである。
現在もプロンプトの記述をさらに洗練させたり、例外的なケースに対応するための「フューショット学習(少数の例を与えることで学習させる方法)」を追加したりといった改善は続けられている。しかし、この解決策は長年悩まされてきた問題をようやく解決できたという大きな達成感をもたらした。生産性は大幅に向上し、日々の業務がはるかに楽になったことは間違いない。これは、システムエンジニアリングの分野において、AI技術、特にLLMがどれほど強力なツールになり得るかを示す好例と言えるだろう。