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

关于java 调用阿里千问大模型,流式返回,并返回给前端

aaff

FLux曹,找了那么多案例,没一个靠谱的,还得东拼西凑。具体方法类

maven 这两个应该就够用

<!--ai调用--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dashscope-sdk-java</artifactId> <version>2.19.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
@GetMapping(value = "/aiTestTwo", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> simpleStream() throws NoApiKeyException, InputRequiredException { // 直接返回一个 Flux,每个元素会立即发送给前端 Generation gen = new Generation(); Message systemMsg = Message.builder() .role(Role.SYSTEM.getValue()) .content("You are a helpful assistant.") .build(); Message userMsg = Message.builder() .role(Role.USER.getValue()) .content("你是谁?") .build(); GenerationParam param = GenerationParam.builder() // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx") .apiKey(System.getenv("DASHSCOPE_API_KEY"))//DASHSCOPE_API_KEY // 模型列表:https://help.aliyun.com/model-studio/getting-started/models .model("qwen-plus") .messages(Arrays.asList(systemMsg, userMsg)) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .incrementalOutput(true) .build(); Flowable<GenerationResult> flowable = gen.streamCall(param); return Flux.from(flowable) .publishOn(Schedulers.boundedElastic()) .map(result -> result.getOutput().getChoices().get(0).getMessage().getContent()) .filter(content -> content != null && !content.isEmpty()); }

或者sse调用

@GetMapping(value = "/aiTestTwo", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter simpleStream() throws NoApiKeyException, InputRequiredException { SSE sse = new SSE(60000L); // 直接返回一个 Flux,每个元素会立即发送给前端 Generation gen = new Generation(); Message systemMsg = Message.builder() .role(Role.SYSTEM.getValue()) .content("You are a helpful assistant.") .build(); Message userMsg = Message.builder() .role(Role.USER.getValue()) .content("你是谁?") .build(); GenerationParam param = GenerationParam.builder() // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx") .apiKey(System.getenv("DASHSCOPE_API_KEY"))//DASHSCOPE_API_KEY // 模型列表:https://help.aliyun.com/model-studio/getting-started/models .model("qwen-plus") .messages(Arrays.asList(systemMsg, userMsg)) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .incrementalOutput(true) .build(); /*Flowable<GenerationResult> flowable = gen.streamCall(param);*/ gen.streamCall(param).forEach(result -> { System.out.println(result); System.out.println(result.getOutput()); System.out.println(result.getOutput().getChoices()); System.out.println(result.getOutput().getChoices().get(0)); System.out.println(result.getOutput().getChoices().get(0).getMessage()); System.out.println("122212121212"+result.getOutput().getChoices().get(0).getMessage().getContent()); String chunk = result.getOutput().getChoices().get(0).getMessage().getContent(); System.out.print(chunk); // 逐字输出,模拟打字机效果 sse.send(chunk); /* sse.send(SseEmitter.event() .name("message") .data(chunk));*/ }); /*sse.complete();*/ return sse; }

html

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>SSE 流式测试</title> </head> <body> <h1>SSE 流式数据接收测试</h1> <button onclick="startConnect()">开始连接</button> <button onclick="stopConnect()">断开连接</button> <hr/> <div id="message-box" style="border:1px solid #ccc; padding:10px; min-height:100px;"></div> <script> let eventSource = null; function startConnect() { const box = document.getElementById('message-box'); box.innerText = "正在连接...\n"; // 1. 创建 EventSource 对象,指向后端接口 eventSource = new EventSource('/user/aiTestTwo'); // 2. 监听消息事件 (默认事件名为 'message') eventSource.onmessage = function(event) { // event.data 就是后端 emitter.send() 发送的内容 console.log("收到数据:", event.data); box.innerText += event.data; }; // 3. 监听自定义事件 (如果后端用了 .name("error")) eventSource.addEventListener('error', function(event) { console.error("收到错误:", event.data); box.innerText += "\n[错误]: " + event.data; }); // 4. 监听连接打开事件 eventSource.onopen = function(event) { console.log("连接已建立"); }; // 5. 监听连接关闭/错误事件 eventSource.onerror = function(event) { console.log("连接出错或关闭"); // EventSource 会自动重连,如果需要手动停止,需调用 close() // eventSource.close(); }; } function stopConnect() { if (eventSource) { eventSource.close(); eventSource = null; document.getElementById('message-box').innerText += "\n[连接已断开]"; } } </script> </body> </html>
http://www.jsqmd.com/news/707432/

相关文章:

  • MCP 2026推理加速实战:5步完成KV Cache压缩、量化感知重编译与动态批处理调优,延迟直降63%
  • nli-MiniLM2-L6-H768快速部署:Kubernetes Helm Chart一键部署到生产集群
  • Windows 11锁屏壁纸别浪费!教你一键导出Spotlight精选图库到本地
  • 2026API服务商实测:3款稳定AI大模型接口方案,商用成本参考解析
  • 市场比较好的国标pvdf管厂家(2026年) - 品牌排行榜
  • OpenCV正态贝叶斯分类器在图像分割中的实战应用
  • C++的std--ranges竞争
  • 使用 GES DISC 的 IMAP-DOAS 预处理器 (IDP) V11.2 (OCO2_L2_IMAPDOAS) 筛选 OCO-2 二级空间排序地理定位反演结果
  • 行业内符合欧标防火卷帘门厂家口碑推荐2026 - 品牌排行榜
  • Java大数处理:BigInteger与BigDecimal
  • 从“词向量相亲”到“上下文理解”:用生活例子拆解Self-Attention为什么让NLP开窍了
  • SAP MIGO过账时,这3个BAdI和User Exit千万别乱用(附MB_DOCUMENT_BADI实战避坑指南)
  • 今天力扣周赛 , 就做出来了三道题 . 我真的也是废了 ... (简短版)
  • 2026市面上比较好的专利律所口碑推荐及选择参考 - 品牌排行榜
  • Voxtral-4B-TTS-2603快速入门:Web工具页UI功能分区与交互流程图解
  • 2026国内符合马来西亚标准防火卷帘门厂家推荐排行 - 品牌排行榜
  • UI-TARS-desktop轻量级体验:低配电脑也能流畅运行的AI桌面应用
  • 油藏模拟中线性求解器的优化与Arm架构实践
  • 2026市场耐用的国标pvdf管优质厂家推荐 - 品牌排行榜
  • 深度学习梯度爆炸问题与梯度裁剪技术详解
  • Oracle11g服务端安装包
  • 保姆级教程:在Android Automotive 14模拟器上配置多屏(仪表+中控+副驾)并修改分辨率
  • 个人学习笔记12
  • 快速入门Face3D.ai Pro:零代码生成专业级3D人脸模型
  • 基于Crypto APIs构建MCP服务器:AI与区块链交互的共享工具库实践
  • 2026年市面上符合摩洛哥标准防火卷帘门厂家排行 - 品牌排行榜
  • Pinpoint C Agent 实战指南:PHP/Python 微服务链路追踪部署与调优
  • Phi-3-mini-4k-instruct-gguf快速上手:Git版本控制下的模型项目协作管理
  • Phi-mini-MoE-instructGPU利用率提升:通过batch size与kv cache优化
  • AgenticHub:macOS原生AI工具资源管理器,高效管理MCP服务器与Agent技能