Java | 智谱API调用实践

程序员影子 2024-07-27 15:05:02 阅读 79

一、什么是智谱AI

智谱AI(Zhipu AI)是一家致力于人工智能技术研发和应用的公司。该公司由清华大学背景的团队创立,专注于大模型技术的研究与推广。智谱AI在人工智能领域取得了显著成就,其发布的自研大模型GLM-4等产品。

二、SDK玩法

(一) 注册账号

进入官网(https://maas.aminer.cn/),注册账号实名后,将会赠送有效期一个月的体验包。

(二) 查看自己的API Key

注意:我们常见的API_KEY和API_SECRET,这里采用了统一为API key,使用 .这个符号进行划分。

举个栗子:yingzix688.xxxx。

那么,API_KEY:yingzix688

           API_SECRET:xxxx

大家只需要看自己的API key进行分割出来即可。

(三) 查阅官方github

官方github地址:https://github.com/zhipuai/zhipuai-sdk-java-v4

1. 引入依赖

<code> <dependency>

<groupId>cn.bigmodel.openapi</groupId>

<artifactId>oapi-java-sdk</artifactId>

<version>release-V4-2.0.0</version>

</dependency>

2. 官方示例代码

package com.zhipu.oapi.demo;

import com.alibaba.fastjson.JSON;

import com.fasterxml.jackson.annotation.JsonInclude;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.core.type.TypeReference;

import com.fasterxml.jackson.databind.DeserializationFeature;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;

import com.zhipu.oapi.ClientV4;

import com.zhipu.oapi.Constants;

import com.zhipu.oapi.service.v4.embedding.EmbeddingApiResponse;

import com.zhipu.oapi.service.v4.embedding.EmbeddingRequest;

import com.zhipu.oapi.service.v4.file.FileApiResponse;

import com.zhipu.oapi.service.v4.file.QueryFileApiResponse;

import com.zhipu.oapi.service.v4.file.QueryFilesRequest;

import com.zhipu.oapi.service.v4.fine_turning.*;

import com.zhipu.oapi.service.v4.image.CreateImageRequest;

import com.zhipu.oapi.service.v4.image.ImageApiResponse;

import com.zhipu.oapi.service.v4.model.*;

import io.reactivex.Flowable;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.concurrent.atomic.AtomicBoolean;

public class V4OkHttpClientTest {

private static final String API_KEY = "";

private static final String API_SECRET = "";

private static final ClientV4 client = new ClientV4.Builder(API_KEY,API_SECRET).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;

}

// 请自定义自己的业务id

private static final String requestIdTemplate = "mycompany-%d";

public static void main(String[] args) throws Exception {

System.setProperty("org.slf4j.simpleLogger.logFile", "System.out");

// 1. sse-invoke调用模型,使用标准Listener,直接返回结果

testSseInvoke();

// 2. invoke调用模型,直接返回结果

// testInvoke();

// 3. 异步调用

// String taskId = testAsyncInvoke();

// 4.异步查询

// testQueryResult(taskId);

// 5.文生图

// testCreateImage();

// 6. 图生文

// testImageToWord();

// 7. 向量模型

// testEmbeddings();

// 8.微调-上传微调数据集

// testUploadFile();

// 9.微调-查询上传文件列表

// testQueryUploadFileList();

// 10.微调-创建微调任务

// testCreateFineTuningJob();

// 11.微调-查询微调任务事件

// testQueryFineTuningJobsEvents();

// 12.微调-查询微调任务

// testRetrieveFineTuningJobs();

// 13.微调-查询个人微调任务

// testQueryPersonalFineTuningJobs();

// 14.微调-调用微调模型(参考模型调用接口,并替换成要调用模型的编码model)

}

private static void testQueryPersonalFineTuningJobs() {

QueryPersonalFineTuningJobRequest queryPersonalFineTuningJobRequest = new QueryPersonalFineTuningJobRequest();

queryPersonalFineTuningJobRequest.setLimit(1);

QueryPersonalFineTuningJobApiResponse queryPersonalFineTuningJobApiResponse = client.queryPersonalFineTuningJobs(queryPersonalFineTuningJobRequest);

System.out.println("model output:" + JSON.toJSONString(queryPersonalFineTuningJobApiResponse));

}

private static void testQueryFineTuningJobsEvents() {

QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest();

queryFineTuningJobRequest.setJobId("ftjob-20240119114544390-zkgjb");

// queryFineTuningJobRequest.setLimit(1);

// queryFineTuningJobRequest.setAfter("1");

QueryFineTuningEventApiResponse queryFineTuningEventApiResponse = client.queryFineTuningJobsEvents(queryFineTuningJobRequest);

System.out.println("model output:" + JSON.toJSONString(queryFineTuningEventApiResponse));

}

/**

* 查询微调任务

*/

private static void testRetrieveFineTuningJobs() {

QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest();

queryFineTuningJobRequest.setJobId("ftjob-20240119114544390-zkgjb");

// queryFineTuningJobRequest.setLimit(1);

// queryFineTuningJobRequest.setAfter("1");

QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.retrieveFineTuningJobs(queryFineTuningJobRequest);

System.out.println("model output:" + JSON.toJSONString(queryFineTuningJobApiResponse));

}

/**

* 创建微调任务

*/

private static void testCreateFineTuningJob() {

FineTuningJobRequest request = new FineTuningJobRequest();

String requestId = String.format(requestIdTemplate, System.currentTimeMillis());

request.setRequestId(requestId);

request.setModel("chatglm3-6b");

request.setTraining_file("file-20240118082608327-kp8qr");

CreateFineTuningJobApiResponse createFineTuningJobApiResponse = client.createFineTuningJob(request);

System.out.println("model output:" + JSON.toJSONString(createFineTuningJobApiResponse));

}

/**

* 微调文件上传列表查询

*/

private static void testQueryUploadFileList() {

QueryFilesRequest queryFilesRequest = new QueryFilesRequest();

QueryFileApiResponse queryFileApiResponse = client.queryFilesApi(queryFilesRequest);

System.out.println("model output:" + JSON.toJSONString(queryFileApiResponse));

}

/**

* 微调上传数据集

*/

private static void testUploadFile() {

String filePath = "/Users/wujianguo/Downloads/transaction-data.jsonl";

String purpose = "fine-tune";

FileApiResponse fileApiResponse = client.invokeUploadFileApi(purpose, filePath);

System.out.println("model output:" + JSON.toJSONString(fileApiResponse));

}

private static void testEmbeddings() {

EmbeddingRequest embeddingRequest = new EmbeddingRequest();

embeddingRequest.setInput("hello world");

embeddingRequest.setModel(Constants.ModelEmbedding2);

EmbeddingApiResponse apiResponse = client.invokeEmbeddingsApi(embeddingRequest);

System.out.println("model output:" + JSON.toJSONString(apiResponse));

}

/**

* 图生文

*/

private static void testImageToWord() {

List<ChatMessage> messages = new ArrayList<>();

List<Map<String, Object>> contentList = new ArrayList<>();

Map<String, Object> textMap = new HashMap<>();

textMap.put("type", "text");

textMap.put("text", "图里有什么");

Map<String, Object> typeMap = new HashMap<>();

typeMap.put("type", "image_url");

Map<String, Object> urlMap = new HashMap<>();

urlMap.put("url", "https://cdn.bigmodel.cn/enterpriseAc/3f328152-e15c-420c-803d-6684a9f551df.jpeg?attname=24.jpeg");

typeMap.put("image_url", urlMap);

contentList.add(textMap);

contentList.add(typeMap);

ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), contentList);

