👻

AutoGenを使ってFunction CallingによるRustソースのビルドを試してみた

に公開

はじめに

ソースコードの修正やビルドを、AIにまるっと任せられないか?

という思い付きがきっかけでAutoGenを触ってみた結果、RustソースコードをDockerコンテナ内でビルドさせる簡易的なAIエージェントらしきものを作るところまで辿り着いたので、それまでに感じたあれこれを書いていこうと思います。

最終的にできたものはこちらです。
https://github.com/seto1221/autogen_test

きっかけ

冒頭のとおりきっかけは思い付きなんですが、これを実現するのに使える何かはどこかにありそうだなと思って、まずはChatGPTにどうすれば良いか聞いてみました。

すると、AIエージェントを使うのが現実的という回答でした。

AIエージェントについては、存在は知っていたものの全く触っていなかったので、この機会に触ってみようと思って試してみたという流れです。

AutoGen を使うことにした理由

次に、世の中にどんなAIエージェントがあるかわからなかったので、そのあたりから調べてみました。

そうしたらいろいろ出てきたわけですが、ググったりChatGPTに比較させたりして今回はAutoGenを使うことにしました。

簡単な理由は以下のように感じたからです。

  • 試しやすそう
  • 作業者としてAIを使うような場合に向いてそう

浅いなりにいろいろ調べたので、また別途まとめるかもです。

実装時のあれこれ

そんなわけでAutoGenを使ったエージェントの実装を始めました。

まずは手っ取り早く進めようとChatGPTが作ったサンプルコードを動かしてみましたが、さすがにすんなりとはいきませんでした。

autogen-agentchat等が必要なのにpyautogenしかインストールしてなかったり、autogen-agentchat等は安定板の7.5なのにpyautogenだけ10.0になってたりといろいろ混乱しつつも少しずつそれらを潰していって、何とか動く状態にしていきました。

ちなみにバージョン周りの問題は公式ドキュメントの手順であればぶつからなかったみたいなので、やっぱりドキュメントは大事だなと思いつつも、ドキュメント見てからやろうとしてたらここまで進んでないよなとも思うので、なんともかんともな感じです。

できたものの概要

できたものの概要を記載します。

ファイル / ディレクトリ 役割 補足
Dockerfile RustプロジェクトをビルドするDockerコンテナの設定ファイル コンテナを起動すると/work配下でcargo buildを実行する。起動時に/workにプロジェクトをマウントする必要がある。
Makefile.toml cargo-make用の設定ファイル エージェントを動かすまでに必要なコマンドを実行するタスクを登録している。コマンドを覚えておく必要をなくすために作成した。必須ではない。
build_runner_client.py 標準入出力を使った外部ツール実行クライアント エージェントがツール実行要求を外部ツール実行サーバに伝えるために使う。サーバとは標準入出力経由でやり取りする。
build_runner_server.py 標準入出力を使った外部ツール実行サーバ エージェント起動時に併せて起動される。AIからビルド要求を受けたエージェントからコールされる。コールされるとDockerコンテナを実行する。
fake_llm_server.py AIによるビルド要求を再現する疑似LLMサーバ エージェントから渡されたプロンプトは無視してビルド要求を返す。LLMサーバの差し替え方法を確認しつつエージェント実行を気軽に試すために作成した。
main.py 本体 エージェントの設定と起動を行う。AIモデルやプロンプト、ツールなどを設定している。
proj ビルド対象のRustプロジェクト 単なるhelloworldコマンド。
tools.py エージェントが使用する外部ツール呼び出し関数 外部ツール実行クライアント経由で外部ツール実行サーバに要求を送る。読み込み時にサーバの起動も実行する。

実行方法

以下はWindows PowerShellの例です。
GitHubのREADME.mdにLinuxシェルでの実行例も記載しています。

リポジトリ取得

git clone https://github.com/seto1221/autogen_test
cd autogen_test

以下では C:\work\autogen_test にclone済みとします。

事前準備 (Dockerイメージ作成、Python環境設定)

docker build -t build .
python -m venv .venv
.\.venv\Scripts\activate
pip install --upgrade pip
pip install uvicorn fastapi autogen-agentchat autogen-ext[openai]

疑似 LLM サーバ起動

$proc = Start-Process -PassThru 'uvicorn' 'fake_llm_server:app','--port','8000'

エージェント実行

$env:LOGDIR="C:\work\autogen_test\log"
$env:PROJDIR="C:\work\autogen_test\proj"
python main.py

後片付け

$proc | Stop-Process
deactivate
Remove-Item -Recurse $env:LOGDIR
Remove-Item -Recurse .\__pycache__
Remove-Item -Recurse .\.venv
docker run --rm -t -v "${env:PROJDIR}:/work" build clean
docker rmi build

実行結果

実行するとエージェントから受け取った結果オブジェクトに含まれるメッセージ一覧を出力します。

試しにビルドを実行してください。
[FunctionCall(id='call_1', arguments='{}', name='run_build')]
[FunctionExecutionResult(content="{'build_id': '8572717b-c7d0-4671-9061-59c57e747638'}", name='run_build', call_id='call_1', is_error=False)]
{'build_id': '8572717b-c7d0-4671-9061-59c57e747638'}

各メッセージの詳細は確認できていないですが、内容から推測すると以下のような意味合いだと思います。

  • 1行目 : エージェントへの入力タスク
  • 2行目 : ツール実行要求
  • 3行目 : ツール実行結果
  • 4行目 : エージェントからの応答

まとめ

最初の思い付きからAutoGenでAIエージェントらしきものを作成した間に感じたことを書いてみました。
良くわからないところからでしたが、あれこれ触れて動くものもできたので良かったかなと思います。

最初の思い付きを実現するにはソースの修正等もやってもらう必要がありますが、その辺もファイルアクセス用の外部ツールを実装すればできそうかなと思ったので、そのうちやってみようと思います。

Discussion