1. 进入正题
目前spring-ai的版本是1.0.0-SNAPSHOT,以下的使用,如果没有特殊指出,使用的AI模型都是OpenAI。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
引入Spring AI Starter:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
application.yml增加配置
spring:
ai:
openai:
# 这里就是上文提到的Token,是与money挂钩的,注意别暴露给别人,使用是收费滴
api-key: ${OPNEAI-TOkEN}
base-url: ${OPNEAI-URL}
使用国外的AI Model需要魔法,可以自行去淘宝啥的买一个,注意由于是https请求,会找不到证书,把第三方平台的证书下载后放到java的信任目录下即可。
keytool -import -alias apikey -file "path\cert" -keystore "path\cacerts" -storepass changeit
2. Chat Client API
Chat Client提供了一组Fluent API,用于与模型进行通信,同时支持同步与响应式编程。
Fluent API具有构建Prompt功能的方法,包含指导模型的输出和行为的说明文本,从API的角度可以讲Prompt理解为消息集合。
AI 模型的消息主要有两种类型:
- 用户消息:来自用户端直接输入;
- 系统消息:系统生成以指导对话。
这些消息通常使用占位符,在运行的时候根据用户的输入进行替换,以自定义AI模型对用户输入的响应。还可以指定提示选项,比如使用AI模型的名称,和控制所生成的输出的随机性创造性的设置等。
Chat Client API可以理解为Spring AI提供的一套通用的AI API。
2.1 创建Chat Client
Spring AI提供了多种Chat Client的创建方式,其都是通过ChatClient.Builder创建的,但是可以通过不同的方式进行创建。
1. 使用自动配置的ChatClient.Builder
@RestController
@RequestMapping("/ai")
public class AiController {
private final ChatClient chatClient;
public AiController(ChatClient.Builder chatClientBuilder) {
// 使用ChatClient.Builder进行创建
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/chat01")
public String chat01(@RequestParam("message") String message) {
return this.chatClient.prompt()
// 用户输入的内容
.user(message)
// 向AI Model发送请求
.call()
// 将AI返回的结果输出为String
.content();
}
}
这只是一个简单的示例,使用ChatClient.Builder创建的ChatClient是通过自动装配进行Builder的,该方式不利于一个多同时使用多个聊天模型。
通过查看ChatClient.Builder.builder()可以发现其也是通过创建一个ChatModel后进行注入的。
class Builder {
private final ChatClientRequest defaultRequest;
private final ChatModel chatModel;
// ....
public ChatClient build() {
return new DefaultChatClient(this.chatModel, this.defaultRequest);
}
// ...
}
因此我们也可以自行通过ChatModel进行创建。
2. 通过ChatModel创建ChatClient
使用该种方式首先要在application.yml中增加属性spring.ai.chat.client.enabled=false
禁用自动配置
@GetMapping("/chat02")
public String chat02(@RequestParam("message") String message) {
String url = "https://api.openai.com";
String token = "sk-*************************";
ChatModel chatModel = new OpenAiChatModel(new OpenAiApi(url, token));
//
ChatClient.Builder builder = ChatClient.builder(chatModel);
ChatClient chatClientByBuilder = builder.build();
// 使用ChatClient.create()创建
// ChatClient chatClientByCreate = ChatClient.create(chatModel);
return chatClientByBuilder.prompt()
.user(message)
.call()
.content();
}
2.2 响应
ChatClient提供了多种方式进行格式化AI的输出。
1. 返回ChatResponse
上文中的chatClientByBuilder.prompt().user(message).call().content()
返回的是一个String,我们可以到content()方法中看一下:
public String content() {
return doGetChatResponse().getResult().getOutput().getContent();
}
private ChatResponse doGetChatResponse() {
return this.doGetChatResponse(this.request, "");
}
我们可以发现其就是通过返回ChatResponse之后获取的。
ChatResponse定义了丰富的结构,包括如何生成响应的元数据,还可以包含多个相应,每个响应都有自己的元数据。元数据包含用于创建响应的Tokens。
可以直接调用chatResponse()来获取ChatResponse对象。
@GetMapping("/chat02")
public ChatResponse chat02(@RequestParam("message") String message) {
return this.chatClient.prompt()
.user(message)
.call()