AutoGenをガッツリ試してみる:グラフをプロットしてみる(google colab編)
概要
前回はAutoGenというマルチエージェントのフレームワークで、GUIでのグラフを表示する方法について述べた。独自Dockerを利用した上で、ウィンドウを表示できることを確認できた。ここまでの実験はDockerであったり、ローカルのPython環境を前提としたもので、環境を作るのが大変ということもあり、今回は誰でもすぐに使えるGoogle Colab環境を対象にしてグラフをプロットしてみよう。
AutoGenを利用してグラフのプロットをするとGUIが必要になるのに対して、今回の記事では、まずファイルを出力してから表示する方法について述べる。ただし、ファイルを出力すると2ステップの動作が必要となってしまうため手間である。またグラフを見ながら会話を続けるといったこともできない。そこで、会話の中でグラフを直接表示する方法についても続いて述べる。
Google Colab上でグラフを表示する
ファイルを利用した実行
まずは、前回まで実施してきた内容をGoogle Colabの中で実行していく。ColabなのでDockerは使わず、結果は一度ファイルに出力し、それを表示する。
まず最初にAutoGenをインストールする。よくあるミスとしては、パッケージ名はautogenではなくpyautogenだ。誤ったパッケージをインストールしてしまわないように気をつけよう。
!pip install pyautogen
次にAPI周りの設定をしよう。PC上で動かしていた時はファイルにキーを保存していたがColabではノートブックに直接貼り付ける方針としてみる。誤って外部に公開してしまわないよう気をつけよう。
config_list = [{'model': 'gpt-4', 'api_key': '<your OpenAI API key here>'}]
コード自体は前回の内容と同様で以下のようにしておく。
from autogen import AssistantAgent, UserProxyAgent, config_list_from_json
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding", "use_docker": False})
user_proxy.initiate_chat(assistant, message="NVIDIAとテスラの株式価格の年間の推移をプロットし、stock_price_ytd.pngというファイル名で保存してください")
Colabの場合、ローカル環境と異なりデフォルトでパッケージがインストールされていないこともあり、エラーを修正しながら進めていく。といっても、Enterを押すだけで自動でエラーを直してくれるぞ。以下はAutoGenの方で出力してくれているエラーと修正案だ。
>>>>>>>> USING AUTO REPLY...
>>>>>>>> EXECUTING CODE BLOCK 0 (inferred language is python)...
user_proxy (to assistant):
exitcode: 1 (execution failed)
Code output:
File "", line 1
!pip install pandas pandas_datareader matplotlib
^
SyntaxError: invalid syntax
--------------------------------------------------------------------------------
assistant (to user_proxy):
すみません、ターミナルコマンドの実行をPythonコードと混同してしまいました。以下のPythonコーディングブロックは、`os.system`コマンドを使用してパンダス、パンダスデータリーダー、マットプロットリブをインストールします。
```python
# filename: install_libraries.py
import os
# Check if Pandas is installed, if not, install it
try:
import pandas
except ImportError:
os.system('pip install pandas')
# Check if Pandas DataReader is installed, if not, install it
try:
import pandas_datareader
except ImportError:
os.system('pip install pandas_datareader')
# Check if Matplotlib is installed, if not, install it
try:
import matplotlib
except ImportError:
os.system('pip install matplotlib')
```
実行後、ライブラリをインストールするスクリプトを実行するために再度Pythonコーディングブロックを提供します。
```python
# filename: plot_stock_prices.py
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
from datetime import date
# Get today's date
today = date.today()
# Get the start of this year date
start_of_year = date(today.year, 1, 1)
# Get NVIDIA and TESLA stock data
nvidia = web.get_data_yahoo('NVDA', start=start_of_year, end=today)
tesla = web.get_data_yahoo('TSLA', start=start_of_year, end=today)
# Create plot with closing prices
plt.figure(figsize=(14, 8))
plt.plot(nvidia.index, nvidia['Close'], label='NVIDIA')
plt.plot(tesla.index, tesla['Close'], label='TESLA')
plt.title('NVIDIA vs TESLA Stock Price YTD')
plt.xlabel('Date')
plt.ylabel('Closing Price')
plt.legend(loc='upper left')
plt.grid(True)
# Save the plot as a file
plt.savefig('stock_price_ytd.png')
```
このような感じで修正案を出してくれていそうだ。面倒なのでno look enterで、進めていく。何度か修正した後に、以下のようにタスクが完了する。
.
.
.
.
[*********************100%%**********************] 1 of 1 completed
[*********************100%%**********************] 1 of 1 completed
--------------------------------------------------------------------------------
assistant (to user_proxy):
実行結果から、スクリプトは正常に実行され、必要なデータがダウンロードされたことがわかります。
また、出力にエラーメッセージが表示されておらず、`matplotlib`の`savefig`メソッドがエラーなく実行されたということは、株価のプロットが正常に生成されて`stock_price_ytd.png`という名前の画像ファイルとして保存されたといえます。
以上でタスクは完了です。TERMINATE
タスクが完了したらcoding/stock_price_ytd.pngにグラフが表示されたので、以下のように表示を行う。
from IPython.display import Image
Image(filename='coding/stock_price_ytd.png')
グラフを直接表示する方法
上記の手段は、2段階で(AutoGenでのファイル生成、Colab上での表示)表示する必要があった。2段階はイケてないし、本来はチャットの中でグラフを見ながら分析を頼んだりするフローが望ましい。そこで、会話の中に直接グラフを出力できるようにクラスを改造する。
具体的には以下のようにUserProxyAgentをオーバーライドしたクラスを作成する。generate_init_messageメソッドは、ユーザーからの指示文を処理するもので「作成したコードはIPython上で実行されるもの」という追加の指示を行っている。run_codeはコードを実行するメソッドで、IPython上でコードを実行し、それを表示しているようだ。
from typing import Dict, Union
from IPython import get_ipython
class IPythonUserProxyAgent(UserProxyAgent):
def __init__(self, name: str, **kwargs):
super().__init__(name, **kwargs)
self._ipython = get_ipython()
def generate_init_message(self, *args, **kwargs) -> Union[str, Dict]:
return super().generate_init_message(*args, **kwargs) + """
If you suggest code, the code will be executed in IPython."""
def run_code(self, code, **kwargs):
result = self._ipython.run_cell("%%capture --no-display cap\n" + code)
log = self._ipython.ev("cap.stdout")
log += self._ipython.ev("cap.stderr")
if result.result is not None:
log += str(result.result)
exitcode = 0 if result.success else 1
if result.error_before_exec is not None:
log += f"\n{result.error_before_exec}"
exitcode = 1
if result.error_in_exec is not None:
log += f"\n{result.error_in_exec}"
exitcode = 1
return exitcode, log, None
実行した結果は以下のようになる。途中の出力はこれまでと同じなので省略しつつ、グラフが会話内に埋め込まれている事が確認できる。このようにして、前の実験のように2段階で実行せずともグラフを会話中に埋め込むことができ、よりインタラクティブな作業が出来そうに思える。
終わりに
今回はGoogle Colabやnotebookを対象に、グラフを表示する方法を2つほど紹介した。特にColabは自分のPCに環境を用意する必要が無いので、簡易に利用できるというメリットが大きい。次回からはAutoGenのサンプルに含まれているコードについて紹介していく。
この記事が気に入ったらサポートをしてみませんか?