当前位置: 首页 > news >正文

Spring WebFlux 整合AI大模型实现流式输出

前言

最近赶上AI的热潮,很多业务都在接入AI大模型相关的接口去方便的实现一些功能,后端需要做的是接入AI模型接口,并整合成流式输出到前端,下面有一些经验和踩过的坑。

集成

Spring WebFlux是全新的Reactive Web技术栈,基于反应式编程,很适合处理我们需求的流式数据。

依赖

只需要下面这一个依赖即可,但是需要助力springboot父版本,不同的版本在相关的API实现上面有些许的差别。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

代码

这边我在controller写了一个测试代码,意思是每秒产生一段json数据,一共10次,需要注意,响应头一定要设置text/event-stream 这个值,标志着是流式输出

@GetMapping(path = "/test/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> chatTest() {//chat交互测试return Flux.interval(Duration.ofSeconds(1)).take(10).map(sequence -> "{" + "    \"data\": \"33\"," + "    \"count\": \"" + sequence + "\"" + "}");}

postman 调用接口测试下,正常返回数据了
在这里插入图片描述

后端集成AI大模型

在实际业务中,基本上都是后端来调用 deepseek,再返回给前端,下面大概是集成

public Flux<ServerSentEvent<ObjectNode>> chat() {WebClient webClient = WebClient.create();
String url = "大模型url链接"return webClient.post().uri(url).header("Accept", "text/event-stream").body(BodyInserters.fromObject(reqNode))  // 注意高版本的API 可以直接用 bodyValue().retrieve().bodyToFlux(new ParameterizedTypeReference<ServerSentEvent<ObjectNode>>() {}).log().onBackpressureBuffer().doOnError(throwable -> {//错误处理log.error("chat request error -> {}", throwable.getMessage());throw new RuntimeException("request error -> " +throwable.getMessage());}).doOnNext(v -> {//每次输出流处理log.info("received chat message: {}", v);}).doOnComplete(() -> {//流输出完成处理});

一些错误解决

reactor.core.Exceptions$OverflowException: Could not emit buffer due to lack of requests

报错是由于发布者(Publisher)尝试以比订阅者(Subscriber)请求速率更快的速度推送数据时。这种情况违反了 Reactive Streams 的背压(Backpressure)机制,导致异常抛出。导致流异常终止。
在上面请求时加上了 .onBackpressureBuffer() 用缓冲机制解决

相关文章:

  • Python-内置函数
  • MCP协议在LLM系统中的架构与实现原理研究
  • Cursor 集成 Figma MCP 实现阅读理解原型图生成方案
  • SQL Server相关的sql语句
  • PPT转图片拼贴工具 v2.0
  • 《EDA学习地图:从入门到进阶的通关秘籍》
  • [10-2]MPU6050简介 江协科技学习笔记(22个知识点)
  • Git的由来与应用详解:从Linux内核到现代开发的革命性工具
  • C++学习-入门到精通【14】标准库算法
  • AI应用工程师面试
  • Spring Boot 常用注解面试题深度解析
  • 从二叉树到 STL:揭开 set 容器的本质与用法
  • SDC命令详解:使用set_fanout_load命令进行约束
  • 为什么需要自动下载浏览器驱动?
  • VBA信息获取与处理专题五第一节:利用CDO发送简单邮件
  • 大模型微调技术全景图:从全量更新到参数高效适配
  • NumPy数组操作完全指南:从入门到精通
  • 云服务器Xshell登录拒绝访问排查
  • pg数据库表里面id值,使用sql语句赋值,唯一性
  • Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
  • 有什么网站是做名片印刷的/上海优化网站公司哪家好
  • 提供网站建设设计/seo是什么服务
  • 微网站建设方案/合肥seo搜索优化
  • 最新新闻热点事件简短/郑州网站seo服务
  • 个人网站设计成首页/运营培训
  • 网站设计中下拉列表怎么做/小广告清理