你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本教程介绍如何在 Azure 应用服务上部署与 Phi-4 sidecar 扩展集成的基于 Express.js的聊天机器人应用程序。 通过执行这些步骤,你将了解如何设置可缩放的 Web 应用、添加 AI 支持的 sidecar 来增强聊天功能,以及测试聊天机器人的功能。
托管自己的小型语言模型(SLM)具有以下优点:
- 完全掌控您的数据。 敏感信息不会向外部服务公开,这对符合性要求严格的行业至关重要。
- 可以微调自托管模型以满足特定用例或领域特定要求。
- 最大程度地减少网络延迟和更快的响应时间,以提供更好的用户体验。
- 完全控制资源分配,确保应用程序的最佳性能。
先决条件
部署示例应用程序
在浏览器中,导航到 示例应用程序存储库。
从存储库中启动新的 Codespace。
使用 Azure 帐户登录:
az login
在 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 应用程序。
- 导航到 Azure 门户并转到应用的管理页。
- 在左侧菜单中,选择 “部署>部署中心”。
- 在“容器”选项卡上,选择“添加”>“Sidecar 扩展”。
- 在挎斗扩展选项中,选择“AI:phi-4-q4-gguf (实验)”。
- 提供 sidecar 扩展的名称。
- 选择保存以应用更改。
- 请等待几分钟,以便部署 sidecar 扩展。 继续选择 “刷新 ”,直到 状态 列显示 “正在运行”。
此 Phi-4 挎斗扩展使用聊天补全 API(如 OpenAI),可以在 http://localhost:11434/v1/chat/completions
对聊天补全响应做出响应。 有关如何与 API 交互的详细信息,请参阅:
测试聊天机器人
在应用的管理页的左侧菜单中,选择“ 概述”。
在 “默认域”下,选择 URL 以在浏览器中打开 Web 应用。
验证聊天机器人应用程序是否正在运行并响应用户输入。
示例应用程序的工作原理
示例应用程序演示如何将基于 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。
以本地方式克隆存储库。
git clone https://github.com/Azure-Samples/ai-slm-in-app-service-sidecar cd ai-slm-in-app-service-sidecar
切换到 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 复制模型。
生成 Docker 映像。 例如:
docker build --tag phi-3 .
使用 Docker CLI 将生成的映像上传到 Azure 容器注册表,并将 第一个映像推送到 Azure 容器注册表。
在 “部署中心>容器”选项卡中 ,选择“ 添加>自定义容器 ”,然后配置新容器,如下所示:
- 名称:phi-3
- 映像源:Azure 容器注册表
- 注册表:您的注册表
- 图像:上传的图像
- 标记:所需的图像标记
- 端口: 8000
选择应用。
要查看与此自定义 sidecar 容器交互的示例应用程序,请参阅 bring_your_own_slm/src/webapp。