messages.add(chatMessage);

String requestId = String.format(requestIdTemplate, System.currentTimeMillis());

ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()

.model(Constants.ModelChatGLM4V)

.stream(Boolean.FALSE)

.invokeMethod(Constants.invokeMethod)

.messages(messages)

.requestId(requestId)

.build();

ModelApiResponse modelApiResponse = client.invokeModelApi(chatCompletionRequest);

System.out.println("model output:" + JSON.toJSONString(modelApiResponse));

}

private static void testCreateImage() {

CreateImageRequest createImageRequest = new CreateImageRequest();

createImageRequest.setModel(Constants.ModelCogView);

// createImageRequest.setPrompt("画一个温顺可爱的小狗");

ImageApiResponse imageApiResponse = client.createImage(createImageRequest);

System.out.println("imageApiResponse:" + JSON.toJSONString(imageApiResponse));

}

/**

* sse调用

*/

private static void testSseInvoke() {

List<ChatMessage> messages = new ArrayList<>();

ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatGLM和你哪个更强大");

// ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "你能帮我查询2024年1月1日从北京南站到上海的火车票吗?");

messages.add(chatMessage);

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("departure", new HashMap<String, Object>() { {

put("type", "string");

put("description", "出发城市或车站");

}});

properties.put("destination", new HashMap<String, Object>() { {

put("type", "string");

put("description", "目的地城市或车站");

}});

properties.put("date", new HashMap<String, Object>() { {

put("type", "string");

put("description", "要查询的车次日期");

}});

List<String> required = new ArrayList<>();

required.add("departure");

required.add("destination");

required.add("date");

chatFunctionParameters.setProperties(properties);

ChatFunction chatFunction = ChatFunction.builder()

.name("query_train_info")

.description("根据用户提供的信息,查询对应的车次")

.parameters(chatFunctionParameters)

.required(required)

.build();

chatTool.setFunction(chatFunction);

chatToolList.add(chatTool);

ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()

.model(Constants.ModelChatGLM4)

.stream(Boolean.TRUE)

.messages(messages)

.requestId(requestId)

.tools(chatToolList)

.toolChoice("auto")

.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));

}

