Closed4

ChatGPT Code Interpreterクローンを試す(Code Interpreter API編)

kun432kun432

インストール

すでに以下の記事で試されている。

https://zenn.dev/karaage0703/articles/04f585d1d46979

Code Interpreter API自体はUIを持たないようなので、StreamlitでUIを作成された方も。

https://github.com/mahm/codeinterpreter-streamlit

で、公式のレポジトリを見ると、どうやらStreamlitでシンプルなUIのコードが数日前に追加された模様。

https://github.com/shroominic/codeinterpreter-api/pull/26

あとこれをさらに改善するようなPRも来てる。

https://github.com/shroominic/codeinterpreter-api/pull/49

ということでこれをそのまま使って試してみることとする。Dockerfileとかは用意されていないようなので、devcontainerで試す。

一旦クローン

$ git clone https://github.com/shroominic/codeinterpreter-api

クローンしたディレクトリをVSCodeで開いてdevcontainerの設定ファイルを追加、そしてコンテナで開き直す。devcontainerはMS公式のPythonイメージで、poetryだけ追加した。

{
	"name": "Python 3",
	"image": "mcr.microsoft.com/devcontainers/python:1-3.11-bookworm",
	"features": {
		"ghcr.io/devcontainers-contrib/features/poetry:2": {}
	}
}

コンテナが立ち上がったらパッケージを追加して仮想環境を作ってもらう。

$ poetry install

OpenAIの環境変数を設定。VERBOSE=TrueにしておくとLangChainのログが出力される。

$ cp .env.example .env
OPENAI_API_KEY=XXXXXXXXXX
VERBOSE=True

ではまずサンプルコードを実行してみる。

$ poetry run python examples/analyze_dataset.py 

出力長いけど

> Entering new AgentExecutor chain...
⚙️ Running code: ```python
# First, let's load the dataset and take a look at it.
import pandas as pd

# Load the dataset
iris = pd.read_csv('iris.csv')

# Display the first few rows of the dataset
iris.head()
```

Invoking: `python` with `{'code': "# First, let's load the dataset and take a look at it.\nimport pandas as pd\n\n# Load the dataset\niris = pd.read_csv('iris.csv')\n\n# Display the first few rows of the dataset\niris.head()"}`


SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm      Species
0            5.1           3.5            1.4           0.2  Iris-setosa
1            4.9           3.0            1.4           0.2  Iris-setosa
2            4.7           3.2            1.3           0.2  Iris-setosa
3            4.6           3.1            1.5           0.2  Iris-setosa
4            5.0           3.6            1.4           0.2  Iris-setosa
⚙️ Running code: ```python
# Check the distribution of the different species in the dataset
iris['Species'].value_counts()
```

Invoking: `python` with `{'code': "# Check the distribution of the different species in the dataset\niris['Species'].value_counts()"}`
responded: {content}

Species
Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50
Name: count, dtype: int64
⚙️ Running code: ```python
import seaborn as sns
import matplotlib.pyplot as plt

# Plot pairwise relationships in the dataset
sns.pairplot(iris, hue='Species')

# Show the plot
plt.show()
```

Invoking: `python` with `{'code': "import seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Plot pairwise relationships in the dataset\nsns.pairplot(iris, hue='Species')\n\n# Show the plot\nplt.show()"}`
responded: {content}

Image image-d0b3f5a1-38a5-48a1-8719-72b2e27216f5.png got send to the user.The pairplot provides a detailed visual insight into the dataset. Here are some observations:

1. Iris-setosa seems to be separable from Iris-versicolor and Iris-virginica based on PetalLengthCm and PetalWidthCm.
2. Iris-versicolor and Iris-virginica are somewhat overlapping with each other.
3. SepalWidthCm and SepalLengthCm are not as useful for distinguishing between the species.

This kind of exploratory analysis is very useful when we want to build a predictive model later, as it helps us understand which features are most informative.

> Finished chain.
AI:  The pairplot provides a detailed visual insight into the dataset. Here are some observations:

