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

教程:将语义内核中的代码解释器会话与 Azure 容器应用配合使用

语义内核是 Microsoft 为使用大型语言模型 (LLM) 的 .NET、Python 和 Java 开发人员创建的开源 AI 框架。 当你使用语义内核生成 AI 代理时,LLM 会解释用户输入并生成响应。 当 AI 代理需要执行数学和符号推理来生成响应时,它通常会遇到困难。 通过将 Azure 容器应用动态会话与语义内核集成,可以为代理提供代码解释器以用于执行专业任务。

本教程介绍如何在 Web API 中运行语义内核 AI 代理。 API 接受用户输入并返回由 AI 代理生成的响应。 代理在动态会话中使用代码解释器来执行计算。

先决条件

创建 Azure 资源

本快速入门中的示例应用使用 Azure OpenAI 中的 LLM。 它还使用 Azure 容器应用会话来运行由 LLM 生成的代码。

  1. 将 Azure CLI 更新到最新版本。

     az upgrade
    
  2. 如果 Azure 容器应用扩展已安装,请将其删除,然后安装包含会话命令的 Azure 容器应用扩展的预览版本:

    az extension remove --name containerapp
    az extension add \
        --name containerapp \
        --allow-preview true -y
    
  3. 登录 Azure:

    az login
    
  4. 设置本快速入门中使用的变量:

    RESOURCE_GROUP_NAME=aca-sessions-tutorial
    AZURE_OPENAI_LOCATION=swedencentral
    AZURE_OPENAI_NAME=<UNIQUE_OPEN_AI_NAME>
    SESSION_POOL_LOCATION=eastasia
    SESSION_POOL_NAME=code-interpreter-pool
    

    <UNIQUE_OPEN_AI_NAME> 替换为用于创建 Azure OpenAI 帐户的唯一名称。

  5. 创建资源组:

    az group create --name $RESOURCE_GROUP_NAME --location $SESSION_POOL_LOCATION
    
  6. 创建 Azure OpenAI 帐户:

    az cognitiveservices account create \
        --name $AZURE_OPENAI_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $AZURE_OPENAI_LOCATION \
        --kind OpenAI \
        --sku s0 \
        --custom-domain $AZURE_OPENAI_NAME
    
  7. 在 Azure OpenAI 帐户中创建名为 gpt-35-turbo 的 GPT 3.5 Turbo 模型部署:

    az cognitiveservices account deployment create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $AZURE_OPENAI_NAME \
        --deployment-name gpt-35-turbo \
        --model-name gpt-35-turbo \
        --model-version "1106" \
        --model-format OpenAI \
        --sku-capacity "100" \
        --sku-name "Standard"
    
  8. 创建代码解释器会话池:

    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
    

本地运行示例应用

将应用部署到 Azure 容器应用之前,可以在本地运行它以对其进行测试。

克隆应用

  1. 克隆 Azure 容器应用会话示例存储库

    git clone https://github.com/Azure-Samples/container-apps-dynamic-sessions-samples.git
    
  2. 更改为包含示例应用的目录:

    cd container-apps-dynamic-sessions-samples/semantic-kernel-python-webapi
    

