この記事の手順を完了すると、Claude 3.5 SonnetなどのLLMが生成したPythonコードを、OSから完全に隔離されたクラウド環境で実行し、その結果だけを受け取る仕組みが手に入ります。 ローカル環境を汚さず、セキュリティリスクをゼロに近づけてエージェント開発を加速させる実戦的なガイドです。

所要時間: 約35分 | 難易度: ★★★☆☆

この記事で作るもの

  • AIエージェントが生成した任意のコードを安全に実行し、グラフ画像や計算結果を返すPythonスクリプト
  • 前提知識:Pythonの基本的な文法(変数、関数、pip操作)がわかること
  • 必要なもの:Anthropic APIキー、E2B APIキー(無料枠あり)

📦 この記事に関連する商品(楽天メインで価格確認)

RTX 4060 Ti 16GB

エージェントの脳を将来的にローカルLLM化する際、16GBのVRAMが最小要件となるため

楽天で価格を見る Amazonでも確認

※アフィリエイトリンクを含みます

先に確認するスペック・料金

今回の構成はAPIベースで動作するため、読者のPCにRTX 4090のようなモンスターGPUは不要です。MacBook Airや一般的なノートPCで十分に動作します。

コスト面では、AnthropicのAPI使用料(Claude 3.5 Sonnet利用)が実行ごとに数円〜十数円かかります。サンドボックス環境には「E2B(Essentials for AI Agents)」を採用します。E2Bは記事執筆時点で月間1,000セッションまで無料のホスト型サンドボックスを提供しており、個人開発なら実質無料です。

自前でDockerを立てる方法もありますが、ネットワークの隔離設定やファイルシステムのクリーンアップを自前で実装するのは「車輪の再発明」であり、運用コストが高すぎます。仕事で使うなら、管理されたマネージド・サンドボックス一択です。

なぜこの方法を選ぶのか

AIエージェントにコードを実行させる際、最も避けるべきは「subprocess.run()」でローカル環境のシェルを叩かせることです。エージェントが「不要なファイルを削除する」コードを生成し、それをそのまま実行してシステムを破壊した事例は枚挙にいとまがありません。

以前、私もローカルのDockerコンテナで運用していましたが、コンテナの起動オーバーヘッド(約2〜3秒)がエージェントのレスポンスを悪化させていました。E2Bを選択する理由は、セッション起動が0.5秒以下と高速であり、かつPythonのグラフ描画(matplotlib)などのバイナリ出力まで標準サポートしているためです。実装の手間を8割削減しつつ、本番環境に耐えうるセキュリティを確保できます。

Step 1: 環境を整える

まずは必要なライブラリをインストールします。LLMとの対話にはAnthropic、サンドボックスにはE2BのSDKを使用します。

# ライブラリのインストール
# e2b-code-interpreter: コード実行用サンドボックスSDK
# anthropic: LLM(Claude)連携用SDK
# python-dotenv: 環境変数管理用
pip install e2b-code-interpreter anthropic python-dotenv

E2BのSDKは、内部的にJupyter Kernelをクラウド上のMicroVM(Firecracker)で動かしています。これにより、一度実行した変数の状態を保持したまま次のコードを実行できる「ステートフル」な対話が可能になります。

落とし穴: E2BのAPIキーは公式サイト(e2b.dev)でサインアップ後に取得する必要があります。取得を忘れると「Project ID not found」というエラーで止まります。また、Pythonのバージョンは3.9以上が必要です。

Step 2: 基本の設定

環境変数(.envファイル)を作成し、各種キーを設定します。コードに直接キーを書き込むのは、GitHubへ誤操作でプッシュした瞬間に数万円の被害に繋がるため、絶対に避けてください。

# .envファイルの内容
ANTHROPIC_API_KEY=sk-ant-xxx...
E2B_API_KEY=e2b_xxx...

次に、Pythonスクリプトの初期化部分を書きます。

import os
from dotenv import load_dotenv
from anthropic import Anthropic
from e2b_code_interpreter import CodeInterpreter

# 環境変数の読み込み
load_dotenv()

# クライアントの初期化
# Anthropicはコード生成能力が高いClaude 3.5 Sonnetを推奨
anthropic = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
e2b_key = os.environ["E2B_API_KEY"]

# サンドボックスの動作確認用関数
def test_sandbox():
    with CodeInterpreter(api_key=e2b_key) as sandbox:
        # サンドボックス内でPythonコードを実行
        exec_result = sandbox.notebook.exec_cell("print('Sandbox is ready!')")
        return exec_result.logs.stdout

print(test_sandbox())

with 構文を使っているのは、処理終了後に必ずサンドボックス(MicroVM)をシャットダウンするためです。これを忘れると、クラウド上のリソースが残り続け、無料枠を無駄に消費します。

Step 3: 動かしてみる

エージェントが「指示を受け取り、コードを生成し、サンドボックスで実行する」一連の流れを実装します。

