はじめに
Open Interpreter をしばらく触ってみたので、 Open Interpreter とは何なのか、導入や使用時の Tips についてまとめてみます。
この記事内での Open Interpreter のバージョンは、特に断りがなければ v0.1.16 について言及しているものとします。v0.2.0で破壊的変更が加わったため、一部説明が最新版とは異なる場合があります。
Open Interpreter とは
Open Interpreterは自然言語による対話を通じてローカル環境でコード実行ができるオープンソースのツールです。
ChatGPTのAdvanced Data Analysis (ADA; 旧Code Interpreter)は処理できるファイルの種類やアップロードできるファイルのサイズなどに制限がありますが、Open Interpreterはローカルでコードを実行できこれらの制限を受けないため1話題になりました。
競合選択肢
OpenAI Assistants API
2023年11月のOpenAI DevDayで発表されたAPI2で、内部でCode Interpreterが使えます。2024年1月現在はBeta版です。
ファイルサイズなどAdvanced Data Analysisと同様の制限があるようですが、それらが問題にならず、Advanced Data Analysisと同様のことをAPIから行いたいならば、こちらが選択肢になりそうです。
Azure OpenAI Serviceの方ですが、2023年11月のMSのブログでAssistants APIの状況についてComing Soonと記されていますが3、それ以降の情報は見当たらず2024年1月現在は公開されていないようです。
Code Interpreter API
LangChain を用いた Code Interpreter のAPI実装です。コードの実行環境は同じ作者が開発中の CodeBox というサービス上で動かすようになっているようです。
ただし CodeBox の API key を環境変数に設定しなければ、コード実行はローカルのサンドボックスで行われるようです4。ローカル実行する場合のサンドボックスの実体は Jupyter Kernel のようです5。
ライセンス
Open Interpreter のソフトウェアライセンスは v0.1.16 までは MIT でしたが v0.1.17 から AGPL に変更されたようです6 7。
ライセンスがAGPLであるソフトウェアはライブラリとして直接リンクして第3者に提供すると、コピーレフトが適用されリンクしたアプリケーションコードの開示義務も発生するようなので、サービスに組み込む場合は注意が必要そうです。
Open Interpreter の仕組み
以下の記事が詳しいです。
Open Interpreterはユーザーの指示からプロンプトを作成し、プロンプトをもとにLLMにコードを生成させます。
生成したコードをローカルで実行し、その結果をもとに、エラーを修正する、次のサブタスクを処理するなどしながら与えられたタスクを処理します。
画像出典: https://tech.every.tv/entry/2023/10/11/152257
Open Interpreterのデフォルトシステムプロンプトの1行目は以下のようになっており8、指示に対しコード実行によってタスクを完了する、プログラマー的役割を担うものとしてデザインされています。
You are Open Interpreter, a world-class programmer that can complete any goal by executing code.
LLMに自然言語処理的タスクをさせたい場合など、コード実行を期待しない場合はミスマッチとなりそうです。
Open Interpreter の導入
動作環境の用意
Open Interpreter 自体は pip コマンド一発で入ります。
ただしOpen Interpreterが生成するコードはローカルで実行されるので、VMやdockerなど壊れても問題ない環境を用意しておいた方が無難です。
モデルの選択肢
私は Azure OpenAI Service の GPT-4 を使いました。
Azure OpenAI以外にも以下のページに記載があるモデルを使用可能のようです。
またOpen Interpreter は LLM のAPI呼び出しに LiteLLM を使用しているので、 LiteLLM が対応しているプロバイダーであれば上記ページに記載がないモデルでも使用できそうです。
ローカルLLMも使用可能で、 OpenAI API 互換のエンドポイントであり、Open Interpreter側でもエンドポイントを指定しているだけなので9、LM Studioに限定されているわけではありません。
UI の選択肢
Open Interpreter は terminal インターフェースと python インターフェースを有しています。
Jupyter
python インターフェースが Jupyterでの表示に対応していたので、私は主にJupyter Labで使っていました。
会話履歴がNotebook上にそのまま残ってくれることを期待しましたが、Notebookを開きなおすと表示が消えます10。
またmatplotlibで作成したグラフも画面には表示されないので、ファイルとして保存してから確認する必要があります。
Feature Requestのissueは立っているので11、もしかしたらそのうち改善されるかもしれません。
OpenInterpreterUI
StreamlitによるサードパーティーのUI実装です。2023年10月のOpen Interpreter Hackathon12で作られたもので、あまり活発には開発されていなさそうです。
操作Tips
コード実行時の確認をスキップする
デフォルトではコードを実行する度に確認が求められますが、面倒なので確認なしで実行できるようにします。ただし無限ループに入るなどしてLLMにリクエストし続け、多額の請求が来たら困るので、バジェットを設定しておきます。
import interpreter
agent = interpreter.Interpreter()
agent.max_budget = 1
agent.auto_run = True
指示をやりなおす
%undo
を入力すると直近のユーザープロンプトを会話履歴から削除できるので、指示をやり直したいときなどに使えます。
agent.chat("%undo")
頭に %
が付くコマンドは Interactive Mode Command というもので %undo
以外にも種類があります。
システムプロンプトに指示を追加して、ふるまいを調整する
Open Interpreterのシステムプロンプトはユーザーにより変更できるようになっています。
システムプロンプトが英語だからなのか、ユーザープロンプトを日本語で与えても、会話しているうちにOpen Interpreterの応答が英語になることがあります。私は常に日本語で応答してほしかったので、以下のような文をシステムプロンプトに追加しました。
agent.system_prompt += """
Regardless of the prompt language, write messages to the user in Japanese.
"""
おわりに
この記事をまとめているうちに v0.2.0 がリリースされていました。新機能の追加や破壊的変更があるようです。
-
https://github.com/KillianLucas/open-interpreter/tree/v0.1.16#comparison-to-chatgpts-code-interpreter ↩
-
https://openai.com/blog/new-models-and-developer-products-announced-at-devday ↩
-
https://techcommunity.microsoft.com/t5/ai-azure-ai-services-blog/azure-openai-service-announces-new-models-and-multimodal/ba-p/3978865 ↩
-
https://github.com/shroominic/codebox-api/blob/v0.0.19/codeboxapi/box/codebox.py#L54-L64 ↩
-
https://github.com/shroominic/codebox-api/blob/v0.0.19/codeboxapi/box/localbox.py#L77-L90 ↩
-
https://github.com/KillianLucas/open-interpreter/blob/v0.1.16/LICENSE ↩
-
https://github.com/KillianLucas/open-interpreter/blob/v0.1.17/LICENSE ↩
-
https://github.com/KillianLucas/open-interpreter/blob/v0.1.16/interpreter/terminal_interface/config.yaml#L2 ↩
-
https://github.com/KillianLucas/open-interpreter/blob/v0.1.16/interpreter/terminal_interface/start_terminal_interface.py#L201-L210 ↩
-
https://github.com/KillianLucas/open-interpreter/issues/411 ↩
-
https://github.com/KillianLucas/open-interpreter/issues/52 ↩