nikkie-ftnextの日記

イベントレポートや読書メモを発信

LLMを使って画像やPDF中のテキストを構造化。知ってる事例まとめ(2024年3月時点)

はじめに

(お財布が)試される仕掛け人、nikkieです。

テキストを含んだ画像をLLMで扱い、情報を取り出す時に参考にできそうな事例をここに書き出します。
目的は知っている事例の整理です。
試行錯誤に進むうえで一度書き出します。

テキストを含む画像の事例だけでなく、PDFを扱う事例も似ていそうだったので混ぜて扱っています。

目次

事例1️⃣ 画像をOCRして、テキストを構造化

先日話題になっていたこちらの記事

名刺の画像からスプレッドシートに記載する機能について

OCRとしてGoogle CloudのCloud Vision API
OCRで読み取った文字列を構造化させるところをGPT4のAPIに任せました

Cloud Vision API1を使う実装はgoogle.cloud.vision.ImageAnnotatorClientを使うというもの。
https://github.com/watanabe-tsubasa/OCR_name_card/blob/277b4e3f2d4a76d6f2c1da3bb811274a1363cfe8/modules/vision_api.py#L5-L25
GCPのドキュメントでも紹介されています
画像内のテキストを検出する  |  Cloud Vision API  |  Google Cloud

GPT-4 Turboのプロンプトはこちら
https://github.com/watanabe-tsubasa/OCR_name_card/blob/277b4e3f2d4a76d6f2c1da3bb811274a1363cfe8/modules/create_chat.py#L16-L23

次の文字列から会社名、部署名、氏名、会社住所、電話番号、e-mailアドレスを抜き出して、JSON形式で出力してください。JSONスキーマは次の通りです:{schema}

画像をOCRして得たテキストをGPT-4にJSONフォーマットに構造化してもらうわけですね。

事例2️⃣ PDFから読み取ったテキストの構造化

「似ているな」と思い出したのが、1年前(2023年3月)のこちらの事例

GPT-3.5でも構造化できたようです(現在は精度を求めるならGPT-4だと思います)

行政の統計資料(PDF提供。複数段のヘッダーを持つ表)のデータを構造化します。

  1. UnstructuredでPDFを読み取る2
  2. 1のテキストをGPT-3.5で構造化

LangChainを使っていますが、要素はこの2つと理解しました。

プロンプト(1-shotですね!)

以下に示すデータは、市町村の統計データとして提供されているPDFをUnstructuredPDFLoaderによりテキスト化したものである。
平成3年から28年までの行をJSONデータに変換せよ。
以下は平成3年度の行をJSON化した場合の例である。

# JSON
[
  (
    "年": "平成3年",
    "商店数": (
      "実数": 1147,
      "対前回増減率_%": -1.8,
      "平成3年=100": 100.0
    )
  )
]

# データ
区分 年 実 数 対前回増減率(%) 平成3年=100 実 数 (人) 対前回増減率(%) 平成3年=100 実 数 (万円) 対前回増減率(%) 平成3年=100 平成3年 1,147 △1.8 100.0 5,194 5.9 100.0 15,930,427 15.9 100.0 6 1,077 △ 6.1 93.9

(データは途中で省略しています)

LLMはテキストの構造化が得意?

テキストを構造化するという点は、ここまでの2例で共通しています。
違いはテキストのソースで、一方は画像、他方はPDFです

以下のツイートを見ていて、入力に完全な情報がある場合、LLMはデータ変換をうまくやれると理解しました。

ここまでの2例について私は、入力にある完全な情報をLLMがJSONスキーマを満たすように変換した、と捉えています

事例3️⃣ OCRも構造化もGPTで行う例

OCRもGPTで行う例も見聞きしました(2024年1月)。
当初はGoogle CloudのDocument AI3OCRしてそれをGPT-4で構造化していたシステムですが、OCRをGPT-4V(GPT-4 Turbo with Visionに置き換えたそうです

  • 扱うのは処方箋。処方情報の情報抽出
  • GPT-4Vで処方情報を抽出
    • ここで情報の塊(=間に空白があっても、それを含む1つの行)として抽出しているのが重宝しているとのこと
  • GPT-4 Turboで情報をJSONに構造化(JSONモード使用)

発表資料にもありますが、GPT-4Vのドキュメントでは日本語(英語でない言語)に限界があると述べられています。
https://platform.openai.com/docs/guides/vision/limitations

The model may not perform optimally when handling images with text of non-Latin alphabets, such as Japanese or Korean.

限界があると書かれていてもうまくいくケースはあるということですね。
OpenAIとしてもこの限界は取り払っていきたいはずなので今後に期待

手元にある事例のまとめ🌯

うまくいったと報告された事例の共通部分は以下かなと思います。

  1. 画像やPDFからテキストを取り出す
  2. テキストをJSONに構造化
    • GPT-4 TurboのJSONモードが有力4

「入力に完全な情報があるとき、LLMはそれを変換するのが得意」という性質も認識しました。

P.S. PydanticのParser

テキストの構造化の箇所、LangChainはいくつか提供してくれているみたいです(触ってみたい事項)


  1. 過去記事で取り上げました。ImageAnnotatorClientを使っています
  2. 過去に取り上げた記事です。PDFに限らずどんなものからでもテキストを取り出せそうな雰囲気です
  3. 取り上げた過去記事
  4. Function callingも考えられると思います