Spring AI集成DeepSeek,实现流式输出

前面一篇文章我们实现了《Spring AI集成DeepSeek:三步搞定Java智能应用》,大模型的响应速度是很慢的,为了提升用户体验,我们通常会使用流式输出一点点将结果输出给用户。先看下效果:

在 SpringBoot 中实现流式输出可以使用 Sse(Server-SentEvents,服务器发送事件)技术来实现,它是一种服务器推送技术,适合单向实时数据流,我们使用 SpringMVC(基于Servlet)中的SseEmitter对象来实现流式输出。

一、后端代码

/**
 * 流式调用
 */
@GetMapping("/generateStream")
public SseEmitter streamChat(@RequestParam String message) {
    // 创建 SSE 发射器,设置超时时间(例如 1 分钟)
    SseEmitter emitter = new SseEmitter(60_000L);
    // 创建 Prompt 对象
    Prompt prompt = new Prompt(new UserMessage(message));
    // 订阅流式响应
    // 完成处理
    // 异常处理
    openAiChatModel.stream(prompt).subscribe(response -> {
                try {
                    String content = response.getResult().getOutput().getContent();
                    System.out.print(content);
                    // 发送 SSE 事件
                    emitter.send(SseEmitter.event()
                            .data(content)
                            .id(String.valueOf(System.currentTimeMillis()))
                            .build());
                } catch (Exception e) {
                    emitter.completeWithError(e);
                }
            },
            emitter::completeWithError,
            emitter::complete
    );
    // 处理客户端断开连接
    emitter.onCompletion(() -> {
        // 可在此处释放资源
        System.out.println("SSE connection completed");
    });
    emitter.onTimeout(() -> {
        emitter.complete();
        System.out.println("SSE connection timed out");
    });
    return emitter;
}

二、前端代码

前端接受数据流也比较简单,不需要在使用传统 Ajax 技术了,只需要创建一个 EventSource 对象,监听后端 SSE 接口,然后将接收到的数据流展示出来即可,如下代码所示:

$('#send-button').click(function () {
  const message = $('#chat-input').val();
  
  // 立即清空输入框
  $('#chat-input').val('');
  
  // 用户消息(保持原有样式)
  var userMessage = $('<div class="message user"></div>');
  userMessage.append('<img class="avatar" src="/images/user.png" alt="用户头像">');
  userMessage.append(`<div class="content"><span class="nickname"></span><div class="text">${message}</div></div>`);
  
  // 机器人消息容器(先创建空容器)
  var botMessage = $('<div class="message bot"></div>');
  botMessage.append('<img class="avatar" src="/images/robot.png" alt="助手头像">');
  botMessage.append('<div class="content"><span class="nickname">助手</span><div class="text"></div></div>');
  
  // 按顺序添加消息
  $('#chat-messages').append(userMessage, botMessage);
  
  // 流式处理
  const eventSource = new EventSource(`/ai/generateStream?message=` + message);
  eventSource.onmessage = function (event) {
  botMessage.find('.text').append(event.data);  // 追加到机器人消息内容区
  };
  
  // 错误处理
  eventSource.onerror = function (err) {
  $('#chat-input').val(''); // 确保网络异常时也清空
  console.error("连接错误:", err);
  eventSource.close();
  };
});

完整代码可查看:

Gitee:https://gitee.com/tyronchen/spring-boot-learn/tree/master/Spring-AI

GitHub:https://github.com/tyronczt/spring-boot-learning/tree/master/Spring-AI

三、运行项目

运行项目测试结果:

  • 启动 Spring Boot 项目。
  • 在浏览器中访问地址 http://localhost:8888/index.html,即可看到流式输出的内容逐渐显示在页面上。

小天有话说

此文参考居多,html页面是使用idea中的通义插件所写,Demo之作,样式相对粗糙,如页面的markdown样式显示支持不完善,显示屏幕较小等。样式并非重点,后续将继续学习Spring Ai相关技术;

题外话

AI技术的应用早已突破简单的API调用阶段,唯有深耕深度学习领域,方能在技术迭代的浪潮中保持竞争力。这一规律不仅适用于个人发展,更是企业生存的必然选择。DeepSeek的崛起犹如一剂强心针,彻底激活了开源大模型领域的竞争格局——据不完全统计,已有超过200家头部企业完成DeepSeek技术接口的集成部署,涵盖华为、腾讯、百度、阿里、京东、字节等科技巨头,以及微软、英伟达、AWS等国际厂商。

对于开发者而言,**Spring AI Alibaba **作为阿里云推出的AI应用开发框架,提供了从模型部署到智能体开发的完整解决方案。该框架支持40+插件集成,可实现RAG增强生成与工具调用等核心功能,显著降低AI应用开发门槛。接下来也会更新一些学习文章:如DeepSeek接入Spring Cloud Alibaba AI完成智能化实战等,尽情期待!

参考

磊哥聊编程https://segmentfault.com/a/1190000046109605

Spring AI Alibabahttps://java2ai.com/

### 集成 DeepSeek 实现流式 AI 对话 为了在 Spring Boot 项目中集成 DeepSeek实现流式AI 对话功能,可以按照如下方式操作: #### 添加依赖项 首先,在 `pom.xml` 文件中添加必要的 Maven 依赖来支持与 DeepSeek 和 WebSocket 的交互。 ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot Starter WebSocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- spring-ai-openai-spring-boot-starter for DeepSeek integration --> <dependency> <groupId>com.spring.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>${latest.version}</version> </dependency> </dependencies> ``` 此部分配置确保应用程序能够通过 HTTP 请求访问外部 API,并且可以通过 WebSocket 进行实时通信[^1]。 #### 创建配置类 接着创建一个 Java 类用于加载并管理连接到 DeepSeek 所需的各项参数。这通常涉及到设置 API 密钥和其他可能影响请求行为的选项。 ```java @Configuration @ConfigurationProperties(prefix = "deepseek") @Data public class DeepSeekConfig { private String apiKey; @Bean public ClientV4 getDeepSeekClient() { return new ClientV4.Builder(apiKey).build(); } } ``` 这段代码定义了一个名为 `DeepSeekConfig` 的 Bean 来存储和提供给其他组件使用的客户端实例[^4]。 #### 构建控制器处理请求 最后一步是在应用内构建 RESTful 或者基于 WebSocket 的接口以便前端或其他服务发起对话请求。这里展示的是简单的 REST 控制器例子,它接收消息并通过 DeepSeek 发送出去获取回复。 ```java @RestController @RequestMapping("/api/chat") public class ChatController { private final ClientV4 deepSeekClient; public ChatController(ClientV4 deepSeekClient) { this.deepSeekClient = deepSeekClient; } @PostMapping("/stream") public ResponseEntity<StreamingHttpResponse> streamChat(@RequestBody Map<String, Object> requestMap) throws Exception { // Prepare the chat completion request with streaming enabled. var responseStream = deepSeekClient.createChatCompletion( CreateChatCompletionRequest.builder() .model("text-davinci-003") .messages(List.of(new Message("user", (String)requestMap.get("message")), new Message("assistant",""))) .stream(true) .build()); StreamingHttpResponse response = new StreamingHttpResponse(responseStream); return ResponseEntity.ok().contentType(MediaType.TEXT_EVENT_STREAM).body(response); } } ``` 上述代码片段展示了如何利用 `@RestController` 注解建立一个新的端点 `/api/chat/stream` 接收 POST 方法传入的消息体作为输入数据发送至 DeepSeek,并开启流模式返回结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小天努力学java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值