public static Flowable<ChatMessageAccumulator> mapStreamToAccumulator(Flowable<ModelData> flowable) {

return flowable.map(chunk -> {

return new ChatMessageAccumulator(chunk.getChoices().get(0).getDelta(), null, chunk.getChoices().get(0), chunk.getUsage(), chunk.getCreated(), chunk.getId());

});

}

/**

* 同步调用

*/

private static void testInvoke() {

List<ChatMessage> messages = new ArrayList<>();

ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatGLM和你哪个更强大");

messages.add(chatMessage);

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();

}

}

/**

* 异步调用

*/

private static String testAsyncInvoke() {

List<ChatMessage> messages = new ArrayList<>();

ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatLM和你哪个更强大");

messages.add(chatMessage);

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.invokeMethodAsync)

.messages(messages)

.requestId(requestId)

.tools(chatToolList)

.toolChoice("auto")

.build();

ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);

System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));

return invokeModelApiResp.getData().getTaskId();

}

/**

* 查询异步结果

*

* @param taskId

*/

private static void testQueryResult(String taskId) {

QueryModelResultRequest request = new QueryModelResultRequest();

request.setTaskId(taskId);

QueryModelResultResponse queryResultResp = client.queryModelResult(request);

try {

System.out.println("model output:" + mapper.writeValueAsString(queryResultResp));

} catch (JsonProcessingException e) {

e.printStackTrace();

}

}

}

A. 填充自己的信息

B. 启动示例

这里解释一下四个的区别

testSseInvoke 使用的是逐渐输出,AI回答的结果是一段一段的展示。

testInvoke 使用的是同步执行,当AI全部的回答都输出后才会展示出来。

testAsyncInvoke 与testQueryResult 搭配使用,先通过testAsyncInvoke 让AI去执行,直接返回一个成功或者失败,之后通过获得的taskId,再用testQueryResult去查询获得结果即可。这个过程实践过Bi项目的小伙伴应该深有体会。

C. 结果展示

3.参数阅读

这里补充下,如果你要修改问题,只需要修改content参数中的值即可。相当于问AI问题。

其实最关键的就是前三个

A. model

你要选择哪个模型, 例如选择GLM-4 还是GLM-3-Turbo

B. messages

这里需要考虑两个值,一个是role,一般为user即可。role的值官方已经给我们枚举了,只需要调用即可。

剩下的则是我们需要自己填入的content

C. request_id

这个是区分我们每次上传的任务,保证唯一性,可以自己上传一个类似于雪花算法的ID,用户端不传的话平台也会自动生成。

其他参数目前影子测试完前五个方法后发现使用官方默认的即可。只需要你调整好代码的位置以及content的值即可。

剩下的参数,如果你需要使用微调或者向量知识库等高阶玩法,则根据官方文档调整即可。很多地方已经自带了枚举值,只需要直接选择填充。

最后,大家可以用这一个月的免费额度,打造一个自己的AI小工具使用,更多玩法,由大家一起探索。


以上就是本次的分享,下面是影子为你带来的两份大礼。

一、欢迎加我的微信围观影子的AI编程玩法,你可以直接与影子交流,无论是Java领域还是AI编程玩法,影子都已深耕多年,期待与你的相遇~

二、加好友时备注 AI+编程,送你一份影子沉淀多个月的AI学习资料,帮助你快速入门。详细可参考下面的文章:

AI应用学习资料

icon-default.png?t=N7T8

https://blog.csdn.net/yingzix688/article/details/137894050


最后影子再做个自我介绍:

AI+编程深耕者,致力于通过AI减少工作时间,提高开发效率,帮助小白早日踏进AIG的时代。

在影子这里,如果你是小白,你可以学习到AI+编程的入门玩法,帮助你解决一些编程开发的重复性问题;如果你有基础,影子可以给你提供进阶的知识,让你的AI+编程能力更进一步。

同时影子也会分享自己使用AI作为副业赚钱的经历。

影子的梦想是帮助更多编程小白入门AI+编程,而在即将到来的AIG时代,只会淘汰不会使用AI的编程者,希望能有更多的人可以在影子这里学习到AI编程的能力,在未来的AI时代中,不被淘汰。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。