原文鏈接
前言
前段時間由于種種原因我的AI BOT https://chat.jylt.top網(wǎng)站停運了數(shù)天,后來申請了百度的文心一言和阿里的通義千問開放接口,文心一言的接口很快就通過了,但是文心一言至今杳無音訊。文心一言通過審之后,很快將AI BOT的AI能力接入了文心一言,這里記錄一下具體的接入方案。歡迎前往網(wǎng)站體驗。
溫馨大模型SDK現(xiàn)已開源:https://gitee.com/gitwcx/baidu-model-java-sdk
文心一言應(yīng)用創(chuàng)建
首先需要先申請文心千帆大模型,申請地址:文心一言 (baidu.com),點擊加入體驗,等通過審核之后就可以進入文心千帆大模型后臺進行應(yīng)用管理了。
在百度智能云首頁即可看到文心千帆大模型平臺
然后進入后臺管理之后,點擊應(yīng)用接入,創(chuàng)建應(yīng)用即可
創(chuàng)建完應(yīng)應(yīng)用之后,便可以調(diào)用文心一言的http開發(fā)接口進行交互了。
接口對接
接口文檔
首先要看一下接口文檔:API調(diào)用指南 - 文心千帆WENXINWORKSHOP | 百度智能云文檔 (baidu.com)
這里我用的是ERNIE-Bot-turbo API,主要是由于它響應(yīng)更快。
下面介紹一下具體接入的代碼文章來源:http://www.zghlxwxcb.cn/news/detail-617271.html
代碼示例
依賴
- 依賴安裝
<?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 發(fā)起會話接口
*/
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;
@Data
public 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建立流式連接,實現(xiàn)數(shù)據(jù)的實時返回,而不是等完整的數(shù)據(jù)生成之后才將數(shù)據(jù)返回
// 可以減少用戶等待時間,實現(xiàn)更好的交互體驗
@Slf4j
public class BaiduEventSourceListener extends EventSourceListener {
@Override
public void onOpen(EventSource eventSource, Response response) {
log.info("baidu建立sse連接...");
}
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {
log.info("baidu返回數(shù)據(jù):{}", data);
}
@Override
public void onClosed(EventSource eventSource) {
log.info("baidu關(guān)閉sse連接...");
}
@SneakyThrows
@Override
public 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
// 該類主要是處理接口請求,處理接口響應(yīng)邏輯
@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,會等大模型將數(shù)據(jù)完全生成之后,返回響應(yīng)結(jié)果,可能需要等待較長時間,視生成文本長度而定
public ErnieBotTurboResponse ernieBotTurbo(ErnieBotTurboStreamParam param) {
if (param == null) {
log.error("參數(shù)異常:param不能為空");
throw new RuntimeException("參數(shù)異常: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,大模型每生成一些字符,就會通過流的方式相應(yīng)給客戶端,
// 我們是在 BaiduEventSourceListener.java 的 onEvent 方法中獲取大模型響應(yīng)的數(shù)據(jù),其中data就是具體的數(shù)據(jù),
// 我們獲取到數(shù)據(jù)之后,就可以通過 SSE/webscocket 的方式實時相應(yīng)給前端頁面展示
public void ernieBotTurboStream(ErnieBotTurboStreamParam param, EventSourceListener eventSourceListener) {
if (Objects.isNull(eventSourceListener)) {
log.error("參數(shù)異常:EventSourceListener不能為空");
throw new RuntimeException("參數(shù)異常:EventSourceListener不能為空");
}
if (param == null) {
log.error("參數(shù)異常:param不能為空");
throw new RuntimeException("參數(shù)異常: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();
//創(chuàng)建事件
EventSource eventSource = factory.newEventSource(request, eventSourceListener);
} catch (JsonProcessingException e) {
log.error("請求參數(shù)解析是失??!", e);
throw new RuntimeException("請求參數(shù)解析是失??!", e);
}
}
}
結(jié)束語
以上就是通過文心一言的OpenAPI與大模型交互的整體邏輯,等代碼功能再做完善之后,改代碼會以SDK的方式開源到Gitee,歡迎一起探討文章來源地址http://www.zghlxwxcb.cn/news/detail-617271.html
到了這里,關(guān)于百度文心一言接入教程-Java版的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!