Java后端对接AI大模型 SSE流式输出实战|实现打字机效果、实时流式问答(可直接商用)
2026/7/24 20:50:55 网站建设 项目流程

Java后端对接AI大模型 SSE流式输出实战|实现打字机效果、实时流式问答(可直接商用)

一、前言:为什么 AI 问答必须用 SSE 流式输出?

现在所有 AI 对话产品(ChatGPT、DeepSeek、文心一言、通义千问)都是流式输出,也就是:

后端不用等 AI 全部回答完毕,而是返回一个字、推一个字,前端实时渲染打字机效果

传统接口存在致命问题:

  • 大模型回答 3000 字需要 3~5 秒
  • 前端长时间空白、用户以为卡死
  • 超时熔断、响应超时、体验极差

SSE(Server-Sent Events)是目前 AI 问答的工业标准:

  • 基于 HTTP 长连接
  • 服务端主动持续推送数据
  • 无需 WebSocket 复杂握手
  • 天然适合 AI 流式问答场景

本文带你从零实现Java + SpringBoot3 + AI大模型 SSE 流式问答,代码可直接商用。

二、SSE 核心原理(面试必问)

1. 普通接口

一次请求 → 一次完整响应 → 连接关闭

2. SSE 流式接口

一次请求 →服务端持续分片推送→ 前端逐字渲染 → 对话结束关闭连接

响应头关键标识:

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

三、项目依赖(SpringBoot3 最新稳定版)

无需特殊依赖,SpringBoot 原生支持 SSE。

<dependencies><!-- Web核心 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Http工具,调用大模型接口 --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency><!-- JSON解析 --><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.52</version></dependency></dependencies>

四、核心工具类:SSE 流式推送工具

封装通用 SSE 推送、关闭、异常处理工具类,全局复用。

importorg.springframework.http.MediaType;importorg.springframework.web.servlet.mvc.method.annotation.SseEmitter;/** * SSE 流式推送工具类 * 用于AI大模型流式输出、实时消息推送 */publicclassSseUtil{/** * 创建SSE发射器(超时3分钟) */publicstaticSseEmittercreateEmitter(){// 设置超时时间 3分钟returnnewSseEmitter(1000L*60*3);}/** * 推送消息 */publicstaticvoidsend(SseEmitteremitter,Stringcontent){try{emitter.send(content,MediaType.TEXT_PLAIN);}catch(Exceptione){// 客户端断开连接emitter.complete();}}/** * 结束推送 */publicstaticvoidcomplete(SseEmitteremitter){if(emitter!=null){emitter.complete();}}}

五、AI大模型流式问答核心接口(可直接商用)

适配DeepSeek、GPT、通义千问、智谱通用流式返回格式。

importcom.alibaba.fastjson2.JSON;importcom.alibaba.fastjson2.JSONObject;importokhttp3.*;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.servlet.mvc.method.annotation.SseEmitter;importjava.io.BufferedReader;importjava.io.InputStreamReader;@RestController@RequestMapping("/ai")publicclassAiStreamController{// 大模型API密钥(替换自己的)privatestaticfinalStringAPI_KEY="sk-xxxx";privatestaticfinalStringAI_URL="https://api.deepseek.com/v1/chat/completions";@GetMapping(value="/chat/stream",produces="text/event-stream;charset=UTF-8")publicSseEmitteraiChatStream(@RequestParamStringprompt){// 1. 创建SSE推送器SseEmitteremitter=SseUtil.createEmitter();// 2. 异步调用大模型(防止阻塞主线程)newThread(()->{OkHttpClientclient=newOkHttpClient();try{// 构建请求参数JSONObjectjson=newJSONObject();json.put("model","deepseek-chat");json.put("stream",true);// 开启流式输出!核心json.put("temperature",0.7);// 构建对话消息JSONObjectmessage=newJSONObject();message.put("role","user");message.put("content",prompt);json.put("messages",newObject[]{message});// 构建请求RequestBodybody=RequestBody.create(json.toString(),MediaType.get("application/json; charset=utf-8"));Requestrequest=newRequest.Builder().url(AI_URL).addHeader("Authorization","Bearer "+API_KEY).post(body).build();// 流式读取返回内容Responseresponse=client.newCall(request).execute();BufferedReaderreader=newBufferedReader(newInputStreamReader(response.body().byteStream()));Stringline;while((line=reader.readLine())!=null){// 过滤空行和结束标识if(line.startsWith("data: ")&&!line.contains("[DONE]")){Stringdata=line.substring(6);JSONObjectresJson=JSON.parseObject(data);// 逐字获取AI返回内容Stringcontent=resJson.getJSONArray("choices").getJSONObject(0).getJSONObject("delta").getString("content");// 逐字推送给前端SseUtil.send(emitter,content);}}// 流式结束SseUtil.complete(emitter);}catch(Exceptione){SseUtil.complete(emitter);}}).start();returnemitter;}}

六、前端测试(极简页面,可直接运行)

前端使用EventSource监听流式响应,实现打字机效果。

<!DOCTYPEhtml><html><body><divid="result"style="white-space:pre-wrap;"></div><script>// 建立SSE连接constsource=newEventSource("http://localhost:8080/ai/chat/stream?prompt=用Java写一个冒泡排序");letresDom=document.getElementById("result");// 接收流式数据source.onmessage=function(e){resDom.innerHTML+=e.data;};// 连接关闭source.onclose=function(){source.close();};</script></body></html>

七、运行效果

\1. 页面不会等待,秒级出现第一个字

\2. AI 内容逐字弹出,完美打字机效果

\3. 全部输出完毕自动关闭连接

\4. 不会超时、不会断流

八、生产环境高频坑点(2026最新)

坑1:忘记设置 stream=true

大模型默认一次性返回全部内容,不会流式推送。

坑2:主线程阻塞

必须异步请求大模型,否则 SSE 推送卡死。

坑3:前端跨域

SSE 属于跨域请求,后端必须配置跨域放行。

坑4:连接不关闭导致内存泄漏

必须捕获异常、手动 complete 关闭连接。

坑5:中文乱码

接口必须指定:produces = "text/event-stream;charset=UTF-8"

九、拓展升级(企业级功能)

  • 上下文记忆:拼接 history 对话记录,实现连续对话
  • 用户限流:防止恶意刷接口消耗AI额度
  • 异常重连:断网自动重连 SSE
  • 敏感词过滤:AI输出内容风控
  • 对话日志入库:记录问答、耗时、Token消耗

十、总结

SSE 流式输出是 AI 产品的标配技术,相比 WebSocket 更轻量、更简单、更适合问答场景。

本文代码是2026 年最新企业通用方案

  • SpringBoot3 原生支持
  • 零冗余、可直接上线商用
  • 适配所有国产大模型
  • 解决超时、空白、卡顿等用户体验问题

现在绝大多数 AI 客服、AI 助手、智能问答后台,全部采用这套架构!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询