見出し画像

AutoGenをガッツリ試してみる:GPT-4Vを利用してみよう

概要

画像を読み込むフローもAgentで使いたいよねってことで、GPT-4Vを使ってみた。とりあえず画像を説明させてみましょう。ちなみに、以前の記事で画像を説明してコードを出力をするというのをやってみたことがあります。あの時は、コードを出力するところまでがゴールで、その先の実行は手元の環境で実行する必要があった。Agentを使うとコードの実行も出来るので、今回はそこまでやってみましょう。

使い方

GPT-4Vを利用するエージェントのクラスはAutoGenのパッケージには含まれていないようで、以下のようにインストールが必要とのこと

pip install "pyautogen[lmm]~=0.2.0"

まずは、GPT-4Vに関連するクラスを生成してみましょう。以下のようにMultimodalConversableAgentというクラスを利用します。クラスの中では、プロンプトの中から画像に関する情報(<img https://~~~>)をパースする仕組みが入っています。

from autogen.agentchat.contrib.multimodal_conversable_agent import MultimodalConversableAgent

gpt4v_config_list = [
    {
        "model": "gpt-4-vision-preview",
        "api_key": "<API Key>",
    }
]

agent = MultimodalConversableAgent(
    name="explainer",
    max_consecutive_auto_reply=10,
    llm_config={"config_list": gpt4v_config_list, "max_tokens": 3000}
)

UserProxyAgentはこれまで通りです。

import autogen

config_list = [
    {
        "model": "gpt-4-1106-preview",
        "api_key": "<API Key>",
    }
]

user_proxy = autogen.UserProxyAgent(
    name="User_proxy",
    system_message="A human admin.",
    code_execution_config={
        "last_n_messages": 3,
        "work_dir": "gpt4v"
    },
    human_input_mode="ALWAYS", # Try between ALWAYS or NEVER
    max_consecutive_auto_reply=10
)

さて、とりあえず何かを聞いてみましょう。公式のnotebookにあるように画像のURLでも入れてみましょう。先ほど書いたように<img https://~~~>というタグをプロンプトに埋め込みます。

この犬の画像のURLを入力
user_proxy.initiate_chat(agent, 
                         message="""画像に写っている犬の犬種を教えて。
<img https://th.bing.com/th/id/R.422068ce8af4e15b0634fe2540adea7a?rik=y4OcXBE%2fqutDOw&pid=ImgRaw&r=0>.""")

すると以下のような結果が返ってきました。ちゃんと教えてくれました。

画像に写っている犬は、そのもじゃもじゃの毛と特徴的な顔立ちから見て、ラブラドゥードル
(Labradoodle)という犬種である可能性が高いです。ラブラドゥードルはラブラドール・レトリバーと
プードルを交配して生まれたデザイナーズドッグで、非常に人懐っこく、抜け毛が少なく、
アレルギーフレンドリーな性質を持っていることで知られています。

ちなみにURLを使わずローカルのファイルを使いたい場合は以下のようにbase64でエンコードしてやります。

import base64

# 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)

user_proxy.initiate_chat(agent, 
                         message=f"""画像に写っている犬の犬種を教えて。
<img data:image/jpeg;base64,{base64_image}>""")

コードの実行までやらせてみる

ここまで作れば、あとはクエリを変えるだけです。今回も以前の記事の画像をつかってみましょう。

制約条件付き最適化
user_proxy.initiate_chat(agent,
                         message=f"""
画像の数式の応用例を一つ挙げ、何らかの適当な数値を設定したプログラムを作成し、
それを実行してください。
<img data:image/jpeg;base64,{base64_image}>""")

実行結果は以下のようになり、まずはソースコードが生成され、最後に入力を促されます。そのままEnterキーで処理を続けてもらいます。

画像には最適化問題に関する数式が記載されています。最適化問題は、与えられた制約条件のもとで特定の関数の最大値または最小値を見つけ出す問題です。画像には次のような数式があります:

制約式:\( g(x) = k \)
目的関数の最大化:\( \max f(x) \)
目的関数の最小化:\( \min f(x) \)
予算制約条件:\( p_1x_1 + p_2x_2 + \cdots + p_nx_n = I \)
生産関数の制約条件:\( q = f(x_1, x_2, \dots, x_n) \)
市場平衡の条件:\( f(x_1, x_2, \dots, x_n) - q = 0 \)

私は直接プログラムを実行することはできませんが、具体的な問題として線形計画問題を想定してPython言語で解くためのプログラム例を示し、あなたがそれをローカル環境で実行し結果を得られるように指示できます。問題として
、ある製品の製造に関する費用を最小化しつつ、特定の製品量を生産するという線形計画問題を考えてください。

```python
from scipy.optimize import linprog

# コストベクトル
c = [20, 50]  # 各製品の生産費用

# 不等式の左辺係数 (A_ub * x <= b_ub)
A_ub = [[-1, 0], [0, -1]]  # 各製品の生産量の下限

# 不等式の右辺
b_ub = [-10, -10]  # 各製品について最低10単位は生産する

# 等式の左辺係数 (A_eq * x = b_eq)
A_eq = [[1, 1]]   # 各製品の合計生産量

# 等式の右辺
b_eq = [30]  # 合計で30単位の製品を生産する

# 各変数の下限と上限を指定(今回は特に上限はない)
x0_bounds = (10, None)  # 製品1は最低10単位
x1_bounds = (10, None)  # 製品2は最低10単位

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

if result.success:
    # 最適解を出力
    print("最適な生産量:", result.x)
    print("最小コスト:", result.fun)
else:
    print("問題を解くことができませんでした。")
```

このコードでは、SciPy の `linprog` 関数を利用して線形計画問題を解いています。`linprog`関数は、問題の目的関数、制約条件、変数の範囲をもとに最適化問題を解きます。この例では、2種類の製品に関する製造コストの最小
化を目的としています。各製品は最低10単位を生産し、合計で30単位を生産しなければならないという制約条件があります。

上記コードをPythonがインストールされた環境で実行することで、最適な生産量とその時の最小コストが計算されます。もし実行に問題がありエラーが発生する場合は、SciPyライブラリがインストールされていることを確認してく
ださい。また、`highs`メソッドはSciPyバージョン1.6.0以降で利用可能です。

--------------------------------------------------------------------------------
Provide feedback to explainer. Press enter to skip and use auto-reply, or type 'exit' to end the conversation:

続いて、コードをそのまま実行してもらい、以下のような結果が返されました。UserProxyAgentがコードを実行して前半の結果を出力し、その結果をアシスタント側が読み込み、実行結果の解説も付け加えてくれています。

User_proxy (to explainer):

exitcode: 0 (execution succeeded)
Code output:
最適な生産量: [20. 10.]
最小コスト: 900.0


--------------------------------------------------------------------------------

>>>>>>>> USING AUTO REPLY...
explainer (to User_proxy):

実行結果によると、プログラムは成功裏に実行され、最適な生産量と最小コストが計算されました。

最適な生産量: [20, 10]
最小コスト: 900.0

これは、与えられた制約条件(合計生産量が30単位で、各製品の生産量は最低10単位)のもとで、
製品1を20単位、製品2を10単位生産することが最小コスト(900)で可能であるということを意味します。
製品の生産費用は製品1が1単位あたり20、製品2が1単位あたり50と設定されていたため、
費用効率の良い製品1を多く生産する結果となっています。

前回とは異なりAgentでプログラムの実行までやってくれることを確認できました。

おわりに

まずはGPT-4VとAgentの機能により、画像からプログラムの作成、実行までを一括で行うというのができました。次回はもう少し複雑な処理にもチャレンジしてみようかと思います。

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