1. Iris-setosa seems to be separable from Iris-versicolor and Iris-virginica based on PetalLengthCm and PetalWidthCm.
2. Iris-versicolor and Iris-virginica are somewhat overlapping with each other.
3. SepalWidthCm and SepalLengthCm are not as useful for distinguishing between the species.

This kind of exploratory analysis is very useful when we want to build a predictive model later, as it helps us understand which features are most informative.
<PIL.Image.Image image mode=RGB size=1137x986 at 0x7F72282AE810>

コマンドラインなので画像等が見えないけどもまあなんとなく動いてる模様。でディレクトリの中を見ると、.codeboxというディレクトリが作成されていてiris.csvが保存されていた。多分、流れの中で取得されたのだと思う。

ではUI経由でアクセスしてみる。

$ poetry run streamlit run frontend/app.py

VSCodeだと自動的にブラウザが立ち上がってくると思う。こんな感じ。

で先ほどのサンプルコードと同じことをしてみる。

結果

現状はチャット的な感じにはなっていないようなので、ここまでしかできないけどもUIが改善されれば使いやすくなるのではないかと思う。

で実行環境のことが気になったので試してみた。

実行時のログ

> Entering new AgentExecutor chain...
⚙️ Running code: ```python
!pip install gtts
```

Invoking: `python` with `{'code': '!pip install gtts'}`


Collecting gtts
Downloading gTTS-2.3.2-py3-none-any.whl (28 kB)
Installing collected packages: gtts
Successfully installed gtts-2.3.2
⚙️ Running code: ```python
from gtts import gTTS
import os

text = "明日はいいお天気ですね。"
tts = gTTS(text, lang='ja')
tts.save("output.mp3")

os.listdir()
```

Invoking: `python` with `{'code': 'from gtts import gTTS\nimport os\n\ntext = "明日はいいお天気ですね。"\ntts = gTTS(text, lang=\'ja\')\ntts.save("output.mp3")\n\nos.listdir()'}`


['output.mp3', 'iris.csv']
ファイル「output.mp3」が生成されました。

> Finished chain.

ローカル環境を見てみたらインストールされていた。どうやらCodeBoxのAPIキーが設定されていなければローカルインストールになるっぽい。

 $ poetry run pip freeze | grep -i gtts
gTTS==2.3.2

改めてレポジトリのREADMEを見てみたけど、

  • Run everything local except the OpenAI API (OpenOrca or others maybe soon)
  • Use CodeBox API for easy scaling in production (coming soon)

なるほど、であればまあ安心して手元で使えそう。あとはこんなログもでてた。

INFO: Using a LocalBox which is not isolated.
      This is only for testing and development.
      Make sure to put an API-Key in production.

dockerなりvenvなり使って仮想環境内で動かすようにしておけば環境汚さなくて済むかなと思う。

ちなみに、上記で生成された結果、画面からダウンロードしたアーカイブはなぜか空になっていたのだけど、.codeboxディレクトリの中に残っていて、ちゃんと再生可能だった。

kun432kun432

所感

実行環境が気になっていたのだけど、そこはクリアできてるかなと思う。Code Interpreterがすごいのは、Agent的な動き+独立した実行環境の2つをサービスとして提供してくれてるところだと思うので、その一旦だけでも手元でできるというのはとても素晴らしい。

あとは、

  • 実行中の処理の過程をもっと見たい。LangChainのverbose=True的なやつがUIでも見えれば。
  • チャット的にコンテキストが維持されると良いけども、んー、16k/32kとかが必要なのかなぁ
  • 多分コンテナ自体が汚れていくと思うので、コンテナを廃棄して作り直す仕組みがあれば最高。

って感じ。まあStreamlitなので自分で実装するのも楽しそう。

あぁ、あと現状はAzureには対応していないということを忘れていた。コード見る限り、Function callingを使ってるようだったので、つい最近までAzureでは非対応だったので致し方ない面もあるかな。

LangChainだしとりあえず直接書き換えれるかなー?とか思って軽くコード見てみたけど、結構変更範囲多そう。

このスクラップは2023/07/28にクローズされました