def ask_claude_to_code(prompt):
    # Claudeに「Pythonコードのみを出力せよ」と指示するシステムプロンプト
    system_prompt = """
    あなたはデータサイエンスに精通したエンジニアです。
    ユーザーの依頼に対して、Pythonコードのみを返してください。
    解説やMarkdownの装飾(```python 等)は一切不要です。
    """

    response = anthropic.messages.create(
        model="claude-3-5-sonnet-20240620",
        max_tokens=1024,
        system=system_prompt,
        messages=[{"role": "user", "content": prompt}]
    )
    return response.content[0].text

# 指示を出してみる
user_query = "1から100までの素数をリストアップして、その合計を計算してください。"
generated_code = ask_claude_to_code(user_query)

print(f"--- 生成されたコード ---\n{generated_code}\n")

with CodeInterpreter(api_key=e2b_key) as sandbox:
    result = sandbox.notebook.exec_cell(generated_code)
    print(f"--- 実行結果 ---\n{result.logs.stdout}")

期待される出力

--- 生成されたコード ---
primes = [n for n in range(2, 101) if all(n % i != 0 for i in range(2, int(n**0.5) + 1))]
print(f"素数リスト: {primes}")
print(f"合計: {sum(primes)}")

--- 実行結果 ---
素数リスト: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
合計: 1060

この出力が出れば、AIが書いたコードを安全に実行するパイプラインが完成しています。

Step 4: 実用レベルにする

実務では、単なるテキスト出力だけでなく「グラフの描画」や「ライブラリの動的インストール」が必要です。これらを処理できるように拡張します。

import base64

def run_agent_task(prompt):
    code = ask_claude_to_code(prompt)

    with CodeInterpreter(api_key=e2b_key) as sandbox:
        # 実務では必要なライブラリを事前にインストールさせることが多い
        # sandbox.install_python_packages("matplotlib", "pandas")

        execution = sandbox.notebook.exec_cell(code)

        # エラーハンドリング
        if execution.error:
            print(f"実行エラー: {execution.error.name} - {execution.error.value}")
            print(f"トレースバック: {execution.error.traceback}")
            return

        # 結果の表示(標準出力)
        for log in execution.logs.stdout:
            print(f"出力: {log}")

        # 画像出力(チャートなど)の処理
        if execution.results:
            for i, res in enumerate(execution.results):
                if res.png:
                    # base64デコードしてファイル保存
                    with open(f"output_chart_{i}.png", "wb") as f:
                        f.write(base64.b64decode(res.png))
                    print(f"画像を保存しました: output_chart_{i}.png")

# 実用的なタスク例
run_agent_task("2024年の日本の株価推移を模したダミーデータを作成し、matplotlibで折れ線グラフを描画してください。")

このコードでは、エージェントが生成したmatplotlibの画像をバイナリデータとして受け取り、ローカルに保存しています。私はこれをSlack Botに組み込み、分析依頼を投げると数秒でグラフが返ってくる環境を構築しています。

よくあるトラブルと解決法

エラー内容原因解決策
ModuleNotFoundErrorサンドボックス内にライブラリがないsandbox.install_python_packages("ライブラリ名") を実行前に呼ぶ
AuthenticationErrorAPIキーが不正または未設定.env の読み込みが正しく行われているか確認
実行が異常に遅いサンドボックスの起動待ちwith 構文の外で sandbox = CodeInterpreter() して使い回す(要クローズ)

次のステップ

ここまでの内容で、AIエージェントの「脳(LLM)」と「手(コード実行環境)」が繋がりました。 次に挑戦すべきは、このサンドボックスを「自律型エージェント(ReAct)」に組み込むことです。

LangChainやCrewAIといったフレームワークの「Tool」として、今回作った run_agent_task を登録してみてください。エージェントが「計算が必要だ」と判断した瞬間に、自動でPythonを書いて実行し、その結果をもとに回答を組み立てるようになります。

また、本番環境で運用する場合は、ユーザーごとにサンドボックスのセッションIDを管理し、リソースの競合を防ぐロジックが必要になります。E2Bのドキュメントには、数千セッションを同時にさばくためのアーキテクチャも公開されています。ぜひ読み込んでみてください。

よくある質問

Q1: E2Bを使わずに、完全にローカル(オフライン)で安全に動かす方法はありますか?

Dockerコンテナを起動し、ネットワークを完全に遮断(–network none)した上で、Jupyterのゲートウェイを経由して通信する方法があります。ただし、ホストマシンへのマウント設定を誤るとファイルが消されるリスクは残ります。

Q2: LLMが書いたコードに無限ループが含まれていた場合、どうなりますか?

E2Bの exec_cell にはタイムアウト(デフォルトでは数分)が設定されています。時間が経過すると自動的にプロセスがキルされるため、クラウド上のリソースを食いつぶし続ける心配はありません。

Q3: 日本語のフォントがグラフで文字化けしてしまいます。

E2Bの標準VMには日本語フォントが入っていません。解決策として、Japanize-matplotlib などのライブラリを install_python_packages で追加し、コードの冒頭でインポートさせる指示をプロンプトに含めるのが最短です。


1. X投稿用ツイート本文 (TWEET_TEXT) 2. アフィリエイト商品情報 (AFFILIATE_CONTEXT)

3. SNS拡散用ハッシュタグ (HASHTAGS) 4. SEOタグ (SEO_TAGS) 5. URLスラッグ (SLUG)


あわせて読みたい