🐋

Azure Container Apps Dynamic Sessionsを使ってLLMが生成したコードを実行する

2024/05/19に公開

先日、Azure Container Apps の Dynamic Sessions という機能がプレビュー版でリリースされました。
この機能を使うと Azure Container Apps でサンドボックス環境でコードの実行ができます。

この記事では LangChain を使って LLM で生成したコードを Azure Container Apps のサンドボックス環境で実行を試して見ようと思います。

Azure CLI の Azure Container Apps 拡張機能のインストール

Dynamic Sessions 用の Azure Container Apps のリソースを作成するために Azure CLI に Azure Container Apps 拡張機能のインストールします。

az extension add \
    --source https://acacli.blob.core.windows.net/sessionspreview/containerapp-0.3.50-py2.py3-none-any.whl \
    --allow-preview true -y

コードインタプリターセッションプールの作成

code-interpreter-poolという名前でeastasiaリージョンにリソースを作成します。
現在はプレビュー版ということもあり、作成可能なリージョンが限られています。
なお Azure OpenAI Service などのリソースは作成済みである前提で進めます。

RESOURCE_GROUP_NAME="<リソースグループ名を入力します>"
SESSION_POOL_NAME="code-interpreter-pool"
SESSION_POOL_LOCATION="eastasia"

az containerapp sessionpool create \
    --name $SESSION_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $SESSION_POOL_LOCATION \
    --max-sessions 100 \
    --container-type PythonLTS \
    --cooldown-period 300

作成が完了するとContainer App Session Poolという種類のリソースがリソースグループ内に作成されます。

Azure ポータル上のプライグランドでの操作

作成したリソースの「Playground」から Python コードの実行ができます。

LangChain との統合

次に作成した Dynamic Sessions 用の Azure Container Apps を LangChain と統合して使ってみます。

最初に依存ライブラリを追加します。

# 依存ライブラリの追加
pip install -U langchain langchainhub langchain-openai langchain-azure-dynamic-sessions

シークレット値やエンドポイントなどの値は環境変数からロードします。

import os

pool_management_endpoint=os.getenv("POOL_MANAGEMENT_ENDPOINT")
aoai_api_key=os.getenv("AOAI_API_KEY")
aoai_endpoint=os.getenv("AOAI_ENDPOINT")

LangChain の Agent を定義し、Python コードを使う指示を行います。

from langchain_azure_dynamic_sessions import SessionsPythonREPLTool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain import hub
from langchain_openai import AzureChatOpenAI

# Azure Container Appsのサンドボックス環境と接続するツールの定義
tool = SessionsPythonREPLTool(pool_management_endpoint=pool_management_endpoint)

# Azure OpenAI Serviceのモデル定義
llm =  AzureChatOpenAI(
        api_key=aoai_api_key,
        api_version="2024-02-01",
        azure_deployment="gpt-35-turbo",
        azure_endpoint=aoai_endpoint,
        temperature=0,
    )

# プロンプト定義(LangChain Hubから取得)
prompt = hub.pull("hwchase17/openai-functions-agent")

tools=[tool]

# エージェントの定義
agent = create_tool_calling_agent(
    llm=llm,
    tools=tools,
    prompt=prompt,
)

agent_executor = AgentExecutor(
  agent=agent, tools=tools, verbose=True, handle_parsing_errors=True
  )

# 実行
agent_executor.invoke({"input": "Pythonで完全数を求めるプログラムを書いて6が完全数であるかどうかを確認してください。"})

結果としては以下のような形で Python コードを実行し、6 が完全数であることを回答しています。

生成されたコードは以下です。
こちらのコードが Azure Container Apps で実行されていることになります。

def is_perfect_number(n):
    divisors = []
    for i in range(1, n):
        if n % i == 0:
            divisors.append(i)
    if sum(divisors) == n:
        return True
    else:
        return False

print(is_perfect_number(6))

まとめ

まだプレビュー版ですが、Azure Container Apps の Dynamic Sessions を使って LLM が生成したコードを実行してみました。
Assistants API の Code Interpreter で使われるサンドボックス環境が開発者に近い形で提供されたのは割と面白いと思っています。
LLM でのコード実行環境としても優秀ですが、その他のユースケースでも使いどころがありそうです。

参考

https://techcommunity.microsoft.com/t5/apps-on-azure-blog/new-secure-sandboxes-at-scale-with-azure-container-apps-dynamic/ba-p/4142148

https://learn.microsoft.com/ja-jp/azure/container-apps/sessions-tutorial-langchain

https://pypi.org/project/langchain-azure-dynamic-sessions/

Discussion