你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 容器应用中的无服务器代码解释器会话

Azure 容器应用动态会话提供对代码解释器的快速且可缩放的访问。 每个代码解释器会话均按 Hyper-V 边界完全隔离,旨在运行不受信任的代码。

用于代码解释器会话

代码解释器会话非常适合需要运行潜在恶意代码或可能对主机系统或其他用户造成危害的情况,例如:

  • 由大型语言模型 (LLM) 生成的代码。
  • 最终用户在 Web 或 SaaS 应用程序中提交的代码。

对于流行的 LLM 框架(例如 LangChain、LlamaIndex 或 Semantic Kernel),可以使用工具和插件将 AI 应用与代码解释器会话集成。

应用程序还可以使用一个 REST API 来与代码解释器会话集成。 API 允许你:

  • 在会话中执行代码并检索结果

  • 上传文件到会话并从会话下载文件。

    可以上传和下载可执行代码文件或代码可处理的数据文件。

内置代码解释器会话支持最常见的代码执行场景,无需管理基础结构或容器。

如果需要完全控制代码执行环境或有需要隔离沙盒的不同场景,则可以使用自定义代码解释器会话

代码解释器会话池

若要使用代码解释器会话,需要一个名为 会话池 的 Azure 资源,用于定义代码解释器会话的配置。

在会话池中,可以指定最大并发会话数以及会话终止前会话可空闲时间等设置。

可以使用 Azure 门户、Azure CLI 或 Azure 资源管理器模板创建会话池。 创建会话池后,可以使用池的管理 API 终结点来管理和执行会话中的代码。

有关如何创建和配置会话池的详细信息,请参阅 “使用会话池”。

会话中的代码执行

创建会话池后,应用程序可以通过与 LLM 框架集成或直接使用池的管理 API 终结点来与池中的会话交互。

会话标识符

重要

会话标识符是敏感信息,需要通过一个安全的过程来管理其值。 在此过程中,应用程序必须确保每个用户或租户仅有权访问其自己的会话。

无法保护对会话的访问可能会导致滥用或未经授权的访问存储在用户会话中的数据。 有关详细信息,请参阅 会话标识符

与池中的会话交互时,使用会话标识符引用每个会话。 会话标识符 是一个字符串,该字符串定义在会话池中是唯一的。 如果你正在生成 Web 应用程序,则可以使用用户的 ID。 如果你正在生成聊天机器人,则可以使用对话 ID。

如果正在运行带标识符的会话,则将重用该会话。 如果未运行带标识符的会话,则会自动创建新会话。

身份验证

身份验证使用 Microsoft Entra 令牌进行处理。 有效的 Microsoft Entra 令牌由属于会话池上的“Azure 容器应用会话执行者”和“参与者”角色的标识生成

如果使用 LLM 框架集成,该框架会为你处理令牌生成和管理。 确保为应用程序配置了托管标识,并在会话池中进行了所需的角色分配。

如果直接使用池的管理 API 终结点,则必须生成令牌并将其包含在 HTTP 请求的 Authorization 标头中。 除了前面提到的角色分配之外,令牌还需要包含一个值为 aud 的受众 (https://dynamicsessions.io) 声明。

若要了解详细信息,请参阅 身份验证和授权

使用文件

可以上传和下载文件,并列出代码解释器会话中的所有文件。

上传文件

若要将文件上传到会话,请在多部分表单数据请求中向 POST 终结点发送 uploadFile 请求。 将文件数据包含在请求正文中。 该文件必须包括文件名。

上传的文件存储在会话文件系统的 /mnt/data 目录下。

以下示例演示如何将文件上传到会话。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

下载文件

若要从会话的 /mnt/data 目录下载文件,请向 GET 终结点发送 file/content/{filename} 请求。 响应包含文件数据。

以下示例演示如何设置请求的格式 GET 以下载文件。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

列出文件

若要列出会话的 /mnt/data 目录中的文件,请向 GET 终结点发送 files 请求。

以下示例演示如何列出会话目录中的文件。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

响应包含会话中的文件列表。

以下列表显示了请求会话内容时预期返回的响应类型的示例。

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

安全

代码解释器会话旨在在隔离环境中运行不受信任的代码,确保应用程序和数据保持受保护。

LLM 框架集成

以下 LLM 框架不直接使用会话池管理 API,而是提供与代码解释器会话的集成:

框架 教程
LangChain Python: langchain-azure-dynamic-sessions 教程
LlamaIndex Python: llama-index-tools-azure-code-interpreter 教程
语义内核 Python:semantic-kernel(版本 0.9.8-b1 或更高版本) 教程

管理 API 终结点

如果不使用 LLM 框架集成,可以直接使用 管理 API 终结点与会话池进行交互。

在会话中执行代码

若要在会话中执行代码,请将 POST 请求发送到 code/execute 终结点,并在请求正文中包含要运行的代码。

以下示例在 Python 中打印 Hello, world!

在发送请求之前,请将 <> 括号之间的占位符替换为适合你的会话池和会话标识符的值。

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "print('Hello, world!')"
    }
}

若要重用会话,请在后续请求中指定相同的会话标识符。

将文件上传到会话

若要将文件上传到会话,请在多部分表单数据请求中向 POST 终结点发送 uploadFile 请求。 将文件数据包含在请求正文中。 该文件必须包括文件名。

上传的文件存储在会话文件系统的 /mnt/data 目录下。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

注意

文件上传限制为 128MB。 如果超出此限制,则可能会返回 HTTP 413

从会话下载文件

若要从会话的 /mnt/data 目录下载文件,请向 GET 终结点发送 file/content/{filename} 请求。 响应包含文件数据。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

列出会话中的文件

若要列出会话的 /mnt/data 目录中的文件,请向 GET 终结点发送 files 请求。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

响应包含会话中的文件列表。

以下列表显示了请求会话内容时预期返回的响应类型的示例。

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

预装的包

Python 代码解释器会话包括常用的 Python 包,例如 NumPypandasscikit-learn

若要输出预装的包列表,请使用以下代码调用 code/execute 终结点。

在发送请求之前,请将 <> 括号之间的占位符替换为特定于你的请求的值。

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
    }
}

伐木业

代码解释器会话不支持直接记录。 与会话交互的应用程序可以将请求记录到会话池管理 API 及其响应。

计费

代码解释器会话根据每个会话的持续时间计费。 有关详细信息,请参阅计费

后续步骤