8
5

OpenAIの最新モデルGPT-4oをWeb APIで呼び出して質問に答えてもらったり画像の内容を説明してもらったりした

Posted at

Supershipの名畑です。アニメ「うる星やつら」がついに最終章を迎えました。別れは寂しいけれどしっかり堪能させていただきます。

はじめに

OpenAIが5月にリリースしましたGPT-4o(oはomni)はその品質の高さから、かなりの衝撃を以て様々なメディアに取り上げられました。

このGPT-4oはWeb APIからも呼び出せますので、今回はその実装を書き残します。

  • テキストのみのインプット
  • 画像のURLを含むインプット
  • ローカルの画像ファイルを含むインプット

上記の3つを行います。

料金

Pricingのページをご覧ください。画像はその解像度で金額が変わりますのでご注意ください。

私の環境

OSはmacOS 14 Sonomaです。

今回の使用言語はPythonです。
バージョンは3.12.2です。

$ python --version
Python 3.12.2

openaiのライブラリもインストール済みです。

$ openai --version
openai 1.13.3

入っていない人はinstallしておきましょう。

$ pip install openai

API KeyはOpenAIのAPI keysのページで発行済みで、OPENAI_API_KEYという環境変数名で保存してあるとします。

export OPENAI_API_KEY=ここに取得したAPI Keyを書く

テキストのインプット

以下、テキストをインプットした時のコードです。パラメータについて詳しくはAPI Referenceをご覧ください。

from openai import OpenAI
import os
client = OpenAI()
client.api_key = os.environ['OPENAI_API_KEY']  # 環境変数から取得

completion = client.chat.completions.create(
  model="gpt-4o",  # モデルの指定
  messages=[
    {"role": "system", "content": "You are an excellent secretary who responds in Japanese."},
    {"role": "user", "content": "月刊アフタヌーンで連載されTVアニメ化された作品を一つ教えてください"}
  ]
)

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

月刊アフタヌーンで連載されTVアニメ化された作品を一つ教えてください」と投げかけています。

回答は以下でした。

もちろんです。月刊アフタヌーンで連載され、後にTVアニメ化された作品の一つに『げんしけん』があります。『げんしけん』はオタク文化をテーマにしたストーリーで、多くの読者に親しまれました。アニメ化もされ、多くのファンを魅了しました。

バッチリです。

げんしけんは名作ですね。

画像のURLによるインプット

次に画像を含むインプットです。

まずはインターネット上に置かれた画像のURLで試します。過去記事で生成した以下の画像を用いることにしました。

dalle-bread-2.png

実装は以下です。API呼び出し時の引数としてimage_urlを追加しています。詳しくは公式の実装ガイドをご参照ください。

from openai import OpenAI
import os

client = OpenAI()
client.api_key = os.environ['OPENAI_API_KEY']  # 環境変数から取得

completion = client.chat.completions.create(
    model="gpt-4o",  # モデルの指定
    messages=[
        {"role": "system", "content": "You are an excellent secretary who responds in Japanese."},
        {"role": "user",
         "content": [
             {"type": "text", "text": "この絵になにが描かれているか説明してください"},
             {
                 "type": "image_url",
                 "image_url": {
                     "url": "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/6ecd51e1-1ec3-959c-542e-045a66633a63.png",
                 },
             },
         ],
         }
    ]
)

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

この絵になにが描かれているか説明してください」と聞いた回答は以下でした。

この絵には、セーラー服を着た女子学生がパンをくわえながら道路を走っている様子が描かれています。背景には、日本の住宅街があり、電柱や建物が並んでいます。彼女は急いでいるように見え、おそらく学校に遅れそうなため急いでいるシーンだと思われます。

これも完璧ですね。

画像のファイルによるインプット

最後にローカルに置いた画像ファイルを読み込ませてみます。

以下の画像を用意してみました。波よ聞いてくれ、大好きです。

sample_image.png

この画像をsample_image.pngというファイル名でpythonのファイルと同じ階層に保存しました。

実装は以下です。Base64エンコードをしています。MIMEタイプの指定もしています。今回はimage/pngです。

from openai import OpenAI
import os
import base64

client = OpenAI()
client.api_key = os.environ['OPENAI_API_KEY']  # 環境変数から取得

with open("sample_image.png", "rb") as image_file:  # 画像ファイルまでのパス
    base64_image = base64.b64encode(image_file.read()).decode('utf-8')

completion = client.chat.completions.create(
    model="gpt-4o",  # モデルの指定
    messages=[
        {"role": "system", "content": "You are an excellent secretary who responds in Japanese."},
        {"role": "user",
         "content": [
             {"type": "text", "text": "この絵に書かれている文字をすべて教えてください"},
             {
                 "type": "image_url",
                 "image_url": {
                     "url": f"data:image/png;base64,{base64_image}"
                 },
             },
         ],
         }
    ]
)

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

この絵に書かれている文字をすべて教えてください」と聞いた回答が以下です。

この絵に書かれている文字は以下の通りです:

あいうえお

3399850822125

波よ聞いてくれ

賢すぎる。

最後に

使えば使うほどにOpenAIはすごいとしみじみ思います。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5