目录
一、接入AI模块
在智谱 AI 开放平台页面 进行题目生成的演示,然后后端 sdk 引入。
1.智谱 AI 介绍
智谱 AI 开放平台:智谱AI开放平台
创建应用:应用 = 预定义了一些规则的大模型
在线体验:可用来测试不同大模型和参数的效果,支持 AI 绘画
2.使用智谱 AI SDK
需要阅读官方文档
使用指南:智谱AI开放平台
可以看到很多能力,比如知识库、网络搜索等
接口文档:智谱AI开放平台
有 3 种调用方式,SDK、HTTP 和第三方框架。
比较推荐 SDK,方便,不用自己构造 HTTP 请求并构造响应对象。
跟着官方文档去学习使用即可:智谱AI开放平台
Java 中使用 SDK
1)引入 maven:
<dependency>
<groupId>cn.bigmodel.openapi</groupId>
<artifactId>oapi-java-sdk</artifactId>
<version>release-V4-2.0.2</version>
</dependency>
2)创建单元测试来跑通 Demo
注意配置 apiKey,在智谱开放平台查看:智谱AI开放平台
package com.yupi.yudada;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.ChatCompletionRequest;
import com.zhipu.oapi.service.v4.model.ChatMessage;
import com.zhipu.oapi.service.v4.model.ChatMessageRole;
import com.zhipu.oapi.service.v4.model.ModelApiResponse;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class ZhiPuAiTest {
@Resource
private ClientV4 clientV4;
@Test
public void test() {
// 初始化客户端
// ClientV4 client = new ClientV4.Builder(KeyConstant.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 = clientV4.invokeModelApi(chatCompletionRequest);
System.out.println("model output:" + invokeModelApiResp.getData().getChoices().get(0));
}
}
每个参数的含义可以参考官方文档:智谱AI开放平台
其他用法
异步调用:相当于提交任务,可以之后查询任务状态并获取结果。
SSE 调用:流式、实时地获取到结果直到结束,可以优化用户体验。
3、封装 AI 模块
目的是更快速灵活地调用 AI 的能力,各项目都可以复用。
1)在 application.yml 中定义 AI 配置
ai:
apiKey: xxx
2)定义 AI 配置类,加载配置文件,初始化调用智谱的 Client 并将其注册为 bean。
@Configuration
@ConfigurationProperties(prefix = "ai")
@Data
public class AiConfig {
/**
* apiKey,需要从开放平台获取
*/
private String apiKey;
@Bean
public ClientV4 getClientV4() {
return new ClientV4.Builder(apiKey).build();
}
}
可以自己定制客户端的一些配置,后续 service 即可注入使用,不用再重复创建 Client 了。
3)智谱 SDK 提供的客户端已经很方便了,但我们仍然可以根据实际业务需求,封装本项目内通用的 AI 请求构建模块。
比如将复杂的消息、请求构建、从返回值中获取结果的过程进行封装。
一般建议先封装通用的方法,然后提供不同参数默认值的简化调用方法,层层简化。
最通用的方法,可自定义消息、是否流式、随机数:
在manager包下(区别于工具类给整个项目提供一种能力)
/**
* 通用请求
*
* @param messages
* @param stream
* @param temperature
* @return
*/
public String doRequest(List<ChatMessage> messages, Boolean stream, Float temperature) {
// 构建请求
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model(Constants.ModelChatGLM4)
.stream(stream)
.temperature(temperature)
.invokeMethod(Constants.invokeMethod)
.messages(messages)
.build();
try {
ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
return invokeModelApiResp.getData().getChoices().get(0).toString();
} catch (Exception e) {
e.printStackTrace();
throw new BusinessException(ErrorCode.SYSTEM_ERROR, e.getMessage());
}
}
通用请求,简化了消息传递:
/**
* 通用请求(简化消息传递)
*
* @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);
return doRequest(chatMessageList, stream, temperature);
}
通用同步请求:
/**
* 同步请求
*
*