はじめに
(お財布が)試される仕掛け人、nikkieです。
テキストを含んだ画像をLLMで扱い、情報を取り出す時に参考にできそうな事例をここに書き出します。
目的は知っている事例の整理です。
試行錯誤に進むうえで一度書き出します。
テキストを含む画像の事例だけでなく、PDFを扱う事例も似ていそうだったので混ぜて扱っています。
目次
- はじめに
- 目次
- 事例1️⃣ 画像をOCRして、テキストを構造化
- 事例2️⃣ PDFから読み取ったテキストの構造化
- LLMはテキストの構造化が得意?
- 事例3️⃣ OCRも構造化もGPTで行う例
- 手元にある事例のまとめ🌯
- P.S. PydanticのParser
事例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提供。複数段のヘッダーを持つ表)のデータを構造化します。
- UnstructuredでPDFを読み取る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はデータ変換をうまくやれると理解しました。
LLMを組込む場合は生成的なタスクよりまず読解に使うべきである、というのは正しいと思うんですね。一点正すとすれば、簡単な機械翻訳がLLMでうまくいくのはこれがデータ変換の一種であるからで、本質的には生成かどうかではなく入力に完全な情報があるかどうかによる。https://t.co/thDE6dZYAh
— Odashi (@odashi_t) 2023年12月9日
ここまでの2例について私は、入力にある完全な情報をLLMがJSONスキーマを満たすように変換した、と捉えています
事例3️⃣ OCRも構造化もGPTで行う例
OCRもGPTで行う例も見聞きしました(2024年1月)。
当初はGoogle CloudのDocument AI3でOCRしてそれを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としてもこの限界は取り払っていきたいはずなので今後に期待
手元にある事例のまとめ🌯
うまくいったと報告された事例の共通部分は以下かなと思います。
- 画像やPDFからテキストを取り出す
- テキストをJSONに構造化
「入力に完全な情報があるとき、LLMはそれを変換するのが得意」という性質も認識しました。
P.S. PydanticのParser
テキストの構造化の箇所、LangChainはいくつか提供してくれているみたいです(触ってみたい事項)