Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

OpenAI APIでPDF読み込みできるか試した話

はじめに

ChatGPTを使って手軽にファイルの読み込みができるようになりました!
操作は簡単で、添付マークをクリックしてファイルを選択するだけです。

GPTファイル添付

でも追加の処理をしたいのでpythonのコードでAPIを使ってPDF読み取りしたいです。
OpenAI APIを使ってPDF読み込みできるのか、挑戦してみたいと思います!!

目次

挑戦:企業の決算資料のPDF資料をOpenAI APIを使って読み込んでもらう

今回はメルカリが公開している「決算説明会資料」のPDF資料を利用します。
https://pdf.irpocket.com/C4385/MH4b/aRze/Gjgz.pdf

たとえばスプレッドシートと連携して、ワンクリックでいろんな企業の決算資料の要約一覧が作れたら便利そうだと思っています。

検証:gpt4-visionをOpenAI APIを使って読み取ってもらう

先に結果をお伝えすると、PDFファイルの読み込みはできませんでした、残念です・・・。
原因は「gpt4-visionではjpeg、やpngの画像ファイルとtextの文字ファイルのみ読み込み可能」だったためです。
検証の過程を解説します。

OpenAI APIVisionについての公式ドキュメントはこちらです。
https://platform.openai.com/docs/guides/vision

このドキュメントに記載されているコードを抜粋します。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4-vision-preview",
  messages=[
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "What’s in this image?"},
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
          },
        },
      ],
    }
  ],
  max_tokens=300,
)

print(response.choices[0])

このコードで読み取ろうとしている画像はこちらです。

https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg

では、ドキュメントのコードに以下の変更を加えて実行してみましょう。

  • google colabで使える
  • 日本語で回答を出力
!pip install openai

import os
os.environ["OPENAI_API_KEY"] = "あなたのOPENAI_API_KEY"

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4-vision-preview",
  messages=[
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "この画像は何ですか?"},
# ここでタイプを「image_url」として画像読み込みしている
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
          },
        },
      ],
    }
  ],
  max_tokens=300,
)

print(response.choices[0].message.content)
実行結果

この画像は、緑豊かな草原または湿地を通る木製の歩道を示しています。青空が広がり、美しい自然風景です。歩道は観察や散策に使われることがありますし、湿地や自然保護地域など、地面が不安定または濡れている場所でよく見かける設備です。

画像の情景が正しく読み取れています!!

では、強引にcontentのタイプを「 "type": "pdf_url",」として、PDFファイルの読み込みができるか検証してみます。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
  model="gpt-4-vision-preview",
  messages=[
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "このPDFファイルには何が書かれていますか?"},
# ここでタイプを「image_url」として画像読み込みしている
        {
          "type": "pdf_url",
          "pdf_url": {
            "url": "https://pdf.irpocket.com/C4385/MH4b/aRze/Gjgz.pdf",
          },
        },
      ],
    }
  ],
  max_tokens=300,
)

print(response.choices[0].message.content)

するとこのエラーが出ました。

BadRequestError: Error code: 400 - {'error': {'message': 'Invalid chat format. Content blocks are expected to be either text or image_url type.', 'type': 'invalid_request_error', 'param': None, 'code': None}}

どうやら、messageのcontentのタイプはtextとimage_url typeの2種類のみのようです。

というわけで、gpt4-visionをOpenAI API使ってPDFファイルを読み込むことはできませんでした。

何とかならないか⇒何とかなった

情報を探したところ、Assistants APIを使って読み取ってもらうという方法がありました! ※2023年11月現在、Assistants APIはbeta版です

OpenAI APIのAssistants APIについての公式ドキュメントはこちらです。 https://platform.openai.com/docs/api-reference/assistants/createAssistant

このAPIを活用するときの流れがすごくわかりやすいのはnpakaさんのnoteです!!
流石としか言いようがない・・・。
公式ドキュメント読んでも全然理解できなかったので、本当にありがとうございます!!
google claboで動くPythonコードも記載されています。
Google Colab で OpenAI API の Retrieval を試す|npaka

記載されているコードをマルっとコピーするわけにいかないので、何を変えたかだけ簡単に解説します。
先に、https://pdf.irpocket.com/C4385/MH4b/aRze/Gjgz.pdfをダウンロードして「メルカリ決算資料.pdf」というファイル名にしいて、googleドライブにマウントします。

  • 読み込みファイル名を「メルカリ決算資料.pdfに変更する
  • 役割(instructions)を「あなたはファイナンスコンサルタントです。この決算資料について回答してください」に変更する
  • "role": "user"のcontentを「メルカリの決算について簡単に概要を教えてください。」に変更する

そのときの回答がこちらです。

user : メルカリの決算について簡単に概要を教えてください。
assistant : メルカリの2024年度第1四半期(FY2024.6 1Q)の決算概要は以下の通りです:

- トップライン(売上高)の成長及び収益性を重視した経営が継続され、事業方針に基づく進捗が想定通りであることが示されています。特に、メルカードの発行枚数がローンチから約11か月で200万枚を突破し、ユーザ一人当たりの平均購入金額(ARPU)の向上や出品数の増加に寄与してグループシナジーの創出が進んでいます【7†source】。

- Marketplaceのセグメントにおいては、売上収益は前年比で12%増加し、月間アクティブユーザー(MAU)は2300万人に到達しました。Fintechセグメントでは、月間ユーザー数は1624万人で、債権残高は1314億円となりました【8†source】。

- 米国セグメントに関しては、GMV成長率は前年比で11%の減少を示しましたが、MAUは横ばいで推移しています【7†source】。

- 連結財務においては、売上収益は前年同期比11%増の398億円から442億円へと成長し、コア営業利益は同81%増の25億円から47億円へ改善しました【9†source】。

これらの結果は、メルカリがその戦略を実行しており、いくつかの主要指標において前向きな進捗が見られることを示しています。しかし、米国市場においてはGMVの減少が見られるなど、地域によるパフォーマンスの差も認識されています。

ちゃんと読み込めています!! どこまで細かい粒度で読み込んでいるかは今後検証してみます。

なお、assistants toolsに対応している拡張子はこちらです。
たくさんあります!! https://platform.openai.com/docs/assistants/tools/supported-files

おわりに

正直、GPT plas(有料会員)になってチャット画面でファイル添付したほうが楽だし早いです。
ノーコードでできるので、プログラミングの知識もいりません。

しかし、会社の環境で「みんなが使える環境で外部情報を活用す」などの観点ではAPI活用したほうが汎用性は高いと思います。
とはいえ、GPTsなども出てきているしCode Interpreterもあるのでプログラミングを自分で書くという行為の価値がわからなくなって生きている昨今です。

と、ネガティブになっても仕方ないのでこれからもOpenAI APIはきちんと続けていきたいと思います!!