项目背景:
项目背景是一个这个AI答题应用平台,我引入AI得作用就是让AI根据我指定得这个题目的标题和描述来生成一些列的题目。(主要功能是这个,但是还用了AI给我评分,不过这个功能比较简单,在本文就简单介绍)。
引入并整合智谱AI功能:
引入:
首先还是先贴一个官方文档:
大概的步骤就是:
引入依赖
直接复制官方文档的客户端代码(同步调用)
引入之后我们可以不着急去在项目中使用,可以先跑一个单元测试
@SpringBootTest
public class AItest {
private final String Key = "自己的Key";
//测试是否可以连接
@Test
public void test() {
ClientV4 client = new ClientV4.Builder(Key).build();
List<ChatMessage> messages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan");
messages.add(chatMessage);
// String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model(Constants.ModelChatGLM4)
.stream(Boolean.FALSE)
.invokeMethod(Constants.invokeMethod)
.messages(messages)
.build();
ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
try {
System.out.println("model output:" + invokeModelApiResp.getData().getChoices().get(0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
整体的代码逻辑:
首先先创建一个AI的客户端
接着拼接需要传给AI的信息列表,这里是ChatMessage
然后就是拼接这个需要发送的请求了
里面有蛮多的参数
model:模型,这个直接用最新的就行
stream:就是指定流式还是非流式
调用方法:这个默认就行
message:就是你要发送的信息
最后发送调用接收返回值
对AI的这种工具的一个封装和简化的思想
对于这种工具类,就可以把这个封装成自己的SDK,以后自己直接引入即可
1:编写一个配置类将这个AI的客户端交给IOC容器管理:
@Configuration
@Data
public class AiConfig {
private final String aiKey = "自己的key";
@Bean
public ClientV4 clientV4() {
return new ClientV4.Builder(aiKey).build();
}
}
2:编写这个工具类:
这里叫不叫工具类都可以,鱼皮老师的定义是需要引入Bean对象的可以在Manager包下管理
首先可以只有一个最简单的方法:
我们可以利用Java的重载来一层一层向上封装
我们可以考虑到,我们和AI对话,一般都是直接问他对吧,所以作为我们用户,我们最乐意的应该是直接传一个文本,但是这里我们还需要注意,我们为了让这个返回的答案更准确,我们可以封装一个系统的prompt,给AI一个背景。
所以我们向上封装:
我们在这个方法中只需要传系统的prompt和用户的prompt就可以了
还可以再往上封装
我们可以根据传递的参数
我们可以封装同步和异步:
其它都是同理了,直接看代码:
package com.ljh.aiplatform.manager;
import com.ljh.aiplatform.common.ErrorCode;
import com.ljh.aiplatform.exception.BusinessException;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.*;
import io.reactivex.Flowable;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* AI的请求
*/
@Component
public class AiManager {
@Resource
private ClientV4 clientV4;
// 稳定的随机数
private static final float STABLE_TEMPERATURE = 0.05f;
// 不稳定的随机数
private static final float UNSTABLE_TEMPERATURE = 0.99f;
/**
* 同步请求(答案不稳定)
*
* @param systemMessage
* @param userMessage
* @return
*/
public String doSyncUnstableRequest(String systemMessage, String userMessage) {
return doRequest(systemMessage, userMessage, Boolean.FALSE, UNSTABLE_TEMPERATURE);
}
/**
* 同步请求(答案较稳定)
*
* @param systemMessage
* @param userMessage
* @return
*/
public String doSyncStableRequest(String systemMessage, String userMessage) {
return doRequest(systemMessage, userMessage, Boolean.FALSE, STABLE_TEMPERATURE);
}
/**
* 同步请求
*
* @param systemMessage
* @param userMessage
* @param temperature
* @return
*/
public String doSyncRequest(String systemMessage, String userMessage, Float temperature) {
return doRequest(systemMessage, userMessage, Boolean.FALSE, temperature);
}
/**
* 通用请求(简化消息传递)
*
* @param systemMessage
* @param userMessage
* @param stream
* @param temperature
* @return
*/
public String doRequest(String systemMessage, String userMessage, Boolean stream, Float temperature) {
List<ChatMessage> chatMessageList = new ArrayList<>();
ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
chatMessageList.add(systemChatMessage);
ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
chatMessageList.add(userChatMessage);
retu