当前位置:   article > 正文

Java | 智谱API调用实践_com.zhipu.oapi.demo

com.zhipu.oapi.demo

一、什么是智谱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. 引入依赖

  1. <dependency>
  2. <groupId>cn.bigmodel.openapi</groupId>
  3. <artifactId>oapi-java-sdk</artifactId>
  4. <version>release-V4-2.0.0</version>
  5. </dependency>
 

2. 官方示例代码

  1. package com.zhipu.oapi.demo;
  2. import com.alibaba.fastjson.JSON;
  3. import com.fasterxml.jackson.annotation.JsonInclude;
  4. import com.fasterxml.jackson.core.JsonProcessingException;
  5. import com.fasterxml.jackson.core.type.TypeReference;
  6. import com.fasterxml.jackson.databind.DeserializationFeature;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import com.fasterxml.jackson.databind.PropertyNamingStrategy;
  9. import com.zhipu.oapi.ClientV4;
  10. import com.zhipu.oapi.Constants;
  11. import com.zhipu.oapi.service.v4.embedding.EmbeddingApiResponse;
  12. import com.zhipu.oapi.service.v4.embedding.EmbeddingRequest;
  13. import com.zhipu.oapi.service.v4.file.FileApiResponse;
  14. import com.zhipu.oapi.service.v4.file.QueryFileApiResponse;
  15. import com.zhipu.oapi.service.v4.file.QueryFilesRequest;
  16. import com.zhipu.oapi.service.v4.fine_turning.*;
  17. import com.zhipu.oapi.service.v4.image.CreateImageRequest;
  18. import com.zhipu.oapi.service.v4.image.ImageApiResponse;
  19. import com.zhipu.oapi.service.v4.model.*;
  20. import io.reactivex.Flowable;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.concurrent.atomic.AtomicBoolean;
  26. public class V4OkHttpClientTest {
  27. private static final String API_KEY = "";
  28. private static final String API_SECRET = "";
  29. private static final ClientV4 client = new ClientV4.Builder(API_KEY,API_SECRET).build();
  30. private static final ObjectMapper mapper = defaultObjectMapper();
  31. public static ObjectMapper defaultObjectMapper() {
  32. ObjectMapper mapper = new ObjectMapper();
  33. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  34. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  35. mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
  36. mapper.addMixIn(ChatFunction.class, ChatFunctionMixIn.class);
  37. mapper.addMixIn(ChatCompletionRequest.class, ChatCompletionRequestMixIn.class);
  38. mapper.addMixIn(ChatFunctionCall.class, ChatFunctionCallMixIn.class);
  39. return mapper;
  40. }
  41. // 请自定义自己的业务id
  42. private static final String requestIdTemplate = "mycompany-%d";
  43. public static void main(String[] args) throws Exception {
  44. System.setProperty("org.slf4j.simpleLogger.logFile", "System.out");
  45. // 1. sse-invoke调用模型,使用标准Listener,直接返回结果
  46. testSseInvoke();
  47. // 2. invoke调用模型,直接返回结果
  48. // testInvoke();
  49. // 3. 异步调用
  50. // String taskId = testAsyncInvoke();
  51. // 4.异步查询
  52. // testQueryResult(taskId);
  53. // 5.文生图
  54. // testCreateImage();
  55. // 6. 图生文
  56. // testImageToWord();
  57. // 7. 向量模型
  58. // testEmbeddings();
  59. // 8.微调-上传微调数据集
  60. // testUploadFile();
  61. // 9.微调-查询上传文件列表
  62. // testQueryUploadFileList();
  63. // 10.微调-创建微调任务
  64. // testCreateFineTuningJob();
  65. // 11.微调-查询微调任务事件
  66. // testQueryFineTuningJobsEvents();
  67. // 12.微调-查询微调任务
  68. // testRetrieveFineTuningJobs();
  69. // 13.微调-查询个人微调任务
  70. // testQueryPersonalFineTuningJobs();
  71. // 14.微调-调用微调模型(参考模型调用接口,并替换成要调用模型的编码model)
  72. }
  73. private static void testQueryPersonalFineTuningJobs() {
  74. QueryPersonalFineTuningJobRequest queryPersonalFineTuningJobRequest = new QueryPersonalFineTuningJobRequest();
  75. queryPersonalFineTuningJobRequest.setLimit(1);
  76. QueryPersonalFineTuningJobApiResponse queryPersonalFineTuningJobApiResponse = client.queryPersonalFineTuningJobs(queryPersonalFineTuningJobRequest);
  77. System.out.println("model output:" + JSON.toJSONString(queryPersonalFineTuningJobApiResponse));
  78. }
  79. private static void testQueryFineTuningJobsEvents() {
  80. QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest();
  81. queryFineTuningJobRequest.setJobId("ftjob-20240119114544390-zkgjb");
  82. // queryFineTuningJobRequest.setLimit(1);
  83. // queryFineTuningJobRequest.setAfter("1");
  84. QueryFineTuningEventApiResponse queryFineTuningEventApiResponse = client.queryFineTuningJobsEvents(queryFineTuningJobRequest);
  85. System.out.println("model output:" + JSON.toJSONString(queryFineTuningEventApiResponse));
  86. }
  87. /**
  88. * 查询微调任务
  89. */
  90. private static void testRetrieveFineTuningJobs() {
  91. QueryFineTuningJobRequest queryFineTuningJobRequest = new QueryFineTuningJobRequest();
  92. queryFineTuningJobRequest.setJobId("ftjob-20240119114544390-zkgjb");
  93. // queryFineTuningJobRequest.setLimit(1);
  94. // queryFineTuningJobRequest.setAfter("1");
  95. QueryFineTuningJobApiResponse queryFineTuningJobApiResponse = client.retrieveFineTuningJobs(queryFineTuningJobRequest);
  96. System.out.println("model output:" + JSON.toJSONString(queryFineTuningJobApiResponse));
  97. }
  98. /**
  99. * 创建微调任务
  100. */
  101. private static void testCreateFineTuningJob() {
  102. FineTuningJobRequest request = new FineTuningJobRequest();
  103. String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
  104. request.setRequestId(requestId);
  105. request.setModel("chatglm3-6b");
  106. request.setTraining_file("file-20240118082608327-kp8qr");
  107. CreateFineTuningJobApiResponse createFineTuningJobApiResponse = client.createFineTuningJob(request);
  108. System.out.println("model output:" + JSON.toJSONString(createFineTuningJobApiResponse));
  109. }
  110. /**
  111. * 微调文件上传列表查询
  112. */
  113. private static void testQueryUploadFileList() {
  114. QueryFilesRequest queryFilesRequest = new QueryFilesRequest();
  115. QueryFileApiResponse queryFileApiResponse = client.queryFilesApi(queryFilesRequest);
  116. System.out.println("model output:" + JSON.toJSONString(queryFileApiResponse));
  117. }
  118. /**
  119. * 微调上传数据集
  120. */
  121. private static void testUploadFile() {
  122. String filePath = "/Users/wujianguo/Downloads/transaction-data.jsonl";
  123. String purpose = "fine-tune";
  124. FileApiResponse fileApiResponse = client.invokeUploadFileApi(purpose, filePath);
  125. System.out.println("model output:" + JSON.toJSONString(fileApiResponse));
  126. }
  127. private static void testEmbeddings() {
  128. EmbeddingRequest embeddingRequest = new EmbeddingRequest();
  129. embeddingRequest.setInput("hello world");
  130. embeddingRequest.setModel(Constants.ModelEmbedding2);
  131. EmbeddingApiResponse apiResponse = client.invokeEmbeddingsApi(embeddingRequest);
  132. System.out.println("model output:" + JSON.toJSONString(apiResponse));
  133. }
  134. /**
  135. * 图生文
  136. */
  137. private static void testImageToWord() {
  138. List<ChatMessage> messages = new ArrayList<>();
  139. List<Map<String, Object>> contentList = new ArrayList<>();
  140. Map<String, Object> textMap = new HashMap<>();
  141. textMap.put("type", "text");
  142. textMap.put("text", "图里有什么");
  143. Map<String, Object> typeMap = new HashMap<>();
  144. typeMap.put("type", "image_url");
  145. Map<String, Object> urlMap = new HashMap<>();
  146. urlMap.put("url", "https://cdn.bigmodel.cn/enterpriseAc/3f328152-e15c-420c-803d-6684a9f551df.jpeg?attname=24.jpeg");
  147. typeMap.put("image_url", urlMap);
  148. contentList.add(textMap);
  149. contentList.add(typeMap);
  150. ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), contentList);
  151. messages.add(chatMessage);
  152. String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
  153. ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
  154. .model(Constants.ModelChatGLM4V)
  155. .stream(Boolean.FALSE)
  156. .invokeMethod(Constants.invokeMethod)
  157. .messages(messages)
  158. .requestId(requestId)
  159. .build();
  160. ModelApiResponse modelApiResponse = client.invokeModelApi(chatCompletionRequest);
  161. System.out.println("model output:" + JSON.toJSONString(modelApiResponse));
  162. }
  163. private static void testCreateImage() {
  164. CreateImageRequest createImageRequest = new CreateImageRequest();
  165. createImageRequest.setModel(Constants.ModelCogView);
  166. // createImageRequest.setPrompt("画一个温顺可爱的小狗");
  167. ImageApiResponse imageApiResponse = client.createImage(createImageRequest);
  168. System.out.println("imageApiResponse:" + JSON.toJSONString(imageApiResponse));
  169. }
  170. /**
  171. * sse调用
  172. */
  173. private static void testSseInvoke() {
  174. List<ChatMessage> messages = new ArrayList<>();
  175. ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatGLM和你哪个更强大");
  176. // ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "你能帮我查询2024年1月1日从北京南站到上海的火车票吗?");
  177. messages.add(chatMessage);
  178. String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
  179. // 函数调用参数构建部分
  180. List<ChatTool> chatToolList = new ArrayList<>();
  181. ChatTool chatTool = new ChatTool();
  182. chatTool.setType(ChatToolType.FUNCTION.value());
  183. ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
  184. chatFunctionParameters.setType("object");
  185. Map<String, Object> properties = new HashMap<>();
  186. properties.put("departure", new HashMap<String, Object>() {{
  187. put("type", "string");
  188. put("description", "出发城市或车站");
  189. }});
  190. properties.put("destination", new HashMap<String, Object>() {{
  191. put("type", "string");
  192. put("description", "目的地城市或车站");
  193. }});
  194. properties.put("date", new HashMap<String, Object>() {{
  195. put("type", "string");
  196. put("description", "要查询的车次日期");
  197. }});
  198. List<String> required = new ArrayList<>();
  199. required.add("departure");
  200. required.add("destination");
  201. required.add("date");
  202. chatFunctionParameters.setProperties(properties);
  203. ChatFunction chatFunction = ChatFunction.builder()
  204. .name("query_train_info")
  205. .description("根据用户提供的信息,查询对应的车次")
  206. .parameters(chatFunctionParameters)
  207. .required(required)
  208. .build();
  209. chatTool.setFunction(chatFunction);
  210. chatToolList.add(chatTool);
  211. ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
  212. .model(Constants.ModelChatGLM4)
  213. .stream(Boolean.TRUE)
  214. .messages(messages)
  215. .requestId(requestId)
  216. .tools(chatToolList)
  217. .toolChoice("auto")
  218. .build();
  219. ModelApiResponse sseModelApiResp = client.invokeModelApi(chatCompletionRequest);
  220. if (sseModelApiResp.isSuccess()) {
  221. AtomicBoolean isFirst = new AtomicBoolean(true);
  222. ChatMessageAccumulator chatMessageAccumulator = mapStreamToAccumulator(sseModelApiResp.getFlowable())
  223. .doOnNext(accumulator -> {
  224. {
  225. if (isFirst.getAndSet(false)) {
  226. System.out.print("Response: ");
  227. }
  228. if (accumulator.getDelta() != null && accumulator.getDelta().getTool_calls() != null) {
  229. String jsonString = mapper.writeValueAsString(accumulator.getDelta().getTool_calls());
  230. System.out.println("tool_calls: " + jsonString);
  231. }
  232. if (accumulator.getDelta() != null && accumulator.getDelta().getContent() != null) {
  233. System.out.print(accumulator.getDelta().getContent());
  234. }
  235. }
  236. })
  237. .doOnComplete(System.out::println)
  238. .lastElement()
  239. .blockingGet();
  240. Choice choice = new Choice(chatMessageAccumulator.getChoice().getFinishReason(), 0L, chatMessageAccumulator.getDelta());
  241. List<Choice> choices = new ArrayList<>();
  242. choices.add(choice);
  243. ModelData data = new ModelData();
  244. data.setChoices(choices);
  245. data.setUsage(chatMessageAccumulator.getUsage());
  246. data.setId(chatMessageAccumulator.getId());
  247. data.setCreated(chatMessageAccumulator.getCreated());
  248. data.setRequestId(chatCompletionRequest.getRequestId());
  249. sseModelApiResp.setFlowable(null);
  250. sseModelApiResp.setData(data);
  251. }
  252. System.out.println("model output:" + JSON.toJSONString(sseModelApiResp));
  253. }
  254. public static Flowable<ChatMessageAccumulator> mapStreamToAccumulator(Flowable<ModelData> flowable) {
  255. return flowable.map(chunk -> {
  256. return new ChatMessageAccumulator(chunk.getChoices().get(0).getDelta(), null, chunk.getChoices().get(0), chunk.getUsage(), chunk.getCreated(), chunk.getId());
  257. });
  258. }
  259. /**
  260. * 同步调用
  261. */
  262. private static void testInvoke() {
  263. List<ChatMessage> messages = new ArrayList<>();
  264. ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatGLM和你哪个更强大");
  265. messages.add(chatMessage);
  266. String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
  267. // 函数调用参数构建部分
  268. List<ChatTool> chatToolList = new ArrayList<>();
  269. ChatTool chatTool = new ChatTool();
  270. chatTool.setType(ChatToolType.FUNCTION.value());
  271. ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
  272. chatFunctionParameters.setType("object");
  273. Map<String, Object> properties = new HashMap<>();
  274. properties.put("location", new HashMap<String, Object>() {{
  275. put("type", "string");
  276. put("description", "城市,如:北京");
  277. }});
  278. properties.put("unit", new HashMap<String, Object>() {{
  279. put("type", "string");
  280. put("enum", new ArrayList<String>() {{
  281. add("celsius");
  282. add("fahrenheit");
  283. }});
  284. }});
  285. chatFunctionParameters.setProperties(properties);
  286. ChatFunction chatFunction = ChatFunction.builder()
  287. .name("get_weather")
  288. .description("Get the current weather of a location")
  289. .parameters(chatFunctionParameters)
  290. .build();
  291. chatTool.setFunction(chatFunction);
  292. chatToolList.add(chatTool);
  293. ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
  294. .model(Constants.ModelChatGLM4)
  295. .stream(Boolean.FALSE)
  296. .invokeMethod(Constants.invokeMethod)
  297. .messages(messages)
  298. .requestId(requestId)
  299. .tools(chatToolList)
  300. .toolChoice("auto")
  301. .build();
  302. ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
  303. try {
  304. System.out.println("model output:" + mapper.writeValueAsString(invokeModelApiResp));
  305. } catch (JsonProcessingException e) {
  306. e.printStackTrace();
  307. }
  308. }
  309. /**
  310. * 异步调用
  311. */
  312. private static String testAsyncInvoke() {
  313. List<ChatMessage> messages = new ArrayList<>();
  314. ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "ChatLM和你哪个更强大");
  315. messages.add(chatMessage);
  316. String requestId = String.format(requestIdTemplate, System.currentTimeMillis());
  317. // 函数调用参数构建部分
  318. List<ChatTool> chatToolList = new ArrayList<>();
  319. ChatTool chatTool = new ChatTool();
  320. chatTool.setType(ChatToolType.FUNCTION.value());
  321. ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();
  322. chatFunctionParameters.setType("object");
  323. Map<String, Object> properties = new HashMap<>();
  324. properties.put("location", new HashMap<String, Object>() {{
  325. put("type", "string");
  326. put("description", "城市,如:北京");
  327. }});
  328. properties.put("unit", new HashMap<String, Object>() {{
  329. put("type", "string");
  330. put("enum", new ArrayList<String>() {{
  331. add("celsius");
  332. add("fahrenheit");
  333. }});
  334. }});
  335. chatFunctionParameters.setProperties(properties);
  336. ChatFunction chatFunction = ChatFunction.builder()
  337. .name("get_weather")
  338. .description("Get the current weather of a location")
  339. .parameters(chatFunctionParameters)
  340. .build();
  341. chatTool.setFunction(chatFunction);
  342. chatToolList.add(chatTool);
  343. ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
  344. .model(Constants.ModelChatGLM4)
  345. .stream(Boolean.FALSE)
  346. .invokeMethod(Constants.invokeMethodAsync)
  347. .messages(messages)
  348. .requestId(requestId)
  349. .tools(chatToolList)
  350. .toolChoice("auto")
  351. .build();
  352. ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
  353. System.out.println("model output:" + JSON.toJSONString(invokeModelApiResp));
  354. return invokeModelApiResp.getData().getTaskId();
  355. }
  356. /**
  357. * 查询异步结果
  358. *
  359. * @param taskId
  360. */
  361. private static void testQueryResult(String taskId) {
  362. QueryModelResultRequest request = new QueryModelResultRequest();
  363. request.setTaskId(taskId);
  364. QueryModelResultResponse queryResultResp = client.queryModelResult(request);
  365. try {
  366. System.out.println("model output:" + mapper.writeValueAsString(queryResultResp));
  367. } catch (JsonProcessingException e) {
  368. e.printStackTrace();
  369. }
  370. }
  371. }
A. 填充自己的信息

B. 启动示例

这里解释一下四个的区别

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

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

  3. 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+编程的程序猿。

以上就是本次分享的所有内容,感兴趣的朋友点个关注呀,感谢大家啦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/362177
推荐阅读
相关标签
  

闽ICP备14008679号