一、什么是API
API(Application Programming Interface,应用程序编程接口)是一种定义软件组件之间如何交互的技术规范。它是一种软件中间件,使得不同的软件应用程序可以相互通信。API指定了请求的格式(如HTTP请求)以及响应的格式(如JSON或XML),使得一个应用程序可以请求另一个服务或系统的功能,并获得所需的响应数据。
简而言之,API就像是一个菜单,它列出了服务提供者能提供哪些功能(“也就是菜单上的菜”),以及如何点这些“菜”(即如何发起请求)。当你向服务员说你要点哪些菜的时候,就相当于向他发送API请求,而再然后他把你点的菜给端上来,而你不需要知道这个菜是怎么做出来,怎么到服务员手中的。简单来说开发者可以根据这个“菜单”来开发自己的应用程序,无需关心服务内部的实现细节。
二、文心一言API调用
要想调用文心一言的API,首先我们需要在浏览器搜索,千帆大模型平台。这一步的意义就是为了获取API_KEY以及SECRET_KEY,这两个密钥在调用API时非常重要,他决定了你的调用是否能成功。
我们打开千帆大模型平台。千帆大模型平台-百度智能云千帆
登录自己的百度账号。登录完成后,向下翻一点,找到前往模型广场。
之后进入到模型选择界面。
我们可以看到,有非常多的模型,我们可以选择自己喜欢的,API调用的方法都是相同的,这里我们就选择文心一言做演示。
我们点击左边的控件,选择应用接入。
点击创建应用。
我们填入应用名称,以及应用描述,并且将所有的服务全部勾选上。最后点击确定创建应用。
创建成功后,我们就可以在我们的应用界面看到我们刚刚创建的文心一言了。
这一步的作用就是为了获得我们的API_KEY和SECREAT_KEY,接下来我们就可以开始调用API了。
首先,我们回到首页,点击左上角的服务支持。
找到下面的自助服务,点击查看全部。
点击我们最近访问的AI。这里我们就选择文心一言。
点击进去后,我们需要做的第一步就是鉴权,也就是获取API_KEY以及SECRET_KEY,
在这里选择我们刚刚创建的应用。
选择完毕后,我们可以发现,我们的左上角已经显示了已鉴权。
下面我们随便向AI发送一段对话。这里我发的就是你好。
当发送完成后,我们就可以在左侧的调试列表,出现我们输入的信息。
接着我们点击调试。
然后我们点击示例代码里的Java代码,他就能给出我们调取API代码的示例了。
我们可以看到代码,其实他的原理就是通过发送POST请求进行对话,但现在我们可以发现,没有接收的功能,而他返回的JSON数据并没有被解析。因此我们需要解析它返回的json数据。以及,当前的示例只能传输固定的对话,”你好“,我们也需要对这里进行修改。
三、代码修改
首先我们需要打开IDEA。如果不会安装IDEA可以去看我的另一篇CSDN。
【小白向】从零开的intellij IDEA安装教程-CSDN博客
我们新建一个项目。
选择储蓄位置,以及构建系统格式选择Maven。
创建新项目。
我们按照示例代码重新构建代码。
首先我们需要添加我们所需的HTTP依赖以及JSON依赖,将我们的依赖添加到pom.xml文件中。
<dependencies>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
</dependencies>
添加完成后,我们点击右侧的同步Maven更改。等待它同步完成。
接下来我们效仿官方给我们的示例,首先引入我们所需的头文件。
import okhttp3.*;
import org.json.JSONObject;
import java.io.*;
其中okhttp库,是用于高效处理HTTP请求的库,因为我们需要向服务器发送POST请求,以及接收服务器返回的数据。
org.json.JOSNObject,用于解析和生成JSON格式数据。由于我们向服务器发送POST请求,他们回传给我们的是JSON字符串。因此我们需要解析字符串,
第三个是Java标准库中的输入输出(I/O)类,这里主要用于处理数据流,这里主要用来处理一些字节流,
然后,我们就可以在创建的类里定义我们的API_KEY以及SECRET_KEY。
public static final String API_KEY = "YOUR_API_KEY";
public static final String SECRET_KEY = "YOUR_SECRET_KEY";
接着我们还需要创建一个全局唯一且线程安全的HTTP客户端,用来访问服务端。
static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
我们看到他的调用示例。
public static void main(String []args) throws IOException{
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"messages\":[{\"role\":\"user\",\"content\":\"你好\"},{\"role\":\"assistant\",\"content\":\"你好!很高兴与你交流。如果你有任何问题或需要帮助,请随时告诉我,我会尽力为你提供支持。\"}],\"temperature\":0.95,\"top_p\":0.8,\"penalty_score\":1,\"enable_system_memory\":false,\"disable_search\":false,\"enable_citation\":false}");
Request request = new Request.Builder()
.url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + getAccessToken())
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
System.out.println(response.body().string());
}
当构建完你HTTP客户端后,我们就可以通过OkHttp发送HTTP POST请求到文心一言的接口,
MediaType mediaType = MediaType.parse("application/json");
以及他在后面构建了请求体,里面就有我们要给它发的话,以及一些特殊的参数,这是非常重要的,不同的AI开发的接口他们的请求体之间都有差异,因此我们要根据实际情况来进行分析。
为了更加直观的看出他的请求体里都有些什么,我们可以单独封装一个方法来处理message数组。
static String getAIresponse() throws IOException {
// 1. 构建完整的 messages 数组(示例包含对话上下文)
JSONArray messagesArray = new JSONArray();
// 添加用户消息
JSONObject userMessage = new JSONObject();
userMessage.put("role", "user");
userMessage.put("content", "你好,今天天气如何?");
messagesArray.put(userMessage);
//构建 messages 数组
JSONObject requestbody = new JSONObject();
requestbody.put("messages", messagesArray);
requestbody.put("temperature", 0.95);
requestbody.put("top_p", 0.8);
requestbody.put("penalty_score", 1);
requestbody.put("enable_system_memory", false);
requestbody.put("disable_search", false);
requestbody.put("enable_citation", false);
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, requestbody.toString());
Request request = new Request.Builder()
.url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + getAccessToken())
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
String responseBody = response.body().string();
JSONObject jsonResponse = new JSONObject(responseBody);
return jsonResponse.getString("result");
}
这里面就包含了结构体发送,以及json数据处理的全过程,我们可以单独看看,message数组与之前的对比,会发现类容差不多,而且直观了不少。
而且我们可以注意到,他的一些必要参数,我们也必须加入到结构体中,否则发送过去AI不会回复。
最后我们需要鉴权,直接将他的代码复制过来就行。
static String getAccessToken() throws IOException {
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
+ "&client_secret=" + SECRET_KEY);
Request request = new Request.Builder()
.url("https://aip.baidubce.com/oauth/2.0/token")
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
return new JSONObject(response.body().string()).getString("access_token");
}
这时我们点击运行程序。会发现他输出Timeout。
这是因为他回复的内容较长,因此他的响应时间也变成了,因此我们需要手动增加他的响应时长。
在前面构建客服端中直接将响应时间增加30秒即可。
static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder()
.readTimeout(30, TimeUnit.SECONDS) // 读取超时时间30秒
.build();
这次我们在运行程序,等待一会儿。就可以看到在控制台输出信息,至此我们调取文心一言的API就完成了。