前段时间,百度文心一言&文心千帆大模型开放了API调用的测试,接下来,教大家申请测试资格并接入文心千帆大模型的API。
# 一、文心一言&文心千帆的测试资格申请
## 1. 确保拥有一个[百度智能云](https://cloud.baidu.com/ "百度智能云")的账号

右上角点击注册,内容如实填写并完成实名认证。

注册与认证详细内容不再赘述。
## 2. 文心千帆大模型资格申请
进入[文心一言&文心千帆大模型](https://cloud.baidu.com/product/wenxinworkshop "文心一言&文心千帆大模型")介绍页,点击申请体验

会进入填写问卷页,没有什么技巧,如实填写问卷信息即可,记得每一项要尽量详细,然后点击提交,接下来等待即可。
已经申请通过的会显示我这个页面。

不出意外的话,接下来一天两天内你会收到如下短信

收到信息代表你申请通过,并且会赠送一张20的券,可根据文档自行使用。
## 3.(可选,非必要)文心千帆控制台


在这里你可以进行模型的体验与参数调节,具体功能请各位自行摸索。
# 二、获取文心千帆的access_token
众所都周知,百度的文心千帆大模型是通过access_key进行鉴权的,所以我们要调用API必须要申请一个access_key。
## 1.创建应用,获取API Key与Secret Key
进入[文心千帆大模型控制台](https://console.bce.baidu.com/ai/#/ai/wenxinworkshop/overview/index "文心千帆大模型控制台"),点击创建应用。

填写你要创建的应用信息,最下面还有个应用介绍,如实填写就好。

创建成功后,左侧选择应用列表,里面可以看到刚刚创建的应用,里面包含了AppID、API Key、Secret Key(需点击显示),这些请务必不要泄露。

我们需要API Key、Secret Key
## 2. 获取access_token
### **方法一:浏览器发送请求**
复制这两个Key,并替换下面链接的 [API Key] 与 [Secret Key]
> https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]
例如:
> https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=ad456sa4d5fhr5kfh&client_secret=df45d14g5xsdtsc
浏览器访问这个链接,你会得到一个json报文

我们需要关心的是这两个键值对, expires_in 与 access_token
**expires_in**:Access Token的有效期(秒为单位,默认有效期30天)
**access_token**:要获取的Access Token;
### 方法二:百度在线调试工具
[在线调试工具](https://console.bce.baidu.com/tools/#/api?product=AI&project=%E6%96%87%E5%BF%83%E5%8D%83%E5%B8%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B9%B3%E5%8F%B0&parent=%E9%89%B4%E6%9D%83%E8%AE%A4%E8%AF%81%E6%9C%BA%E5%88%B6&api=oauth%2F2.0%2Ftoken&method=post "在线调试工具")

左侧输入 API Key 与 Secret Key ,点击调试即可,参数与方法一一致。
### 方法三:编写发送请求
[在线调试工具](https://console.bce.baidu.com/tools/#/api?product=AI&project=%E6%96%87%E5%BF%83%E5%8D%83%E5%B8%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B9%B3%E5%8F%B0&parent=%E9%89%B4%E6%9D%83%E8%AE%A4%E8%AF%81%E6%9C%BA%E5%88%B6&api=oauth%2F2.0%2Ftoken&method=post "在线调试工具")
这里面有每种语言的例程,可以直接复制修改。
# 三、接入文心一言API
[官方文档](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11 "官方文档")
官方文档提供了四个模型,其中ErnieBot就是我们熟悉的文心一言,我们以这个为例,其他的与之类似或相同。
作为Java程序员,我就分别以一个 Java 程序和 SpringBoot 应用为例介绍怎么接入。
## 方法一:原生接入(不推荐)
按照官方文档,使用Hutool的HttpUtils工具类或者是其他的Http客户端接入,这样可以获得最大的自由度,但是即为麻烦,并且流式返回处理较为复杂,需使用Flux响应式来做,比较麻烦,我用一个原生Java程序演示一下:
```java
public static void main(String[] args) {
String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions";
String accessToken = "你的access_token";
HashMap<String, String> msg = new HashMap<>();
msg.put("role", "user");
msg.put("content", "请介绍一下你自己");
ArrayList<HashMap> messages = new ArrayList<>();
messages.add(msg);
HashMap<String, Object> requestBody = new HashMap<>();
requestBody.put("messages", messages);
String response = HttpUtil.post(url + "?access_token=" + accessToken, JSONUtil.toJsonStr(requestBody));
System.out.println(response);
}
```
输出内容:
```json
{
"id": "as-mibg24yygj",
"object": "chat.completion",
"created": 1690270732,
"result": "您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。",
"is_truncated": false,
"need_clear_history": false,
"usage": {
"prompt_tokens": 8,
"completion_tokens": 49,
"total_tokens": 57
}
}
```
## 方法二:使用spring-boot-starter
**项目开源地址:**[https://github.com/gemingjia/gear-wenxinworkshop-starter](https://github.com/gemingjia/gear-wenxinworkshop-starter "https://github.com/gemingjia/gear-wenxinworkshop-starter")
1. 创建一个 SpringBoot 3.x应用程序(starter用的JDK17),选择JDK17及以上。
2. 引入maven坐标:
```xml
<dependency>
<groupId>io.github.gemingjia</groupId>
<artifactId>gear-wenxinworkshop-starter</artifactId>
<version>0.0.3.2</version>
</dependency>
```
3. 新建一个Controller
```java
@RestController
public class ChatController {
// 要调用的模型的客户端
@Resource
private ErnieBotClient ernieBotClient;
// 单次对话
@PostMapping("/chat")
public BaseResponse<String> chatSingle(String msg) {
ChatResponse response = ernieBotClient.chatSingle(msg);
return BaseResponse.success(response.getResult());
}
// 连续对话
@PostMapping("/chats")
public BaseResponse<String> chatCont(String msg) {
String chatUID = "test-user-1001";
ChatResponse response = ernieBotClient.chatCont(msg, chatUID);
return BaseResponse.success(response.getResult());
}
// 流式返回,单次对话
@PostMapping(value = "/stream/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public BaseResponse<Flux<ChatResponse>> chatSingleStream(String msg) {
Flux<ChatResponse> chatResponseFlux = ernieBotClient.chatSingleOfStream(msg);
return BaseResponse.success(chatResponseFlux);
}
// 流式返回,连续对话
@PostMapping(value = "/stream/chats", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public BaseResponse<Flux<ChatResponse>> chatContStream(String msg, String msgUid) {
Flux<ChatResponse> chatResponseFlux = ernieBotClient.chatContOfStream(msg, msgUid);
return BaseResponse.success(chatResponseFlux);
}
}
```
```java
@Data
public class BaseResponse<T> implements Serializable {
private int code;
private T data;
private String message;
public static <T> BaseResponse<T> success(T data) {
BaseResponse<T> resp = new BaseResponse<>();
resp.setData(data);
resp.setCode(HttpStatus.OK.value());
return resp;
}
public static <T> BaseResponse<T> error(int errorCode, String message) {
BaseResponse<T> resp = new BaseResponse<>();
resp.setCode(errorCode);
resp.setMessage(message);
return resp;
}
}
```
4. 运行起来,发送请求试一下

这是ErnieBot模型的演示,此外starter还提供了ErnieBotClient、ErnieBotTurboClient、Bloomz7BClient 三中模型的客户端,可自行选择使用。
如果这个starter帮助您节省了一部分的时间,还请点个star哦~
**项目开源地址&文档:**[https://github.com/gemingjia/gear-wenxinworkshop-starter](https://github.com/gemingjia/gear-wenxinworkshop-starter "https://github.com/gemingjia/gear-wenxinworkshop-starter")