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

[Supership](https://supership.jp/)の名畑です。アニメ「[うる星やつら](https://uy-allstars.com/)」がついに[最終章を迎えました](https://www.youtube.com/watch?v=Zry21gGPe4s)。別れは寂しいけれどしっかり堪能させていただきます。

## はじめに

[OpenAI](https://openai.com/)が5月にリリースしました[GPT-4o](https://openai.com/index/hello-gpt-4o/)(oはomni）はその品質の高さから、かなりの衝撃を以て様々なメディアに取り上げられました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/vgYi3Wr7v_g?si=9KvuRXsewz2mmyz9" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

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

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

上記の3つを行います。

## 料金

[Pricing](https://openai.com/pricing)のページをご覧ください。画像はその解像度で金額が変わりますのでご注意ください。

## 私の環境

OSは[macOS 14 Sonoma](https://www.apple.com/jp/macos/sonoma/)です。

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

```shell-session
$ python --version
Python 3.12.2
```

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

```shell-session
$ openai --version
openai 1.13.3
```

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

```shell-session
$ pip install openai
```

API Keyは[OpenAIのAPI keysのページ](https://platform.openai.com/api-keys)で発行済みで、**OPENAI\_API\_KEY**という環境変数名で保存してあるとします。

```shell-session
export OPENAI_API_KEY=ここに取得したAPI Keyを書く
```

## テキストのインプット

以下、テキストをインプットした時のコードです。パラメータについて詳しくは[API Reference](https://platform.openai.com/docs/api-reference/chat)をご覧ください。

```python
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アニメ化された作品の一つに『げんしけん』があります。『げんしけん』はオタク文化をテーマにしたストーリーで、多くの読者に親しまれました。アニメ化もされ、多くのファンを魅了しました。

バッチリです。

[げんしけん](https://pocket.shonenmagazine.com/episode/316112896949909110)は名作ですね。

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

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

まずはインターネット上に置かれた画像のURLで試します。[過去記事](https://qiita.com/nabata/items/de459e1fd3d6e5ce5239)で生成した以下の画像を用いることにしました。

![dalle-bread-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/6ecd51e1-1ec3-959c-542e-045a66633a63.png)

実装は以下です。API呼び出し時の引数として**image\_url**を追加しています。詳しくは公式の[実装ガイド](https://platform.openai.com/docs/guides/vision)をご参照ください。

```python
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)
```

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

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

これも完璧ですね。

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

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

以下の画像を用意してみました。[波よ聞いてくれ](https://afternoon.kodansha.co.jp/c/namiyokiitekure/)、大好きです。

![sample_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/32f20902-5da0-829e-1ad5-bfdd21d2da39.png)

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

実装は以下です。Base64エンコードをしています。[MIMEタイプ](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types)の指定もしています。今回は**image/png**です。

```python
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](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

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