配置应用

  1. 创建 Python 虚拟环境并激活它:

    python3.11 -m venv .venv
    source .venv/bin/activate
    

    如果使用其他版本,请更改命令中的 Python 版本。 建议使用 Python 3.10 或更高版本。

    注意

    如果使用的是 Windows,请将 .venv/bin/activate 替换为 .venv\Scripts\activate

  2. 安装所需的 Python 包:

    python -m pip install -r requirements.txt
    
  3. 若要运行应用,需要配置数据源环境变量。

    1. 检索 Azure OpenAI 帐户终结点:

      az cognitiveservices account show \
          --name $AZURE_OPENAI_NAME \
          --resource-group $RESOURCE_GROUP_NAME \
          --query properties.endpoint \
          --output tsv
      
    2. 检索 Azure 容器应用会话池管理终结点:

      az containerapp sessionpool show \
          --name $SESSION_POOL_NAME \
          --resource-group $RESOURCE_GROUP_NAME \
          --query properties.poolManagementEndpoint \
          --output tsv
      
    3. 在示例应用目录的根目录中创建 .env 文件(与 main.py 的位置相同)。 将以下内容添加到文件:

      AZURE_OPENAI_ENDPOINT=<AZURE_OPENAI_ENDPOINT>
      POOL_MANAGEMENT_ENDPOINT=<SESSION_POOL_MANAGEMENT_ENDPOINT>
      

      <AZURE_OPENAI_ENDPOINT> 替换为 Azure OpenAI 帐户终结点,并将 <SESSION_POOL_MANAGEMENT_ENDPOINT> 替换为会话池管理终结点。

  4. 该应用使用 DefaultAzureCredential 通过 Azure 服务进行身份验证。 在本地计算机上,它使用当前的 Azure CLI 登录凭据。 必须在 Azure OpenAI 帐户上为自己提供“认知服务 OpenAI 用户”角色,以便应用能够访问模型端点,并在会话池上为自己指定“Azure ContainerApps 会话执行者”角色,以便该应用能够访问会话池

    1. 检索 Azure CLI 用户名:

      az account show --query user.name --output tsv
      
    2. 运行以下命令以检索 Azure OpenAI 帐户资源 ID:

      az cognitiveservices account show --name $AZURE_OPENAI_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv
      
    3. 将“认知服务 OpenAI 用户”角色分配给 Azure OpenAI 帐户上的 Azure CLI 用户:

      az role assignment create --role "Cognitive Services OpenAI User" --assignee <CLI_USERNAME> --scope <AZURE_OPENAI_RESOURCE_ID>
      

      <CLI_USERNAME> 替换为 Azure CLI 用户名,并将 <AZURE_OPENAI_RESOURCE_ID> 替换为 Azure OpenAI 帐户资源 ID。

    4. 运行以下命令以检索会话池资源 ID:

      az containerapp sessionpool show --name $SESSION_POOL_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv
      
    5. 使用 ID 将“Azure ContainerApps 会话执行者”角色分配给会话池中的 Azure CLI 用户

      az role assignment create \
          --role "Azure ContainerApps Session Executor" \
          --assignee <CLI_USERNAME> \
          --scope <SESSION_POOL_RESOURCE_ID>
      

      <CLI_USERNAME> 替换为 Azure CLI 用户名,并将 <SESSION_POOL_RESOURCE_ID> 替换为会话池资源 ID。

运行应用

在运行示例应用之前,请在编辑器中打开 main.py 并查看代码。 该应用使用 FastAPI 来创建接受查询字符串中的用户消息的 Web API。

以下代码行实例化 SessionsPythonTool 并将其提供给语义内核代理

sessions_tool = SessionsPythonTool(
    pool_management_endpoint,
    auth_callback=auth_callback_factory("https://dynamicsessions.io/.default"),
)
kernel.add_plugin(sessions_tool, "SessionsTool")

需要执行计算时,内核将使用 SessionsPythonTool 中的代码解释器来运行代码。 该代码在会话池的会话中执行。 默认情况下,实例化该工具时会生成随机会话标识符。 如果内核使用工具运行多个 Python 代码片段,则它会使用相同的会话。 若要确保每个最终用户都有唯一的会话,请对每个用户使用单独的内核和工具。

SessionsPythonTool 在版本 0.9.8b1 或更高版本的 semantic-kernel 包中提供。

  1. 运行示例应用:

    fastapi dev main.py
    
  2. 打开浏览器并导航到 http://localhost:8000/docs 。 可以看到示例应用的 Swagger UI。

  3. 展开 /chat 终结点并选择“试用”

  4. message 字段中输入 What time is it right now?,然后选择“执行”。

    代理将以当前时间进行响应。 在终端中,可以查看显示代理生成的 Python 代码的日志,以获取当前时间并在代码解释器会话中运行它。

  5. 若要停止应用,请在终端中输入 Ctrl+C

