見出し画像

GPT-4VのAPIをサクッと使ってみる!

概要

昨日発表されたGPT-4VのAPI(画像に対して質問を投げることができるAPI)を早速利用してみたので、サクッと使ってみようと思う。

使い方

当然ながら、現時点ではLangChainなどのライブラリからは利用できないし、Pythonのライブラリもなさそう(→ありました)。ここに使い方が乗っているので、そのまま使ってみる。ローカルのイメージをbase64エンコードして送る感じらしい。

やってみる

今回は、インターネットで検索して出てきた画像に対して、簡単な質問をしてみよう。今後いろんな論文をサクッと実装していきたいと思うのだけど、まずは手始めに早稲田大学の講義のページを使わせてもらいます。制約条件付き最適化の問題を解かせてみようと思います。

https://www.f.waseda.jp/ksuga/2007chap17.pdfより
import base64
import requests

api_key = "<ここにAPI KEY>"

# Function to encode the image
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

# Path to your image
image_path = "optimize.jpg"

# Getting the base64 string
base64_image = encode_image(image_path)

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {api_key}"
}

payload = {
    "model": "gpt-4-vision-preview",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "画像の数式の応用例を一つ挙げ、何らかの適当な数値を設定し、それを解くためのプログラムを作成してください"
          },
          {
            "type": "image_url",
            "image_url": {
              "url": f"data:image/jpeg;base64,{base64_image}"
            }
          }
        ]
      }
    ],
    "max_tokens": 4000
}

response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
output = response.json()

print(output["choices"][0]["message"]["content"])

結果

以下のような結果になりました。ぱっと見ちゃんと中身を読んでくれていそうですね。

画像には複数の最適化問題が記載されています。応用例として、以下に線形計画問題(Linear Programming)の解法を示します。線形計画問題は、制約条件の下で線形関数を最適化する問題です。

例題:
最小化したい目的関数: \( f(x) = 3x_1 + 4x_2 \)
制約条件: \( p_1x_1 + p_2x_2 = 1 \)
ここで、 \( p_1 = 2 \), \( p_2 = 3 \), \( I = 12 \)
追加の制約条件: \( x_1, x_2 \geq 0 \)

この問題をPythonを使って解いてみましょう。Pythonには線形計画問題を解決するためのライブラリ`scipy`があり、ここではそれを利用します。

```python
from scipy.optimize import linprog

# 目的関数の係数 (ここでは最小化問題なので、係数はそのままにします)
c = [3, 4]

# 制約条件の係数 (左辺の各項の係数)
A = [[2, 3]]

# 制約条件の定数項 (右辺の値)
b = [12]

# 変数の非負の制約
x0_bounds = (0, None)
x1_bounds = (0, None)

# 線形計画問題を解く
result = linprog(c, A_eq=A, b_eq=b, bounds=[x0_bounds, x1_bounds], method='highs')

print(result)
```

このプログラムは目的関数\( f(x) = 3x_1 + 4x_2 \)を最小化する変数\( x_1, x_2 \)の値を見つけるもので、追加の制約条件\( 2x_1 + 3x_2 = 12 \)と\( x_1, x_2 \geq 0 \)を考慮しています。`result`には最適化結果が含まれ、`result.x`には\( x_1, x_2 \)の最適な値が、`result.fun`には目的関数の最小値が格納されます。

プログラムを実行すると、最適な\( x_1, x_2 \)の値と目的関数の最小値を得られます。この結果をもとに、線形計画問題の最適解を求めることができます。

プログラムも実行させてみると以下のようになった。なんか動いていそう。素晴らしい!

message: Optimization terminated successfully. (HiGHS Status 7: Optimal)
        success: True
         status: 0
            fun: 16.0
              x: [ 0.000e+00  4.000e+00]
            nit: 0
          lower:  residual: [ 0.000e+00  4.000e+00]
                 marginals: [ 3.333e-01  0.000e+00]
          upper:  residual: [       inf        inf]
                 marginals: [ 0.000e+00  0.000e+00]
          eqlin:  residual: [ 0.000e+00]
                 marginals: [ 1.333e+00]
        ineqlin:  residual: []
                 marginals: []
 mip_node_count: 0
 mip_dual_bound: 0.0
        mip_gap: 0.0

おわりに

とにかく凄いの一言に尽きる・・・。もう俺、仕事しないでいいんじゃないか・・・?

この記事が気に入ったらサポートをしてみませんか?