Java | 智谱API调用实践
时间:2024-03-29 21:40:20 来源:网络cs 作者:利杜鹃 栏目:平台政策 阅读:
一、什么是智谱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. 引入依赖
<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小工具使用,更多玩法,由大家一起探索。
我是程序员影子,一名以Java为主,其余时间探索AI+编程的程序猿。
以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~
本文链接:https://www.kjpai.cn/zhengce/2024-03-29/150597.html,文章来源:网络cs,作者:利杜鹃,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!