可选:将示例应用部署到 Azure 容器应用

若要将 FastAPI 应用部署到 Azure 容器应用,需要创建容器映像并将其推送到容器注册表。 然后,可以将映像部署到 Azure 容器应用。 az containerapp up 命令会将这些步骤合并到单个命令中。

然后,需要为应用配置托管标识,并为其分配适当的角色来访问 Azure OpenAI 和会话池。

  1. 设置容器应用环境的变量和应用名称:

    ENVIRONMENT_NAME=aca-sessions-tutorial-env
    CONTAINER_APP_NAME=chat-api
    
  2. 生成应用并将其部署到 Azure 容器应用:

    az containerapp up \
        --name $CONTAINER_APP_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $SESSION_POOL_LOCATION \
        --environment $ENVIRONMENT_NAME \
        --env-vars "AZURE_OPENAI_ENDPOINT=<OPEN_AI_ENDPOINT>" "POOL_MANAGEMENT_ENDPOINT=<SESSION_POOL_MANAGMENT_ENDPOINT>" \
        --source .
    

    <OPEN_AI_ENDPOINT> 替换为 Azure OpenAI 帐户终结点,并将 <SESSION_POOL_MANAGMENT_ENDPOINT> 替换为会话池管理终结点。

  3. 为应用启用系统分配的托管标识:

    az containerapp identity assign \
        --name $CONTAINER_APP_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --system-assigned
    
  4. 若要使应用能够访问 Azure OpenAI 和会话池,需要为托管标识分配适当的角色。

    1. 检索托管标识的主体 ID:

      az containerapp show \
          --name $CONTAINER_APP_NAME \
          --resource-group $RESOURCE_GROUP_NAME \
          --query identity.principalId \
          --output tsv
      
    2. 检索会话池资源 ID:

      az containerapp sessionpool show \
          --name $SESSION_POOL_NAME \
          --resource-group $RESOURCE_GROUP_NAME \
          --query id \
          --output tsv
      
    3. 在会话池上为托管标识分配 Azure ContainerApps Session ExecutorContributor 角色:

      在运行以下命令之前,请将 <PRINCIPAL_ID><SESSION_POOL_RESOURCE_ID> 替换为在前面步骤中检索到的值。

      az role assignment create \
          --role "Azure ContainerApps Session Executor" \
          --assignee <PRINCIPAL_ID> \
          --scope <SESSION_POOL_RESOURCE_ID>
      
      az role assignment create \
          --role "Contributor" \
          --assignee <PRINCIPAL_ID> \
          --scope <SESSION_POOL_RESOURCE_ID>
      
    4. 检索 Azure OpenAI 帐户资源 ID:

      az cognitiveservices account show \
          --name $AZURE_OPENAI_NAME \
          --resource-group $RESOURCE_GROUP_NAME \
          --query id \
          --output tsv
      
    5. 在 Azure OpenAI 帐户上为托管标识分配 Cognitive Services OpenAI User 角色:

      在运行以下命令之前,请将 <PRINCIPAL_ID><AZURE_OPENAI_RESOURCE_ID> 替换为在前面步骤中检索到的值。

      az role assignment create \
          --role "Cognitive Services OpenAI User" \
          --assignee <PRINCIPAL_ID> \
          --scope <AZURE_OPENAI_RESOURCE_ID>
      
  5. 检索应用的完全限定的域名 (FQDN):

    az containerapp show \
        --name $CONTAINER_APP_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query properties.configuration.ingress.fqdn \
        --output tsv
    
  6. 打开浏览器以转到 https://<FQDN>/docs,测试已部署的应用。

清理资源

处理资源后,可以将其删除以避免产生费用:

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

后续步骤