什么是GLM:
GLM 全名 General Language Model ,是一款基于自回归填空的预训练语言模型。ChatGLM 系列模型,支持相对复杂的自然语言指令,并且能够解决困难的推理类问题。该模型配备了易于使用的 API 接口,允许开发者轻松将其融入各类应用,广泛应用于智能客服、虚拟主播、聊天机器人等诸多领域。
SDK 安装说明
安装 Java SDK
Java SDK 地址: https://github.com/zhipuai/zhipuai-sdk-java-v4
如下方式,将SDK的依赖项加入到Maven项目:
<dependency>
<groupId>cn.bigmodel.openapi</groupId>
<artifactId>oapi-java-sdk</artifactId>
<version>release-V4-2.0.2</version>
</dependency>
Java SDK 创建 Client
使用 Java SDK 您替换自己的 ApiSecretKey 即可,示例如下:
ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}").build();
传输层默认使用 okhttpclient,如果需要修改为其他 http client,可以如下指定(注意 apache不支持sse调用):
ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}")
.httpTransport(new ApacheHttpClientTransport())
.build();
SDK 代码示例
同步调用
调用后即可一次性获得最终结果,Java 代码如下:
/**
* 同步调用
*/
private static void testInvoke() {
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)
.requestId(requestId)
.build();
ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
try {
System.out.println("model output:" + mapper.writeValueAsString(invokeModelApiResp));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
异步调用
调用后会立即返回一个任务 ID,然后用任务ID查询调用结果(根据模型和参数的不同,通常需要等待10-30秒才能得到最终结果)
/**
* 异步调用
*/
private static String testAsyncInvoke() {
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.invokeMethodAsync)
.messages(messages)
.requestId(requestId)
.build();
ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));
return invokeModelApiResp.getData().getTaskId();
}
SSE 调用
调用后可以流式的实时获取到结果直到结束
/**
* sse调用
*/
private static void testSseInvoke() {
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.TRUE)
.messages(messages)
.requestId(requestId)
.build();
ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest);
if (sseModelApiResp.isSuccess()) {
AtomicBoolean isFirst = new AtomicBoolean(true);
ChatMessageAccumulator chatMessageAccumulator = mapStreamToAccumulator(sseModelApiResp.getFlowable())
.doOnNext(accumulator -> {
{
if (isFirst.getAndSet(false)) {
System.out.print("Response: ");
}
if (accumulator.getDelta() != null && accumulator.getDelta().getTool_calls() != null) {
String jsonString = mapper.writeValueAsString(accumulator.getDelta().getTool_calls());
System.out.println("tool_calls: " + jsonString);
}
if (accumulator.getDelta() != null && accumulator.getDelta().getContent() != null) {
System.out.print(accumulator.getDelta().getContent());
}
}
})
.doOnComplete(System.out::println)
.lastElement()
.blockingGet();
Choice choice = new Choice(chatMessageAccumulator.getChoice().getFinishReason(), 0L, chatMessageAccumulator.getDelta());
List<Choice> choices = new ArrayList<>();
choices.add(choice);
ModelData data = new ModelData();
data.setChoices(choices);
data.setUsage(chatMessageAccumulator.getUsage());
data.setId(chatMessageAccumulator.getId());
data.setCreated(chatMessageAccumulator.getCreated());
data.setRequestId(chatCompletionRequest.getRequestId());
sseModelApiResp.setFlowable(null);
sseModelApiResp.setData(data);
}
System.out.println("model output:" + JSON.toJSONString(sseModelApiResp));
}
springboot整合chatGLM
智谱清言Controller类
@GetMapping("/chatTo")
public ResponseEntity<String> chatTo(@RequestParam String message) {
System.out.println("Message: " + message);
String response = openAiService.generateTo(message);
System.out.println(response);
return ResponseEntity.ok(response);
}
智谱清言实现类
@Service
@Slf4j
public class OpenAiServiceImpl implements OpenAiService {
// private static final String API_KEY = "vv";
//
// private static final String API_SECRET = "vv";
//
// private static final ClientV4 client = new ClientV4.Builder(API_KEY,API_SECRET).build();
private static final ClientV4 client = new ClientV4.Builder("vv.vv").build();
private static final ObjectMapper mapper = defaultObjectMapper();
public static ObjectMapper defaultObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
mapper.addMixIn(ChatFunction.class, ChatFunctionMixIn.class);
mapper.addMixIn(ChatCompletionRequest.class, ChatCompletionRequestMixIn.class);
mapper.addMixIn(ChatFunctionCall.class, ChatFunctionCallMixIn.class);
return mapper;
}
@Override
public String generate(String message) {
// log.info("启动了 message: " + message);
// message="作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan";
ClientV4 client = new ClientV4.Builder("vv.vv").build();
// ClientV4 client = new ClientV4.Builder("{Your ApiSecretKey}")
// .httpTransport(new ApacheHttpClientTransport())
// .build();
List<ChatMessage> messages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), message);
messages.add(chatMessage);
String requestIdTemplate= "requestId_%d";
String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model(Constants.ModelChatGLM4)
.stream(Boolean.FALSE)
.invokeMethod(Constants.invokeMethodAsync)
.messages(messages)
.requestId(requestId)
.build();
ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));
String taskId = invokeModelApiResp.getData().getTaskId();
System.out.println(taskId);
// String taskId = "62917222702082628875821015691843644"; // 从之前的响应中获得的taskId
String apiKey = "vv.vv"; // 替换为你的API密钥
String apiUrl = "https://api.zhipu.ai/v4/queryTaskResult"; // 替换为实际的API查询URL
StringBuilder response = null;
try {
// 构建查询URL
URL url = new URL(apiUrl + "?taskId=" + taskId);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求头,包括API密钥
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestMethod("GET");
// 发送请求并获取响应
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 读取响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// 打印结果
System.out.println("Response: " + response.toString());
} catch (Exception e) {
e.printStackTrace();
}
return response.toString();
}
@Override
public String generateTo(String message) {
List<ChatMessage> messages = new ArrayList<>();
ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), message);
messages.add(chatMessage);
String requestIdTemplate= "requestId_%d";// 请求ID模板
String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
// 函数调用参数构建部分
List<ChatTool> chatToolList = new ArrayList<>();
ChatTool chatTool = new ChatTool();
chatTool.setType(ChatToolType.FUNCTION.value());
ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
chatFunctionParameters.setType("object");
Map<String, Object> properties = new HashMap<>();
properties.put("location", new HashMap<String, Object>() {{
put("type", "string");
put("description", "城市,如:北京");
}});
properties.put("unit", new HashMap<String, Object>() {{
put("type", "string");
put("enum", new ArrayList<String>() {{
add("celsius");
add("fahrenheit");
}});
}});
chatFunctionParameters.setProperties(properties);
ChatFunction chatFunction = ChatFunction.builder()
.name("get_weather")
.description("Get the current weather of a location")
.parameters(chatFunctionParameters)
.build();
chatTool.setFunction(chatFunction);
chatToolList.add(chatTool);
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model(Constants.ModelChatGLM4)
.stream(Boolean.FALSE)
.invokeMethod(Constants.invokeMethod)
.messages(messages)
.requestId(requestId)
.tools(chatToolList)
.toolChoice("auto")
.build();
ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
try {
System.out.println("model output:" + mapper.writeValueAsString(invokeModelApiResp));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return invokeModelApiResp.getData().toString();
}
}
仅供参考
Service
public interface OpenAiService {
String generate(String message);
String generateTo(String message);
}
启动类
@SpringBootApplication
@Slf4j
@EnableTransactionManagement //开启注解方式的事务管理
@ServletComponentScan //开启了对servlet组件的支持
public class xxxxxxxxApplication {
public static void main(String[] args) {
SpringApplication.run(xxxxxApplication.class, args);
log.info("server started");
}
}
END
文字丨代码星辰阁
图片丨代码星辰阁