ChatGPT Code Interpreterクローンを試す(Code Interpreter API編)
経緯はここ。他のChatGPT/Code Interpreterクローンなども。
Code Interpreter API
- LangChainで書かれている
- 実行環境はCodeBoxというCode Interpreter APIの作者によるクラウドで提供される?
- Azureには非対応のように思える。
ちょっと気になるのは、実行環境が別のところにあるというところ。とりあえずやってみる。
インストール
すでに以下の記事で試されている。
Code Interpreter API自体はUIを持たないようなので、StreamlitでUIを作成された方も。
で、公式のレポジトリを見ると、どうやらStreamlitでシンプルなUIのコードが数日前に追加された模様。
あとこれをさらに改善するようなPRも来てる。
ということでこれをそのまま使って試してみることとする。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ディレクトリの中に残っていて、ちゃんと再生可能だった。
所感
実行環境が気になっていたのだけど、そこはクリアできてるかなと思う。Code Interpreterがすごいのは、Agent的な動き+独立した実行環境の2つをサービスとして提供してくれてるところだと思うので、その一旦だけでも手元でできるというのはとても素晴らしい。
あとは、
- 実行中の処理の過程をもっと見たい。LangChainのverbose=True的なやつがUIでも見えれば。
- チャット的にコンテキストが維持されると良いけども、んー、16k/32kとかが必要なのかなぁ
- 多分コンテナ自体が汚れていくと思うので、コンテナを廃棄して作り直す仕組みがあれば最高。
って感じ。まあStreamlitなので自分で実装するのも楽しそう。
あぁ、あと現状はAzureには対応していないということを忘れていた。コード見る限り、Function callingを使ってるようだったので、つい最近までAzureでは非対応だったので致し方ない面もあるかな。
LangChainだしとりあえず直接書き換えれるかなー?とか思って軽くコード見てみたけど、結構変更範囲多そう。