用【Java】调用百度千帆大模型并提供流式接口【SSE】响应

代码参考:

千帆API流式调用:PHP、JS、Nodejs、Python、Java、C# 、Go流式示例代码 - 百度智能云千帆社区本文旨在提供一个全面的指南,涵盖了在PHP、JS、Nodejs、Python、Java、C# 中流式调用千帆API的关键技巧和最佳实践。不论您是初学者还是有经验的开发者,相信这里的内容都能帮助您提升icon-default.png?t=N7T8https://cloud.baidu.com/qianfandev/topic/268202

效果演示:

API服务:

接口地址:

V1版本:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/chat?accessToken=ACCESSTOKEN&prompt=PROMPT

V2版本使用WebFlux:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/v2/chat?accessToken=ACCESSTOKEN&prompt=PROMPT

请求方式:GET

参数替换:

替换ACCESSTOKEN为自己的

替换PROMPT为自己要提问的问题

注意:服务器带宽有限,请不要恶意攻击

Java-Controller代码:

/*** 发送问题** @param apiKey - 用于获取token的apiKey* @param secretKey - 用于获取token的secretKey* @param accessToken - 接口token* @param prompt - 用于权限验证,从服务接口认证信息中获取* @return 百度千帆的回答*/@GetMapping(value = "/baidu/qianfan/chat")public void baiduQianfanChat(@RequestParam(value ="apiKey",required = false) String apiKey,@RequestParam(value ="secretKey",required = false) String secretKey,@RequestParam(value ="accessToken",required = false) String accessToken,@RequestParam(value ="prompt",required = false) String prompt,HttpServletResponse res) throws Exception {LiteLLMResult bean = new LiteLLMResult();QianFanResponseDTO responseDTO = new QianFanResponseDTO();log.info("【百度千帆-prompt内容】:{}", prompt);// 响应流res.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_EVENT_STREAM_VALUE);res.setCharacterEncoding("UTF-8");res.setHeader(HttpHeaders.PRAGMA, "no-cache");ServletOutputStream out = null;String REQ_URL = null;try {out = res.getOutputStream();if (StrUtil.isEmpty(prompt)) {bean.fail("无效问题,请重新输入",500);out.write(JSON.toJSONString(bean).getBytes());return;}okhttp3.MediaType mediaType = okhttp3.MediaType.parse(MediaType.APPLICATION_JSON_VALUE);QianFanChatBean requestBean =  QianFanUtil.getRequestData(prompt);requestBean.setStream(true);RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(requestBean));boolean flag = StrUtil.isEmpty(apiKey)||StrUtil.isEmpty(secretKey);if(flag && StrUtil.isNotEmpty(accessToken)){REQ_URL = QianFanUtil.API_URL.replace("ACCESS_TOKEN",accessToken);}else if(StrUtil.isNotEmpty(apiKey)&&StrUtil.isNotEmpty(secretKey)){REQ_URL = QianFanUtil.API_URL.replace("ACCESS_TOKEN",QianFanUtil.getAccessToken(apiKey,secretKey));}else{bean.fail("apiKey|secretKey|accessToken参数为空,请检查",500);out.write(JSON.toJSONString(bean).getBytes());return;}Request request = new Request.Builder().url(REQ_URL).method(Method.POST.toString(), body).addHeader(Header.CONTENT_TYPE.getValue(), MediaType.APPLICATION_JSON_VALUE).build();Response response = QianFanUtil.HTTP_CLIENT.newCall(request).execute();try (ResponseBody responseBody = response.body()) {if (responseBody != null) {try (BufferedReader reader = new BufferedReader(responseBody.charStream())) {String line;while ((line = reader.readLine()) != null) {String result = line.replace("data: ", "");if(StrUtil.isNotEmpty(result)){QianFanResponseBean qianFanResponseBean = JSON.parseObject(result,QianFanResponseBean.class);responseDTO.setContent(qianFanResponseBean.getResult());bean.success("执行成功",responseDTO);out.write(JSON.toJSONString(bean).getBytes());out.flush();//防止返回内容重复或错误。暂停一下Thread.sleep(100);}}}finally {responseBody.close();response.close();QianFanUtil.HTTP_CLIENT.connectionPool().evictAll();QianFanUtil.HTTP_CLIENT.dispatcher().executorService().shutdown();QianFanUtil.HTTP_CLIENT.newCall(request).cancel();}}}} catch (Exception e) {bean.fail("系统内部错误,请联系管理员",500);out.write(JSON.toJSONString(bean).getBytes());return;} finally {try {if (out != null) {out.close();}} catch (IOException e) {bean.fail("系统内部错误,请联系管理员",500);out.write(JSON.toJSONString(bean).getBytes());return;}}}

LiteLLMResult

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LiteLLMResult extends BaseResponseBean {/*** 具体参数**/private XingHuoResponseDTO data;public LiteLLMResult success(String message, XingHuoResponseDTO data) {this.message = message;this.code = CommonConstant.SC_OK_200;this.data = data;return this;}public LiteLLMResult fail(String message, Integer code) {this.message = message;this.code = code;return this;}public LiteLLMResult error(String message) {this.message = message;this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;return this;}
}

BaseResponseBean

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class BaseResponseBean implements Serializable {private static final long serialVersionUID = 1L;private static final long timestamps = System.currentTimeMillis();/*** 返回处理消息*/public String log_id = timestamps+"-"+IdUtil.fastSimpleUUID();/*** 返回处理消息*/public String message = "ok";/*** 返回处理消息*/public String message_zh = "操作成功!";/*** 返回代码*/public Integer code = 200;/*** 时间戳*/public long timestamp = timestamps;/*** 作者*/public String author = "小帅丶";}

QianFanResponseDTO

@Data
public class QianFanResponseDTO{private String uId;private String content;private String chatId;
}

Nginx配置SSE

在自己域名反向代理的location下面配置即可

		 proxy_buffering off;proxy_cache off;proxy_set_header Connection '';chunked_transfer_encoding off;  # 开启分块传输编码tcp_nopush on;  # 开启TCP NOPUSH选项,禁止Nagle算法tcp_nodelay on;  # 开启TCP NODELAY选项,禁止延迟ACK算法# SSE事件流add_header Content-Type text/event-stream;add_header Cache-Control no-cache;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React18构建Vite+Electron项目以及打包

一.先创建项目 cnpm create vite 选择React > JavaScript >cd react_vite > cnpm i >npm run dev 二.安装Electron依赖 指定版本相对稳定 cnpm i electron19.0.10 -D cnpm i vite-plugin-electron0.9.3 -D cnpm i electron-builder23.0.1 -D三.创建electron目录…

《PyTorch基础教程》01 搭建环境 基于Docker搭建ubuntu22+Python3.10+Pytorch2+cuda11+jupyter的开发环境

01 环境搭建 《PyTorch基础教程》01 搭建环境 基于Docker搭建ubuntu22+Python3.10+Pytorch2+cuda11+jupyter的开发环境 Docker部署PyTorch 拉取cnstark/pytorch镜像 拉取镜像: docker pull cnstark/pytorch:2.0.1-py3.10.11-cuda11.8.0-ubuntu22.04导出镜像: docker sa…

前端面试拼图-数据结构与算法

摘要:总结一些前端算法题,持续更新! 一、数据结构与算法 时间复杂度-程序执行时需要的计算量(CPU) 空间复杂度-程序执行时需要的内存空间 前端开发:重时间,轻空间 1.把一个数组旋转k步 arr…

C语言——N/自定义类型:联合和枚举

目录 一、联合体 1、联合体类型的声明 2、联合体的特点 3、相同成员的结构体和联合体对比 4、联合体大小的计算 5、联合的一个练习 二、枚举类型 1、枚举类型的声明 2、枚举类型的优点 3、枚举类型的使用 一、联合体 1、联合体类型的声明 像结构体⼀样,…

互联网加竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …

京东广告算法架构体系建设--大规模稀疏场景高性能训练方案演变

一、前言 京东广告训练框架随着广告算法业务发展的特点也在快速迭代升级,回顾近几年大致经历了两次大版本的方案架构演变。第一阶段,随着2016年Tensorflow训练框架的开源,业界开始基于Tensorflow开源框架训练更复杂的模型。模型对特征规模和…

Mybatis test条件表达式类型问题

Mybatis test条件表达式类型问题 记录一个使用mybatis时遇到的一个逆天bug,坑了我俩小时 mapper接口: List<AirRasterDataVO> selectAirRasterDataByRegion(Param("size") int size, Param("provinceCode") String provinceCode, Param("par…

【代码随想录】LC 455. 分发饼干

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 455. 分发饼干 2、题目描述 二、解题报告 1、…

如何在PS5上使用金手指修改游戏

环境&#xff1a;windows PS5 问题&#xff1a;PS5 没有GodHen&#xff0c;无法使用json金手指&#xff0c;PKG金手指比较少 解决办法&#xff1a;使用MultiTrainerv从网络注入PS5&#xff0c;修改进程内存 背景&#xff1a;为了护肝&#xff0c;拒绝刷刷刷 解决过程&#xff…

pytest的常用插件和Allure测试报告

pytest常用插件 pytest-html插件 安装&#xff1a; pip install pytest-html -U 用途&#xff1a; 生成html的测试报告 用法&#xff1a; ​在.ini配置文件里面添加 addopts --htmlreport.html --self-contained-html 效果&#xff1a; 执行结果中存在html测试报告路…

GPT3.5\GPT4系列计算完整prompt token数的官方方法

前言: ChatGPT如何计算token数&#xff1f;https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502 GPT3.5\GPT4系列计算完整prompt token数的官方方法&#xff1…

Xmind 2023 下载安装教程,保姆级教程,小白也能轻松搞定,附安装包

前言 XMind 是一款非常实用的思维导图软件&#xff0c;应用全球最先进的Eclipse RCP 软件架构&#xff0c;全力打造易用、高效的可视化思维软件&#xff0c;强调软件的可扩展、跨平台、稳定性和性能&#xff0c;致力于使用先进的软件技术帮助。 准备工作 1、Win7 及以上系统…

在VM虚拟机搭建NFS服务器

NFS共享要求如下&#xff1a; &#xff08;1&#xff09;共享“/mnt/自已姓名的完整汉语拼音”目录&#xff0c;允许XXX网段的计算机访问该共享目录&#xff0c;可进行读写操作。&#xff08;说明&#xff1a;XXX网段&#xff0c;请根据你的规划&#xff0c;再具体指定&#xf…

MySQL之DQL正则表达式

正则表达式 正则表达式(regular expression)描述了一种字符串匹配的规则&#xff0c;正则表达式本身就是一个字符串&#xff0c;使用这个字符串来描述、用来定义匹配规则&#xff0c;匹配一系列符合某个句法规则的字符串。在开发中&#xff0c;正则表达式通常被用来检索、替换…

【Java万花筒】Java爬虫宝典:从静态到动态,找到最适合你的工具

信息搜集大作战&#xff1a;四大爬虫工具助您驰骋数据海洋 前言 在当今信息爆炸的时代&#xff0c;获取并处理互联网上的大量数据成为许多应用程序的核心需求。网络爬虫和数据抓取库成为开发者在构建这类应用时的得力助手。本文将深入探讨几个在Java生态系统中备受推崇的网络…

代码随想录算法训练营day39 || 62. 不同路径,63. 不同的路径||

视频讲解&#xff1a; 动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 动态规划&#xff0c;这次遇到障碍了| LeetCode&#xff1a;63. 不同路径 II_哔哩哔哩_bilibili 62. 不同路径 思路&#xff1a;和前一天的爬楼梯的思路基本…

C++初阶 内存管理和模板

目录 一、new 1.1什么是new&#xff1f; 1.2为什么要有new&#xff1f; 1.3使用new 1.4 new的超级好处 二、delete 2.1什么是delete&#xff1f; 2.2为什么要有delete&#xff1f; 2.3使用delete 三、 malloc / free和new / delete的共同点和区别 四、浅谈模板 4.1什…

【计网·湖科大·思科】实验七 路由信息协议RIP、开放最短路径优先协议OSPF、边界网关协议BGP

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

2024年第四届工业自动化、机器人与控制工程国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第四届工业自动化、机器人与控制工程国际会议&#xff08;IARCE 2024&#xff09; 会议时间&#xff1a;2024年7月5 -7日 召开地点&#xff1a;中国成都 大会官网&#xff1a;www.iarce.org 2024年第四届工业自动化、机器人与控制工程国际会…

ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景 工作中遇到的呗。记下来贡着。 滤镜重置时间戳&#xff1a;setptsPTS-STARTPTS 在FFmpeg中&#xff0c;setptsPTS-STARTPTS是一种用于调整视频时间戳&#xff08;PTS&#xff09;的滤镜表达式。这个表达式通常用于视频编辑和处理过程中&#xff0c;用于修改视频的时间轴…