見出し画像

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段階で実行せずともグラフを会話中に埋め込むことができ、よりインタラクティブな作業が出来そうに思える。

Colabの会話中に埋め込まれたグラフ

終わりに

今回はGoogle Colabやnotebookを対象に、グラフを表示する方法を2つほど紹介した。特にColabは自分のPCに環境を用意する必要が無いので、簡易に利用できるというメリットが大きい。次回からはAutoGenのサンプルに含まれているコードについて紹介していく。

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