百度文心一言接入教程-Java版
原文链接
前言
前段时间由于种种原因我的AI BOT网站停运了数天,后来申请了百度的文心一言和阿里的通义千问开放接口,文心一言的接口很快就通过了,但是文心一言至今杳无音讯。文心一言通过审之后,很快将AI BOT的AI能力接入了文心一言,这里记录一下具体的接入方案。
文心一言应用创建
首先需要先申请文心千帆大模型,申请地址:文心一言 (baidu.com),点击加入体验,等通过审核之后就可以进入文心千帆大模型后台进行应用管理了。
在百度智能云首页即可看到文心千帆大模型平台

然后进入后台管理之后,点击应用接入,创建应用即可

创建完应应用之后,便可以调用文心一言的http开发接口进行交互了。
接口对接
接口文档
首先要看一下接口文档:API调用指南 - 文心千帆WENXINWORKSHOP | 百度智能云文档 (baidu.com)
这里我用的是ERNIE-Bot-turbo API,主要是由于它响应更快。
下面介绍一下具体接入的代码
代码示例
依赖
- 依赖安装
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>baidu</artifactId><groupId>com.walter</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><version>1.0</version><artifactId>baidumodel</artifactId><description>百度大模型</description><repositories><repository><id>public</id><name>aliyun nexus</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></repository></repositories><dependencies><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.1</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-http</artifactId><version>5.8.11</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.8.11</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp-sse</artifactId><version>3.14.9</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version></dependency></dependencies>
</project>
常量类
- ApiConstant.java
@Slf4j
public class ApiConstant {/*** ERNIE_BOT_TURBO 发起会话接口*/public static final String ERNIE_BOT_TURBO_INSTANT = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=";public static String getToken(String appKey, String secretKey) {String url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + appKey + "&client_secret=" + secretKey;String s = HttpUtil.get(url);Token bean = JSONUtil.toBean(s, Token.class);return bean.getAccess_token();}
}
实体类
- BaiduChatMessage.java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BaiduChatMessage implements Serializable {private String role;private String content;
}
- ErnieBotTurboResponse.java
@Data
public class ErnieBotTurboResponse implements Serializable {private String id;private String object;private Integer created;private String sentence_id;private Boolean is_end;private Boolean is_truncated;private String result;private Boolean need_clear_history;private Usage usage;@Datapublic static class Usage implements Serializable {private Integer prompt_tokens;private Integer completion_tokens;private Integer total_tokens;}
}
- ErnieBotTurboStreamParam.java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ErnieBotTurboStreamParam implements Serializable {private List<BaiduChatMessage> messages;private Boolean stream;private String user_id;public boolean isStream() {return Objects.equals(this.stream, true);}
}
- Token.java
@Data
public class Token implements Serializable {private String access_token;private Integer expires_in;private String error;private String error_description;
}
- BaiduEventSourceListener.java
// 这个类主要是为了与文心一言API建立流式连接,实现数据的实时返回,而不是等完整的数据生成之后才将数据返回
// 可以减少用户等待时间,实现更好的交互体验
@Slf4j
public class BaiduEventSourceListener extends EventSourceListener {@Overridepublic void onOpen(EventSource eventSource, Response response) {log.info("baidu建立sse连接...");}@Overridepublic void onEvent(EventSource eventSource, String id, String type, String data) {log.info("baidu返回数据:{}", data);}@Overridepublic void onClosed(EventSource eventSource) {log.info("baidu关闭sse连接...");}@SneakyThrows@Overridepublic void onFailure(EventSource eventSource, Throwable t, Response response) {if(Objects.isNull(response)){log.error("baidu sse连接异常:{}", t);eventSource.cancel();return;}ResponseBody body = response.body();if (Objects.nonNull(body)) {log.error("baidu sse连接异常data:{},异常:{}", body.string(), t);} else {log.error("baidu sse连接异常data:{},异常:{}", response, t);}eventSource.cancel();}
}
- BaiduService.java
// 该类主要是处理接口请求,处理接口响应逻辑
@Slf4j
@Data
public class BaiduService {private static final long TIME_OUT = 30;private OkHttpClient okHttpClient;private String appKey;private String secretKey;public BaiduService(@NonNull String appKey, @NonNull String secretKey) {this.appKey = appKey;this.secretKey = secretKey;this.okHttpClient(30, 30, 30, null);}public BaiduService(@NonNull String appKey, @NonNull String secretKey, long connectTimeout, long writeTimeout, long readTimeout, Proxy proxy) {this.appKey = appKey;this.secretKey = secretKey;this.okHttpClient(connectTimeout, writeTimeout, readTimeout, proxy);}private void okHttpClient(long connectTimeout, long writeTimeout, long readTimeout, Proxy proxy) {OkHttpClient.Builder client = new OkHttpClient.Builder();client.connectTimeout(connectTimeout, TimeUnit.SECONDS);client.writeTimeout(writeTimeout, TimeUnit.SECONDS);client.readTimeout(readTimeout, TimeUnit.SECONDS);if (Objects.nonNull(proxy)) {client.proxy(proxy);}this.okHttpClient = client.build();}// 该方法是同步请求API,会等大模型将数据完全生成之后,返回响应结果,可能需要等待较长时间,视生成文本长度而定public ErnieBotTurboResponse ernieBotTurbo(ErnieBotTurboStreamParam param) {if (param == null) {log.error("参数异常:param不能为空");throw new RuntimeException("参数异常:param不能为空");}if (param.isStream()) {param.setStream(false);}String post = HttpUtil.post(ApiConstant.ERNIE_BOT_TURBO_INSTANT + ApiConstant.getToken(appKey, secretKey), JSONUtil.toJsonStr(param));return JSONUtil.toBean(post, ErnieBotTurboResponse.class);}// 该方法是通过流的方式请求API,大模型每生成一些字符,就会通过流的方式相应给客户端,// 我们是在 BaiduEventSourceListener.java 的 onEvent 方法中获取大模型响应的数据,其中data就是具体的数据,// 我们获取到数据之后,就可以通过 SSE/webscocket 的方式实时相应给前端页面展示public void ernieBotTurboStream(ErnieBotTurboStreamParam param, EventSourceListener eventSourceListener) {if (Objects.isNull(eventSourceListener)) {log.error("参数异常:EventSourceListener不能为空");throw new RuntimeException("参数异常:EventSourceListener不能为空");}if (param == null) {log.error("参数异常:param不能为空");throw new RuntimeException("参数异常:param不能为空");}if (!param.isStream()) {param.setStream(true);}try {EventSource.Factory factory = EventSources.createFactory(this.okHttpClient);ObjectMapper mapper = new ObjectMapper();String requestBody = mapper.writeValueAsString(param);Request request = new Request.Builder().url(ApiConstant.ERNIE_BOT_TURBO_INSTANT + ApiConstant.getToken(appKey, secretKey)).post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody)).build();//创建事件EventSource eventSource = factory.newEventSource(request, eventSourceListener);} catch (JsonProcessingException e) {log.error("请求参数解析是失败!", e);throw new RuntimeException("请求参数解析是失败!", e);}}
}
结束语
以上就是通过文心一言的OpenAPI与大模型交互的整体逻辑,等代码功能再做完善之后,改代码会以SDK的方式开源到Gitee,欢迎一起探讨
相关文章:
百度文心一言接入教程-Java版
原文链接 前言 前段时间由于种种原因我的AI BOT网站停运了数天,后来申请了百度的文心一言和阿里的通义千问开放接口,文心一言的接口很快就通过了,但是文心一言至今杳无音讯。文心一言通过审之后,很快将AI BOT的AI能力接入了文心…...
Games101学习笔记 - 基础数学
向量 向量:方向和长度,没有起始位置 向量长度:各个方向平方相加开方 单位向量:向量除向量的长度 点乘 在笛卡尔坐标系中的点乘计算: 几何意思: 表示一个向量在另一个向量上的投影点乘在图形学中应用&a…...
Linux进程的认识
查看进程指令proc/ps 注意哦, 我们经常使用的指令, 像ls, touch…这些指令在启动之后本质上也是进程 proc 是内存文件系统, 存放着当前系统的实时进程信息. 每一个进程在系统中, 都会存在一个唯一的标识符(pid -> process id), 就如同学生在学校里有一个专门的学号一样. 大…...
向量vector与sort()
运行代码: //向量与sort() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;friend istream& operator>>(istream& is, Item& ii);friend ostream& operator<<(ostream& o…...
Netty学习(三)
文章目录 三. Netty 进阶1. 粘包与半包1.1 粘包现象服务端代码客户端代码 1.2 半包现象服务端代码客户端代码 1.3 现象分析粘包半包缘由滑动窗口MSS 限制Nagle 算法 1.4 解决方案方法1,短链接方法2,固定长度方法3,固定分隔符方法4,…...
c++学习(布隆过滤器)[23]
布隆 布隆过滤器(Bloom Filter)是一种概率型数据结构,用于判断一个元素是否可能存在于一个集合中。它使用多个哈希函数和位图来表示集合中的元素。 布隆过滤器的基本原理如下: 初始化:创建一个长度为m的位图…...
React的UmiJS搭建的项目集成海康威视h5player播放插件H5视频播放器开发包 V2.1.2
最近前端的一个项目,大屏需要摄像头播放,摄像头厂家是海康威视的,网上找了一圈都没有React集成的,特别是没有使用UmiJS搭脚手架搭建的,所以记录一下。 海康威视的开放平台的API地址,相关插件和文档都可以下…...
细讲TCP三次握手四次挥手(二)
TCP/IP 协议族 应用层 应用层( application-layer )的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…...
LeetCode Top100 Liked 题单(序号19~)
19. Remove Nth Node From End of List 题意:给一个链表,删除从尾数起的第n个结点,返回头节点。 我的思路 指针到最后,数出来有多少个,之从前向后数,再删掉节点 代码 10ms Beats 16.06% class Solution…...
qssh使用
到官网下载qssh的源码QSsh-botan-1,使用qtcreator打开后,直接编译,即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下,即为库头文件。 qssh有个问题,如果你将qssh的类放在子线程…...
持续部署CICD
目录 (1)CICD的开展场景 (2)项目实际应用 CICD 是持续集成(Continuous Integration)和持续部署(Continuous Deployment)简称。指在研发过程中自动执行一系列脚本来降低开发引入 bug…...
ARM 循环阻塞延迟函数
串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平,比如单总线、I2c这样基本的可以用GPIO模拟的时序协议,需要主从双方,必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以,在这种对时间要求很敏…...
Spark的DataFrame和Schema详解和实战案例Demo
1、概念介绍 Spark是一个分布式计算框架,用于处理大规模数据处理任务。在Spark中,DataFrame是一种分布式的数据集合,类似于关系型数据库中的表格。DataFrame提供了一种更高级别的抽象,允许用户以声明式的方式处理数据,…...
WPF线程使用详解:提升应用性能和响应能力
在WPF应用程序开发中,线程的合理使用是保证应用性能和响应能力的关键。WPF提供了多种线程处理方式,包括UI线程、后台线程、Task/Async Await和BackgroundWorker。这些方式与传统的Thread类相比,更加适用于WPF框架,并能够简化线程操…...
ava版知识付费平台免费搭建 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台
提供私有化部署,免费售后,专业技术指导,支持PC、APP、H5、小程序多终端同步,支持二次开发定制,源码交付。 Java版知识付费-轻松拥有知识付费平台 多种直播形式,全面满足直播场景需求 公开课、小班课、独…...
libuv库学习笔记-basics_of_libuv
Basics of libuv libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop,还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具,例如定时器,非阻塞的网络支持,异步文件系统访问,子进…...
【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Vue + Element-ui组件上传图片报错问题解决方案
在前端开发中,我们经常需要模拟网络请求以进行单元测试或开发调试。而在模拟网络请求时,我们常常会使用到MockXMLHttpRequest对象。MockXMLHttpRequest对象是一个用于模拟XMLHttpRequest对象的工具,它提供了一种简单的方式来模拟网络请求&…...
java商城系统和php商城系统对比
java商城系统和php商城系统是两种常见的电子商务平台,它们都具有一定的优势和劣势。那么,java商城系统和php商城系统又有哪些差异呢? 一、开发难度 Java商城系统和PHP商城系统在开发难度方面存在一定的差异。Java商城系统需要使用Java语言进…...
某制造企业基于 KubeSphere 的云原生实践
背景介绍 随着业务升级改造与软件产品专案的增多,常规的物理机和虚拟机方式逐渐暴露出一些问题: 大量服务部署在虚拟机上,资源预估和硬件浪费较大;大量服务部署在虚拟机上,部署时间和难度较大,自动化程度…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
