
GPT-4VのAPIをサクッと使ってみる!
概要
昨日発表されたGPT-4VのAPI(画像に対して質問を投げることができるAPI)を早速利用してみたので、サクッと使ってみようと思う。
使い方
当然ながら、現時点ではLangChainなどのライブラリからは利用できないし、Pythonのライブラリもなさそう(→ありました)。ここに使い方が乗っているので、そのまま使ってみる。ローカルのイメージをbase64エンコードして送る感じらしい。
やってみる
今回は、インターネットで検索して出てきた画像に対して、簡単な質問をしてみよう。今後いろんな論文をサクッと実装していきたいと思うのだけど、まずは手始めに早稲田大学の講義のページを使わせてもらいます。制約条件付き最適化の問題を解かせてみようと思います。

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
おわりに
とにかく凄いの一言に尽きる・・・。もう俺、仕事しないでいいんじゃないか・・・?