「AIエージェントキャッチアップ #35 - LangChain Sandbox」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #35 - LangChain Sandbox」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

LangChain Sandbox

今回は、セキュアなPythonコード実行環境「LangChain Sandbox」について、実際に動かしたりソースコードを読んだりしました。

LangChain SandboxのGitHubリポジトリはこちらです。

github.com

今回のポイント

LangChain Sandboxとは

LangChain Sandboxは、信頼できないPythonコードを安全に実行するためのサンドボックス環境です。

Pyodideという、WebAssemblyで動作するブラウザやNode.js環境のPythonディストーションを使用して、LLMが生成したコードやユーザーが作成したコードを安全に実行できます。

pyodide.org

LangChain Sandboxの主な特徴としては、以下の3つが挙げられています。

  • セキュリティ - 権限を設定可能な隔離された実行環境
  • ローカル実行 - リモート実行やDockerコンテナが不要
  • セッションサポート - 複数のコード実行間で状態を維持

LangChain Sandboxの基本的な使い方

LangChain Sandboxを使用する際は、DenoとPythonのlangchain-sandboxパッケージをインストールします。

基本的な使い方は以下のようになります。

from langchain_sandbox import PyodideSandbox

sandbox = PyodideSandbox(
    sessions_dir="sessions",
    allow_net=True,
)

code = """\
import numpy as np
x = np.array([1, 2, 3])
print(x)
"""

async def main() -> None:
    result = await sandbox.execute(code)
    pprint.pprint(result)

※記事内のコードはlangchain-sandbox==0.0.4を使用しています。より新しいバージョンでは多少実装方法が異なります。

上記のコードの実行結果は以下のようになります。

CodeExecutionResult(result=None,
                    stdout='Loading numpyLoaded numpy[1 2 3]',
                    stderr=None,
                    status='success',
                    execution_time=1.7986226081848145)

stdoutの箇所の末尾に、[1 2 3]というコード内でprintした値が含まれていることが分かります。

Statefulな実行

LangChain Sandboxでは、実行時の変数を次の実行に保持することもできます。

たとえば以下のコードでは、一度目の実行で定義したaという変数を、2度目の実行で使用しています。

async def main() -> None:
    result = await sandbox.execute("a = 1", session_id="123")
    pprint.pprint(result)
    result2 = await sandbox.execute("print(a)", session_id="123")
    pprint.pprint(result2)

LangChainツールとしての活用

LangChain Sandboxは、LangChainのツールとして使用することもできます。

LangGraphのcreate_react_agentでLangChain Sandboxをツールとして使用する例は、以下のようになります。

from langchain_sandbox import PyodideSandboxTool
from langgraph.prebuilt import create_react_agent

agent = create_react_agent(
    "openai:gpt-4.1",
    tools=[PyodideSandboxTool()],
)

たとえば「5 + 7は?Pythonで計算してください。」という入力で実行すると、Sandbox環境でコードを実行しながら回答してくれます。

Sandbox環境を使う様子はLangSmithでも確認できます。

langgraph-codeact

LangChain Sandboxを使用するサンプルとしては、「langgraph-codeact」もあります。

langgraph-codeactは、「CodeAct」というアーキテクチャをLangGraphで実装したものです。

github.com

LangChain Sandboxとlanggraph-codeactを組み合わせるサンプルが、以下のURLで公開されています。

https://github.com/langchain-ai/langchain-sandbox/blob/main/examples/codeact_agent.py

このサンプルでは、以下のようにPython上で実装した関数を、Sandbox環境で利用可能にしています。

def add(a: float, b: float) -> float:
    """Add two numbers together."""
    return a + b

def multiply(a: float, b: float) -> float:
    """Multiply two numbers together."""
    return a * b

Python標準ライブラリの「inspect」を使用して、Pythonの関数を文字列に変換してプロンプトやコードに埋め込む実装となっています。

LangChain Sandboxのしくみ

LangChain Sandbox自体の実装も確認しました。

ステップ1. Denoの実行

LangChain SandboxのPyodideSandboxを実行(execute)すると、subprocessでdeno runコマンドが実行されます。

参考: https://github.com/langchain-ai/langchain-sandbox/blob/c9c5988c62136c24ff25e0064bc71b09fa735610/libs/sandbox-py/langchain_sandbox/pyodide.py#L258

その際、--allow-netなどのオプションにより、ネットワークやファイルへのアクセスが制限されます。

ステップ2. Pyodideを使ったPythonの実行

deno runコマンドでは、Pyodideを使ってPythonが実行されます。

その際、Pyodideの機能を活用して、セッション間での変数の保持などが実限されています。

参考: https://github.com/langchain-ai/langchain-sandbox/blob/main/libs/pyodide-sandbox-js/main.ts

Denoを使用することで、コンテナ等を使わずにセキュアな実行環境を実現していることが大きな特徴ですね。

次回のご案内

以上、今回は「LangChain Sandbox」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #36 - Claude Code Action」ということで、Claude CodeをGitHub Actionsで動かす「Claude Code Action」がテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!