部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 vLLM 部署 DeepSeek 模型,并通过 NextChat 打造高性能 ChatBot

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

原创
作者头像
JavaEdge
发布2025-03-31 19:13:53
发布2025-03-31 19:13:53
2310
举报
文章被收录于专栏:AIGC大模型应用AIGC大模型应用

随着生成式 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),适合实时交互应用场景,如聊天机器人。
  • 灵活兼容:支持多种主流大模型,无缝适配现有的推理服务框架(如 SageMaker)。
  • 资源优化:减少 GPU 资源的浪费,适用于私有化环境的成本敏感型部署。

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

SageMaker 优势

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

架构设计

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

img
img

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

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

为什么改造 NextChat 调用逻辑?

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

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

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

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

关键代码如下所示:

代码语言:powershell
复制
// 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", // 可选:保持连接
  },
});

接口返回设置

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

代码语言:powershell
复制
// 外层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",
  },
});

Reasoning 推理内容输出

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

代码语言:powershell
复制
data: {"choices":[{"delta":{"reasoning_content":"interaction"}}]}

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

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

data: [DONE]

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

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

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

示例响应:

代码语言:powershell
复制
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

数据流持续推送...

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

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

总结

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么选择 vLLM 和 SageMaker 进行模型部署?
    • vLLM 简介
    • SageMaker 优势
  • 架构设计
  • 使用 NextChat 实现前端流式推理输出
    • 为什么改造 NextChat 调用逻辑?
    • 如何使用 Node.js 调用 SageMaker Endpoint 进行流式响应
    • 接口返回设置
    • Reasoning 推理内容输出
    • 为什么使用”text/event-stream”?
    • 私有化部署相比公有 API 的优势
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档