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

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型:一场流式响应的"魔法吟唱"仪式

一、前言:关于流式响应的奇妙比喻

想象一下你正在火锅店点单,如果服务员必须等所有菜品都备齐才一次性端上来,你可能会饿得把菜单都啃了。而流式响应就像贴心的服务员,毛肚刚切好就立刻端上桌,肥牛卷还在空中飞着就送到你面前——这就是我们今天要施展的"异步上菜大法"!

注:完整代码见底部

二、Spring Boot魔法阵搭建

2.1 召唤SSE精灵

@PostMapping(value = "/ask", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter ask() {SseEmitter emitter = new SseEmitter(60_000L); // 设置60秒超时结界//...后续魔法吟唱
}

这段咒语相当于在Spring Boot的魔法阵中召唤了一个SSE(Server-Sent Events)精灵,它将负责持续不断地把豆包大模型的智慧结晶传送给前端。

2.2 构建跨次元传送门

@CrossOrigin(origins = "*") // 允许所有位面的访问

这行代码就像在霍格沃茨的墙上开了个任意门,让前端、移动端、甚至隔壁王大爷的智能拐杖都能连接我们的服务。

三、豆包大模型召唤仪式

3.1 拼装召唤咒语

ArkService arkService = ArkService.builder().apiKey("你的魔法密钥") // 请自行替换成阿拉霍洞开咒.build();

这里我们正在拼装哈利·波特级别的魔法道具,apiKey就是你的魔杖认证,记得千万不要像把WiFi密码写成纸条贴在电梯里一样暴露它!

3.2 构建魔法对话卷轴

List<ChatMessage> chatMessages = new ArrayList<>();
chatMessages.add(ChatMessage.builder().role(ChatMessageRole.USER) // 麻瓜用户身份.content("求Java策略模式代码") // 你的灵魂拷问.build());

这相当于在羊皮纸上书写你的问题,就像给猫头鹰系上求助信。注意提问要像调制福灵剂一样精准,才能得到理想的回答。

四、流式响应的炼金术

4.1 启动魔法反应堆

new Thread(() -> {// 这里开始炼制长生不老药...哦不,处理响应
}).start();

我们开启了多线程炼丹炉(误),确保主线程不会像被石化的赫敏一样僵住。

4.2 实时传输咒语

arkService.streamChatCompletion(...).forEach(j -> {emitter.send(SseEmitter.event().data(JSON.toJSONString(aiChatDTO))); // 把知识碎片装进漂流瓶
});

这就像用魔法把一本厚书拆成一页页的羊皮纸,通过飞路网持续传送。前端可以像收快递一样实时展示每个字的到来。

五、魔法的收尾工作

5.1 关闭魔法阵

finally {arkService.shutdownExecutor(); // 收拾魔法实验室
}

就像优秀的巫师总会清理遗忘咒的施法痕迹,这里确保我们的魔法资源不会像韦斯莱家的飞车一样失控乱跑。

5.2 异常处理小精灵

emitter.completeWithError(ex); // 把锅甩给异常对象

当魔药课发生爆炸时,我们要优雅地把错误信息封装成记忆球,而不是让整个霍格沃茨城堡崩溃。

六、实战效果展示

当你在控制台看到这样的输出:

"定义策略接口->创建具体策略类->配置上下文..."

说明你的魔法已经生效!前端会像收到邓布利多军的秘密信号一样,逐字显示出策略模式的代码实现。

postman效果图

在这里插入图片描述

七、写给麻瓜程序员的注意事项

  1. 密钥保护:把你的apiKey当成隐形衣,千万别学洛哈特教授到处炫耀
  2. 超时设置:60秒足够熬制一锅标准的缓和剂,但复杂问题可能需要更久
  3. 流量控制:别让你的魔法管道像韦斯莱笑话商店的烟花一样喷涌过度

八、结语:你已学会的魔法

现在你已经掌握了:

  • 搭建SSE双向镜通信
  • 流式响应炼金术
  • 大模型召唤仪式
  • 异常处理的黑魔法防御术

快去创建你自己的"魔法AI助手"吧!记住:好的代码应该像福灵剂一样令人愉悦,而不是像呕吐味的比比多味豆让人措手不及。愿代码之神永远眷顾你的IDE!

package com.ideal.jason.controller;import com.alibaba.fastjson.JSON;
import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionRequest;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.volcengine.ark.runtime.service.ArkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @author: jason* @Date: 14 2月 2025*/
@CrossOrigin(origins = "*")
@Slf4j
@RestController
@RequestMapping("/api/ai")
public class AIController {@PostMapping(value = "/ask", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter ask() {SseEmitter emitter = new SseEmitter(60_000L); // 超时时间 60 秒String apiKey = "ccde85e1-6ae4-1234-abe1-423164b9f965";//替换成自己的 API KeyString content = "java策略模式代码样例提供";//替换成自己的 API KeyString model = "doubao-1.5-pro-32k-250115";//替换成自己的 模型id// 创建ArkService实例ArkService arkService = ArkService.builder().apiKey(apiKey).build();// 模拟流式数据new Thread(() -> {try {// 初始化消息列表List<ChatMessage> chatMessages = new ArrayList<>();// 创建用户消息ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER) // 设置消息角色为用户.content(content) // //替换成自己的 提问内容.build();// 将用户消息添加到消息列表chatMessages.add(userMessage);// 创建聊天完成请求ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder().model(model)// 需要替换为Model ID.messages(chatMessages) // 设置消息列表.stream(true)//以流式返回.build();// 发送聊天完成请求并打印响应// 获取响应并打印每个选择的消息内容StringBuilder sb = new StringBuilder();arkService.streamChatCompletion(chatCompletionRequest).blockingIterable().forEach(j -> j.getChoices().forEach(choice -> {//System.out.print(choice.getMessage().getContent());AIChatDTO aiChatDTO =AIChatDTO.builder().content(choice.getMessage().getContent().toString()).build();try {emitter.send(SseEmitter.event()//.id(choice.getMessage().getToolCallId()).data(JSON.toJSONString(aiChatDTO)));sb.append(aiChatDTO.getContent());} catch (IOException e) {log.error("ask IOException");}}));System.out.println(sb);emitter.complete();} catch (Exception ex) {emitter.completeWithError(ex);} finally {// 关闭服务执行器arkService.shutdownExecutor();}}).start();return emitter;}
}

maven依赖

        <!-- 豆包 --><dependency><groupId>com.volcengine</groupId><artifactId>volcengine-java-sdk-ark-runtime</artifactId><version>LATEST</version></dependency>

相关文章:

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型&#xff1a;一场流式响应的"魔法吟唱"仪式 一、前言&#xff1a;关于流式响应的奇妙比喻 想象一下你正在火锅店点单&#xff0c;如果服务员必须等所有菜品都备齐才一次性端上来&#xff0c;你可能会饿得把菜单都啃了。而流式响应就像贴…...

Android Binder 用法详解

Binder 是 Android 系统中的一种进程间通信&#xff08;IPC&#xff09;机制&#xff0c;它允许不同进程之间进行高效通信。Binder 在 Android 系统中被广泛使用&#xff0c;例如在 Activity 与 Service 的交互中。 Binder 的基本组成 实现 Binder 通信通常包含以下几个关键部…...

在Ubuntu中,某个文件的右下角有一把锁的标志是什么意思?

在Ubuntu中&#xff0c;某个文件的右下角有一把锁的标志是什么意思&#xff1f; 在 Ubuntu&#xff08;或其他基于 GNOME 文件管理器的 Linux 发行版&#xff09;中&#xff0c;文件或文件夹的右下角出现一把“锁”标志&#xff0c;通常表示 你当前的用户没有该文件/文件夹的写…...

达梦数据库如何收集表和索引的统计信息

命令&#xff1a; DBMS_STATS.GATHER_TABLE_STATS(OWNNAME >HIDC,TABNAME > SYS_OSS,ESTIMATE_PERCENT>100,METHOD_OPT > FOR ALL COLUMNS SIZE AUTO,DEGREE > 2,CASCADE > true); dbms_stats.gather_table_stats&#xff1a;用于收集目标表&#xff0c;目…...

大语言模型:从诞生到未来的探索

1 发展历程 1.1 早期探索&#xff1a;基础积累 大语言模型的发展并非一蹴而就&#xff0c;其源头可以追溯到自然语言处理的早期阶段。早期的自然语言处理系统主要基于规则和模板&#xff0c;通过人工编写的语法规则来处理文本。例如&#xff0c;早期的机器翻译系统就是根据预…...

DeepSeek-V3:AI语言模型的高效训练与推理之路

参考&#xff1a;【论文学习】DeepSeek-V3 全文翻译 在人工智能领域&#xff0c;语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型&#xff0c;技术的进步令人瞩目。然而&#xff0c;随着模型规模的不断扩大&#xff0c;训练成本和推理效率成为了摆在…...

【多模态】Magma多模态AI Agent

1. 前言 微软杨建伟团队&#xff0c;最近在AI Agent方面动作连连&#xff0c;前两天开源了OmniParser V2&#xff0c;2月26日又开源了Magma&#xff0c;OmniParser专注在对GUI的识别解析&#xff0c;而Magma则是基于多模态技术&#xff0c;能够同时应对GUI和物理世界的交互&…...

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…...

DeepSeek在PiscTrace上完成个性化处理需求案例——光流法将烟雾动态可视化

引言&#xff1a;PiscTrace作为开放式的视图分析平台提供了固定格式的类型参数支持个性化定制处理需求&#xff0c;本文一步步的实现光流分析按照不同需求根据DeepSeek的代码处理视频生成数据。 光流法&#xff08;Optical Flow&#xff09;是一种基于图像序列的计算机视觉技术…...

explore与explode词源故事

英语单词explore来自古法语&#xff0c;源自拉丁语&#xff0c;由前缀ex-&#xff08;出来&#xff09;加词根plor-&#xff08;叫喊&#xff09;以及末尾的小尾巴-e组成&#xff0c;字面意思就是“喊出来&#xff0c;通过叫喊声赶出来”。它为什么能表示“探索”呢&#xff1f…...

LeeCode题库第三十七题

37.解数独 项目场景&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请…...

【数字信号处理:从原理到应用的深度剖析】

一、数字信号处理的原理 数字信号处理&#xff08;DSP&#xff09;是一种通过数学算法对信号进行分析、处理和转换的技术。其核心在于对离散时间信号的操作&#xff0c;目的是提取有用信息或将信号转换为更易于解释的形式。 &#xff08;一&#xff09;信号的数字化过程 1. …...

MySQL 数据库安全配置最佳实践

文章目录 MySQL 数据库安全配置最佳实践账户与权限管理账户最小化原则权限最小化配置密码策略强化 认证与访问控制禁用匿名账户启用安全认证 网络安全防护访问源限制禁用远程root访问启用SSL加密 日志审计与监控全量审计配置二进制日志管理 服务端安全加固关键参数配置文件权限…...

小红书自动评论

现在越来越多的人做起来小红书&#xff0c;为了保证自己的粉丝和数据好看&#xff0c;需要定期养号。 那么养号除了发视频外&#xff0c;还需要积极在社区互动&#xff0c;比如点赞、评论等等&#xff0c;为了节省时间&#xff0c;我做了一个自动化评论工具。 先看效果 那这个是…...

OpenCV图像认知(一)

OpenCV&#xff1a; 是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库&#xff0c;支持与计算机视觉和机器学习相关的众多算法 OpenCV-Python&#xff1a; OpenCV-Python是一个Python绑定库&#xff0c;旨在解决计算机视觉问题。 Python是一种由Gui…...

自学微信小程序的第六天

DAY6 1、使用录音API首先需要通过wx.getRecorderManager()方法获取到一个RecorderManager实例,该实例是一个全局唯一的录音管理器,用于实现录音功能。 表32:RecorderManager实例的常用方法 方法名称 说明 start() 开始录音 pause() 暂停录音 resume() 继续录音 stop() 停止…...

C++动态与静态转换区别详解

文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中&#xff0c;dynamic_cast 和 static_cast 是两种不同的类型转换操作符&#xff0c;主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别&#xff1a; 一、 类…...

Qt6.8编译项目找不到文件——6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist.

问题&#xff1a;Error: dependent ‘…\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow’ does not exist. jom: D:\Temp\untitled1\build\Makefile [release] Error 2 20:20:43: 进程"D:\ProgramFiles\Develop\Qt6.8.2\Tools\QtCreator\bin\jom\jom.exe"…...

AI工具导航平台功能模块之混合分类器功能说明文档

AI工具导航平台功能模块之混合分类器功能说明文档 这是我最近正在开发的AI工具信息平台的部门功能模块混合分类器的说明文档&#xff0c;我的AI工具信息平台基于streamlit架构&#xff0c;整理出来与大家分享。 该程序的混合分类器采用规则引擎与深度学习模型协同工作的架构&…...

【时序预测】在线学习:算法选择(从线性模型到深度学习解析)

——如何为动态时序预测匹配最佳增量学习策略&#xff1f; 引言&#xff1a;在线学习的核心价值与挑战 在动态时序预测场景中&#xff08;如实时交通预测、能源消耗监控&#xff09;&#xff0c;数据以流式&#xff08;Streaming&#xff09;形式持续生成&#xff0c;且潜在的…...

某个设备的RJ45网口接头为何不可连接任何POE设备

某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么&#xff1f; POE设备是指支持通过以太网线传输电力和数据的设备&#xff0c;即“Power over Ethernet”&#xff08;PoE&#xff09;技术的设备。这种技术允许网络设备在传输数据的同时&#xff0c;通过标准的RJ4…...

发展中的脑机接口:SSVEP特征提取技术

一、简介 脑机接口&#xff08;BCI&#xff09;是先进的系统&#xff0c;能够通过分析大脑信号与外部设备之间建立通信&#xff0c;帮助有障碍的人与环境互动。BCI通过分析大脑信号&#xff0c;提供了一种非侵入式、高效的方式&#xff0c;让人们与外部设备进行交流。BCI技术越…...

绕过密码卸载360终端安全管理系统

一不小心在电脑上安装了360终端安全管理系统&#xff0c;就会发现没有密码&#xff0c;就无法退出无法卸载360&#xff0c;很容易成为一个心病&#xff0c;360终端安全管理系统&#xff0c;没有密码&#xff0c;进程无法退出&#xff0c;软件无法卸载&#xff0c;前不久听同事说…...

Java数据结构第十五期:走进二叉树的奇妙世界(四)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、二叉树OJ练习题&#xff08;续&#xff09; 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…...

Transformer 代码剖析9 - 解码器模块Decoder (pytorch实现)

一、模块架构全景图 1.1 核心功能定位 Transformer解码器是序列生成任务的核心组件&#xff0c;负责根据编码器输出和已生成序列预测下一个目标符号。其独特的三级注意力机制架构使其在机器翻译、文本生成等任务中表现出色。下面是解码器在Transformer架构中的定位示意图&…...

JAVA八股—计算机网络(自用)

JAVA八股—计算机网络&#xff08;自用&#xff09; 2.7 1.介绍一下TCP/IP模型和OSI模型的区别 OSI模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;将计算机网络通信划分为七个不同的层级&#xff0c;每个层级都负责特定的功能。每个…...

unity和unity hub关系

unity和unity hub关系 Unity和Unity Hub是紧密相关但功能不同的两个软件,以下是它们的关系说明: Unity 定义:是一款专业的实时3D开发平台,广泛用于创建各种类型的3D和2D互动内容,如视频游戏、建筑可视化、汽车设计展示、虚拟现实(VR)和增强现实(AR)应用等。功能:提供…...

Linux的OOM机制

Linux 的 OOM&#xff08;Out of Memory&#xff09;机制是操作系统在内存耗尽时采取的一种保护措施。当系统内存不足&#xff0c;无法继续分配给进程时&#xff0c;Linux 内核会触发 OOM 杀手&#xff08;OOM Killer&#xff09;&#xff0c;选择并终止某些进程&#xff0c;以…...

Typora的Github主题美化

[!note] Typora的Github主题进行一些自己喜欢的修改&#xff0c;主要包括&#xff1a;字体、代码块、表格样式 美化前&#xff1a; 美化后&#xff1a; 一、字体更换 之前便看上了「中文网字计划」的「朱雀仿宋」字体&#xff0c;于是一直想更换字体&#xff0c;奈何自己拖延症…...

Cursor配置MCP Server

一、什么是MCP MCP&#xff08;Model Context Protocol&#xff09;是由 Anthropic&#xff08; Claude 的那个公司&#xff09; 推出的开放标准协议&#xff0c;它为开发者提供了一个强大的工具&#xff0c;能够在数据源和 AI 驱动工具之间建立安全的双向连接。 举个好理解…...