メインコンテンツへスキップ
見出し画像

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

    おわりに

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

    あなたへのおすすめ