見出し画像

AutoGenをガッツリ試してみる:FizzBuzzをやってみる

AutoGenとは

後述するAgent同士が相互に会話をしてタスクを解決できるようにするためのフレームワーク。人間が介在できるようにしたり、ツールを組み合わせたりと柔軟性があるのが特徴。

Agentとは、自身が次に何をすべきかを決定し、それに基づいて行動を起こす仕組み。ゲームAIもAgentの一種で、将棋の盤面を観測して次の一手を考えて打つことをしている。強化学習の分野において、古くからその動作を学習するアプローチが行われていた。最近は、LLMの汎用性を活かして、学習を行わずとも次の一手を考えさせられるようになってきており、AutoGPTやCode InterpreterといったAgentを用いた仕組みが作られている。また、Agentの仕組み自体はLangChainを始めとしてたOSSにも既に組み込まれている。但し、LLMのAgentでは動作方針をプロンプトを通じて与えるものの、LLMの性能やプロンプトで与えられる情報の限界のため、あまり複雑な作業を行うことは難しかった。

そこで、複数のAgentを連携させることで、単一のAgentと比較して難しい作業を行うことができると期待できる。そういったマルチエージェントの仕組みとして、例えば、CAMELやChatDEVなどの仕組みが挙げられる。OSSにおいてもこういった仕組み自体は存在はしていたものの、自身で構築するにはハードルが高かった。AutoGenは、そのようなマルチエージェントの仕組みを作るフレームワークとのことで色々と試していこうと思う。

AutoGenにおけるエージェントの構成例

FizzBuzzをやってみよう

今日は第一回目なので、FizzBuzzという一番シンプルな問題を解くコードを作って実行させ、簡単な修正をしてもらうまでの手順を試してみよう。ちなみにFizzBuzzとは、3で割り切れればFizz、5で割り切れればBuzz、両方で割り切れればFizzBuzzと出力するというものだ。

実行環境

Agentが作成したコードを実行する環境として、Colab、Docker内での実行、また素の環境下での実行など、様々な環境下で実行できるようだ。今回の記事ではFizzBuzzというシンプルなものを対象とするので、素の環境下で動かしていくこととする。より複雑なコードを生成・実行する際には、ライブラリを実行環境内にインストールする必要が出てくるが、環境が汚れてしまうのは辛いので、実行環境としてはColabとDockerが望ましい。特にDockerを使う場合は、事前にライブラリをインストールしたイメージを作っておけるので便利だった。このあたりも次回以降で試していこう。なお、次回以降の記事で試すがmatplotlibのようなグラフを表示する場合は素の環境である必要がありそう。

インストール

インストールは以下でできるみたい。

pip install pyautogen

初期設定

最初にOpenAI APIキーなどを設定する必要がある。autogenのルートディレクトリにあるOAI_CONFIG_LIST_sampleを参考にOAI_CONFIG_LISTを作る。ここではgpt-4のみを利用することとする。このファイルを後に実行するスクリプトと同じディレクトリに入れておこう。

[
    {
        "model": "gpt-4",
        "api_key": "<your OpenAI API key here>"
    }
]

FizzBuzzを動かしてみる

まずは、以下のコードを動かしてみよう。use_dockerをFalseにすると自分の素のpython環境での実行となる。

from autogen import AssistantAgent, UserProxyAgent, config_list_from_json

code_execution_config = {
    "work_dir": "coding",
    "use_docker": False
}
config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST")
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config=code_execution_config)

message = "FizzBuzzのコードを作成して実行してください。"
user_proxy.initiate_chat(assistant, message=message)

実行結果は以下になるはずだ。FizzBuzzのコードが作成されていそうな事が確認できる。

user_proxy (to assistant):

FizzBuzzのコードを作成して実行してください。

--------------------------------------------------------------------------------
assistant (to user_proxy):

Pythonを使ってFizzBuzzのコードを作成します。ルールは次の通りです:
- 1から100までの数を印刷する
- 数字が3の倍数の場合は "Fizz"と印刷する
- 数字が5の倍数の場合は "Buzz"と印刷する
- 数字が35の両方の倍数の場合は "FizzBuzz"と印刷する

次のPythonコードを実行してください。

```python
for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)
```

ここで、以下のように入力を求められる。100までだと長過ぎるので、プログラムを修正してもらうことにした。

Provide feedback to assistant. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: 数値の範囲は1から30にしてください。

Enterを押すとコードが実行されて結果を見ることができる。

user_proxy (to assistant):

数値の範囲は1から30にしてください。

--------------------------------------------------------------------------------
assistant (to user_proxy):

ユーザーの要求に応じて数値の範囲を1から30までに変更します。以下のPythonコードを実行してください。

```python
for i in range(1, 31):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)
```

今度は良さそうなので、そのまま何も入れずにenterを押して実行してもらう。

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

実行結果は以下のようになるはずだ。

>>>>>>>> NO HUMAN INPUT RECEIVED.

>>>>>>>> USING AUTO REPLY...

>>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...
user_proxy (to assistant):

exitcode: 0 (execution succeeded)
Code output:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz


--------------------------------------------------------------------------------
assistant (to user_proxy):

この出力結果はFizzBuzzの問題を処理するPythonコードの予想される出力と一致しています。

ルールに基づいて、1から30までの範囲内で3の倍数は "Fizz"5の倍数は "Buzz"、そして同時に35の倍数(1530)は "FizzBuzz"とプリントされています。

これですべてのタスクが完了したと判断します。TERMINATE

トラブルシューティング

ここは必要に応じて追記予定。ひとまずは、pythonでなくpython3/pip3を使っている場合は、python/pipで動くようにしておこう。あとはDockerモードで動かした場合に、dockerデーモンを起動していなかったり、ベースモデル(python:3-alpine)に何にも入ってなかったりなどがあった。

コードの解説

ここからはコードの解説をする。まずはimport関連、ここでは、以下の3つを利用するが、詳細は後ほど。

from autogen import AssistantAgent, UserProxyAgent, config_list_from_json

最初にAssistantAgentを作成する。AssistantAgentとは、LLMを実行するモジュールであり、FizzBuzzにおいてはソースコードを作成するモジュールとなる。configとして、利用するAPIやそのキーを入力する。

config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST")
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})

次は、UserProxyAgentを作成する。これは、人との対話を行ったり、ソースコードを実行したりするモジュールである。code_execution_configで実行環境などを設定する。

code_execution_config = {
    "work_dir": "coding",
    "use_docker": False
}
user_proxy = UserProxyAgent(
    "user_proxy",
    code_execution_config=code_execution_config
)

最後に、指示を与えてコードを実行させてみる。すると後は自動で実行をしてくれるようだ。

message = "FizzBuzzのコードを作成して実行してください。"
user_proxy.initiate_chat(assistant, message=message)

終わりに

とりあえずは一通り簡単なコードを実行させるところまでは出来た。次はもう少し難しいコードの実行や、コード以外のエージェントの利用、AutoGenの中身などについて調査・解説をしていく。


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