亚马逊AWS官方博客

使用 vLLM 部署 DeepSeek 模型,并通过 NextChat 打造高性能 ChatBot

随着生成式 AI 和大语言模型(LLM)的兴起,越来越多的企业和开发者希望能在自己的环境内快速部署高效的 AI 应用。本文将详细介绍如何在亚马逊云中国区使用 SageMaker 部署基于 vLLM 的 DeepSeek 模型,并通过 SageMaker Endpoint 对外提供服务。同时,我们还将探讨如何利用开源项目 NextChat 构建 ChatBot 聊天应用,实现流式推理与 Reasoning 输出,并在 UI 上实现流式交互效果。

为什么选择 vLLM 和 SageMaker 进行模型部署?

vLLM 简介

vLLM(Virtual Large Language Model)是一种高效的 LLM 推理引擎,专为大型语言模型(例如 DeepSeek、LLaMA、GPT 等)的高性能部署设计。vLLM 通过动态批处理、请求合并和缓存机制,大幅提高推理效率,降低模型推理延迟,最大限度地提升 GPU 的使用效率。

vLLM 的主要优势包括:

  • 高效推理:通过智能批量处理、动态负载均衡和缓存复用,显著提升推理性能。
  • 流式推理支持:原生支持流式推理(Streaming Inference),适合实时交互应用场景,如聊天机器人。
  • 灵活兼容:支持多种主流大模型,无缝适配现有的推理服务框架(如 Amazon SageMaker)。
  • 资源优化:减少 GPU 资源的浪费,适用于私有化环境的成本敏感型部署。

这些特性使 vLLM 成为在云端或本地部署生成式 AI 模型的理想选择,尤其适用于需要高性能、低延迟、实时交互场景的企业和开发团队。

Amazon SageMaker 优势

  • 快速部署:通过内置的 Endpoint 服务快速实现模型部署,无需复杂的运维操作。
  • 弹性扩展:提供弹性扩展能力,应对大流量访问。
  • 私有化部署:模型推理过程完全私有化,数据安全性高,符合企业安全与合规需求。

架构设计

  1. 模型部署:利用 SageMaker Endpoint 部署经过 VLLM 优化的 DeepSeek 模型,支持流式推理。
  2. API :通过 SageMaker Runtime 客户端调用 Endpoint,实现实时的流式响应处理。
  3. NextChat 集成:在 NextChat 的 Nodejs 层中封装调用逻辑,完成从前端到模型的流式数据传输与处理。

如何在 Amazon SageMaker 上部署 DeepSeek 模型?

您可以参考 Blog 中的 Amazon SageMaker JumpStart 中的 DeepSeek-R1 模型,和使用 AWS Trainium 和 AWS Inferentia 部署 DeepSeek-R1-Distill 模型部分,以及 Blog

*中国区目前只能用 g5.48xlarge 部署 70b 的全量蒸馏版本模型或者 R1 的 1.58b 动态量化版本。

现在有两个工具可以在中国区部署模型使用:model_hub https://github.com/aws-samples/llm_model_hub 与 Easy Model Deployer https://github.com/aws-samples/easy-model-deployer

主要包括以下几个步骤:

1. 创建 SageMaker Endpoint

  • 配置推理实例:在 SageMaker 控制台中创建一个 Endpoint,选择自定义容器镜像,并配置合适的实例类型(如 GPU 实例)来满足大模型推理需求。
  • 网络与安全配置:通过配置 VPC、子网和安全组,确保 Endpoint 部署在安全隔离的私有网络环境中,保障数据安全。

2. 实现流式推理与实时响应

  • 在 Endpoint 推理服务中集成流式推理逻辑,使得返回结果可以逐步输出(例如通过 Server-Sent Events 的方式),从而在前端实现实时交互。
  • 可以参考在 NextChat 中的实现逻辑,将响应数据包装成 ReadableStream 并设置 Content-Type: "text/event-stream",便于前端实时处理和展示推理过程。

使用 NextChat 实现前端流式推理输出

NextChat 是一个基于 Next.js 构建的开源聊天应用,它能快速实现 AI ChatBot 服务。

为什么改造 NextChat 调用逻辑?

原始的 NextChat 通常调用公开的大模型 API,但公开 API 存在网络延迟、服务不稳定、数据安全风险等问题。为了更高效、更安全,我们对 NextChat 进行了改造,使用 Amazon SageMaker Endpoint 进行推理,实现了私有化部署,性能更稳定,响应更快。

如何使用 Node.js 调用 SageMaker Endpoint 进行流式响应

下面是实现流式响应的核心逻辑:

  • 初始化 SageMaker 运行时客户端:通过 SageMakerRuntimeClient 初始化客户端,并设置相应参数。
  • 构造请求 Payload:将用户输入、模型参数(如 temperaturetop_p 等)封装成 JSON 格式的请求数据。
  • 调用 Endpoint 流式响应:使用 InvokeEndpointWithResponseStreamCommand 调用 Endpoint,接收流式响应数据。
  • 解析流式响应数据:通过包装一个新的 ReadableStream,解析每个 chunk 数据,识别“data: ”前缀,对 JSON 数据进行解码和拼接,并实时推送到前端。

关键代码如下所示:

// API层逻辑(Node.js环境)

import {
  SageMakerRuntimeClient,
  InvokeEndpointWithResponseStreamCommand,
} from "@aws-sdk/client-sagemaker-runtime"; // ES Modules import

