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

教程:使用 Phi-4 sidecar 扩展在应用服务中运行聊天机器人(Express.js)

本教程介绍如何在 Azure 应用服务上部署与 Phi-4 sidecar 扩展集成的基于 Express.js的聊天机器人应用程序。 通过执行这些步骤,你将了解如何设置可缩放的 Web 应用、添加 AI 支持的 sidecar 来增强聊天功能,以及测试聊天机器人的功能。

托管自己的小型语言模型(SLM)具有以下优点:

  • 完全掌控您的数据。 敏感信息不会向外部服务公开,这对符合性要求严格的行业至关重要。
  • 可以微调自托管模型以满足特定用例或领域特定要求。
  • 最大程度地减少网络延迟和更快的响应时间,以提供更好的用户体验。
  • 完全控制资源分配,确保应用程序的最佳性能。

先决条件

部署示例应用程序

  1. 在浏览器中,导航到 示例应用程序存储库

  2. 从存储库中启动新的 Codespace。

  3. 使用 Azure 帐户登录:

    az login
    
  4. 在 Codespace 中打开终端并运行以下命令:

    cd use_sidecar_extension/expressapp
    az webapp up --sku P3MV3
    

此启动命令是将 Express.js 应用程序部署到 Azure 应用服务的常见设置。 有关详细信息,请参阅 在 Azure 中部署 Node.js Web 应用

添加 Phi-4 挎斗扩展

在本部分中,将 Phi-4 sidecar 扩展添加到 Azure 应用服务上托管的 ASP.NET Core 应用程序。

  1. 导航到 Azure 门户并转到应用的管理页。
  2. 在左侧菜单中,选择 “部署>部署中心”。
  3. 在“容器”选项卡上,选择“添加”>“Sidecar 扩展”
  4. 在挎斗扩展选项中,选择“AI:phi-4-q4-gguf (实验)”
  5. 提供 sidecar 扩展的名称。
  6. 选择保存以应用更改。
  7. 请等待几分钟,以便部署 sidecar 扩展。 继续选择 “刷新 ”,直到 状态 列显示 “正在运行”。

此 Phi-4 挎斗扩展使用聊天补全 API(如 OpenAI),可以在 http://localhost:11434/v1/chat/completions 对聊天补全响应做出响应。 有关如何与 API 交互的详细信息,请参阅:

测试聊天机器人

  1. 在应用的管理页的左侧菜单中,选择“ 概述”。

  2. “默认域”下,选择 URL 以在浏览器中打开 Web 应用。

  3. 验证聊天机器人应用程序是否正在运行并响应用户输入。

    显示浏览器中运行的时尚助手应用的屏幕截图。

示例应用程序的工作原理

示例应用程序演示如何将基于 Express.js 的服务与 SLM sidecar 扩展集成。 该 SLMService 类封装了用于将请求发送到 SLM API 并处理流式响应的逻辑。 此集成使应用程序能够动态生成对话响应。

查看 use_sidecar_extension/expressapp/src/services/slm_service.js,可以看到:

  • 服务将 POST 请求发送到 SLM 终结点 http://127.0.0.1:11434/v1/chat/completions

    this.apiUrl = 'http://127.0.0.1:11434/v1/chat/completions';
    
  • POST 有效负载包括系统消息以及从所选产品和用户查询生成的提示。

    const requestPayload = {
      messages: [
        { role: 'system', content: 'You are a helpful assistant.' },
        { role: 'user', content: prompt }
      ],
      stream: true,
      cache_prompt: false,
      n_predict: 2048 // Increased token limit to allow longer responses
    };
    
  • POST 请求以流的方式逐行传输响应数据。 将分析每行以提取生成的内容(或令牌)。

    // Set up Server-Sent Events headers
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders();
    
    const response = await axios.post(this.apiUrl, requestPayload, {
      headers: { 'Content-Type': 'application/json' },
      responseType: 'stream'
    });
    
    response.data.on('data', (chunk) => {
      const lines = chunk.toString().split('\n').filter(line => line.trim() !== '');
    
      for (const line of lines) {
        let parsedLine = line;
        if (line.startsWith('data: ')) {
          parsedLine = line.replace('data: ', '').trim();
        }
    
        if (parsedLine === '[DONE]') {
          return;
        }
    
        try {
          const jsonObj = JSON.parse(parsedLine);
          if (jsonObj.choices && jsonObj.choices.length > 0) {
            const delta = jsonObj.choices[0].delta || {};
            const content = delta.content;
    
            if (content) {
              // Use non-breaking space to preserve formatting
              const formattedToken = content.replace(/ /g, '\u00A0');
              res.write(`data: ${formattedToken}\n\n`);
            }
          }
        } catch (parseError) {
          console.warn(`Failed to parse JSON from line: ${parsedLine}`);
        }
      }
    });
    

常见问题


定价层如何影响 SLM sidecar 的性能?

由于 AI 模型会消耗大量资源,请选择一个合适的定价层,以便有足够的 vCPU 和内存来运行特定模型。 因此,仅当应用处于合适的定价层时,才会显示内置的 AI sidecar 扩展。 如果生成自己的 SLM sidecar 容器,则还应使用 CPU 优化模型,因为应用服务定价层是仅限 CPU 的层。

例如,来自 Hugging Face 的 Phi-3 微型模型配有 4K 上下文长度,旨在以有限的资源运行,并为许多常见场景提供强大的数学和逻辑推理。 它还提供 CPU 优化版本。 在应用服务中,我们在所有高级层上测试了模型,并发现它在 P2mv3 层或更高版本中表现良好。 如果要求允许,可以在较低层上运行它。


如何使用我自己的 SLM sidecar?

示例存储库包含一个可用作 sidecar 的示例 SLM 容器。 它运行一个侦听端口 8000 的 FastAPI 应用程序,端口在 Dockerfile 中指定。 应用程序使用 ONNX 运行时加载 Phi-3 模型,然后将 HTTP POST 数据转发到模型,并将模型的响应流式传输回客户端。 有关详细信息,请参阅 model_api.py

若要自行生成边车映像,需要在计算机上本地安装 Docker Desktop。

  1. 以本地方式克隆存储库。

    git clone https://github.com/Azure-Samples/ai-slm-in-app-service-sidecar
    cd ai-slm-in-app-service-sidecar
    
  2. 切换到 Phi-3 映像的源目录,并使用 Huggingface CLI 将模型下载到本地。

    cd bring_your_own_slm/src/phi-3-sidecar
    huggingface-cli download microsoft/Phi-3-mini-4k-instruct-onnx --local-dir ./Phi-3-mini-4k-instruct-onnx
    

    Dockerfile 配置为从 ./Phi-3-mini-4k-instruct-onnx 复制模型。

  3. 生成 Docker 映像。 例如:

    docker build --tag phi-3 .
    
  4. 使用 Docker CLI 将生成的映像上传到 Azure 容器注册表,并将 第一个映像推送到 Azure 容器注册表

  5. “部署中心>容器”选项卡中 ,选择“ 添加>自定义容器 ”,然后配置新容器,如下所示:

    • 名称:phi-3
    • 映像源Azure 容器注册表
    • 注册表:您的注册表
    • 图像:上传的图像
    • 标记:所需的图像标记
    • 端口8000
  6. 选择应用

要查看与此自定义 sidecar 容器交互的示例应用程序,请参阅 bring_your_own_slm/src/webapp

后续步骤

教程:在 Azure 应用服务中为 Linux 应用配置 sidecar 容器