const ENDPIOINT_NAME = "your_sagemaker_endpoint";

const AWS_SAGEMAKER_PARAM = {}; // 添加你的 AWS 配置 或者采用运行容器的IAM Role

export const requestSagemakerDS = () => {
  // 对话参数,参考:https://api-docs.deepseek.com/zh-cn/guides/reasoning_model
  const payload = {
    messages: [{"role": "user", "content": "9.11 and 9.8, which is greater?"}],
    max_tokens: 2048,
    stream: true,
    frequency_penalty: 0,
    presence_penalty: 0,
    temperature: 0.5,
    top_p: 1,
  };

  const client = new SageMakerRuntimeClient(AWS_SAGEMAKER_PARAM);
  const command = new InvokeEndpointWithResponseStreamCommand({
    EndpointName: ENDPIOINT_NAME,
    Body: JSON.stringify(payload),
    ContentType: "application/json",
  });
  const response = await client.send(command);
  return formateOutput(response);
}

const formateOutput = (response) => {
  return new ReadableStream({
    async start(controller) {
      let lastRawData = "";
      for await (const chunk of response.Body) {
        const decoded = new TextDecoder("utf-8")
          .decode(chunk.PayloadPart.Bytes)
          .trim();
        if (decoded !== "data: [DONE]") {
          if (decoded.startsWith("data: ")) {
            if (lastRawData) {
              controller.enqueue(new TextEncoder().encode(`${lastRawData}\n\n`));
              lastRawData = decoded;
            } else {
              lastRawData = decoded;
            }
          } else {
            lastRawData += decoded;
          }
        } else {
          controller.enqueue(new TextEncoder().encode(`${lastRawData}\n\n${decoded}`));
        }
      }
      controller.close();
    },
  });
};


const response: any = await requestSagemakerDS();

return new NextResponse(response, {
  headers: {
    "Content-Type": "text/event-stream",
    "Cache-Control": "no-cache", // 可选:防止缓存
    Connection: "keep-alive", // 可选:保持连接
  },
});
PowerShell

接口返回设置

在 API 层,我们通过设置响应头 Content-Type: "text/event-stream" 来支持 SSE(Server-Sent Events)格式的流式响应,这种格式能够让前端实时接收到数据更新,同时避免了轮询带来的性能开销:

// 外层handle调用
export const runtime = "nodejs"; // 重要

const response = await requestSagemakerDS();
return new NextResponse(response, {
  headers: {
    "Content-Type": "text/event-stream",
    "Cache-Control": "no-cache",
    Connection: "keep-alive",
  },
});
PowerShell

Reasoning 推理内容输出

DeepSeek 等大语言模型的推理过程中,除了最终内容输出外,还支持额外的 reasoning_content 字段,帮助用户理解模型的推理过程,进一步增强 AI 服务的透明度。例如:(\n\n 两个换行符代表一次 OutPut Event)

data: {"choices":[{"delta":{"reasoning_content":"interaction"}}]}

data: {"choices":[{"delta":{"reasoning_content":".\n"}}]}

data: {"choices":[{"delta":{"content":"Hi"}}]}

data: [DONE]
PowerShell

为什么使用”text/event-stream”?

目前,主流 ChatBot 应用都采用 text/event-stream 类型的响应格式(SSE,Server-Sent Events),原因包括:

  • 实时性高:浏览器原生支持流式数据推送,无需客户端反复请求。
  • 开发便利:前端使用 EventSource API,开发更简洁。
  • 兼容性强:主流浏览器原生支持,无需额外库或插件。

示例响应:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

数据流持续推送...
PowerShell

私有化部署相比公有 API 的优势

  • 数据安全与隐私保护:模型部署在企业内部或私有云环境,避免敏感数据外流。
  • 服务可用性与性能保障:避免公有 API 服务不可控的风险,确保服务稳定性。
  • 定制化需求:支持更灵活的参数设置和模型微调,满足企业特定需求。

总结

本文方案通过 vLLM 和 Amazon SageMaker Endpoint,在亚马逊云科技中国区快速部署 DeepSeek 模型,并结合 NextChat 的改造,开发了一个高效、安全、实时的 AI ChatBot 应用,显著提升了企业 AI 落地的能力。欢迎开发者和企业实践以上技术方案,打造更高效、更智能的 AI 服务。

希望本文对您的 AI 部署与开发有所帮助!


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者

王宇

亚马逊云科技快速原型方案架构师,负责大前端领域的产品研究与交付。针对应用程序中所涉及的移动端、前端、BFF 层原型及交付等均有涉猎,曾主导过金融、零售与广告、企业应用、大数据、AI 等领域多个大型业务系统的交互设计与实现。

贾婷

亚马逊云科技快速原型解决方案架构师,致力于帮助客户设计和开发大数据和AI方向的快速原型方案,有游戏、汽车等行业的大数据开发经验。

邓冠群

亚马逊云科技快速原型解决方案架构师,快速构建机器学习应用场景,为客户提供高效且精准的解决方案。专注于机器学习方向,在图像处理和大语言模型多模态领域拥有丰富经验。

郭松

亚马逊云科技解决方案架构师,负责汽车行业客户的架构设计与优化,目前致力于利用生成式 AI 帮助客户解决业务问题和提升效率。