【智谱 AI 封装指南】流式对话vs普通对话

发布时间:2026/9/4 18:48:46
【智谱 AI 封装指南】流式对话vs普通对话 一、介绍1、文档模型概览 - 智谱AI开放文档智谱开放平台的开发指南中给出了三种调用方法HTTP、SDK和第三方框架。三种区别如下官方 SDK优点开箱即用自动封装请求 / 响应、流式解析代码简洁缺点绑定语言依赖 SDK 版本。适合快速开发本次选用方案。HTTP 原生调用优点跨语言、无 SDK 依赖请求高度可控缺点手动拼接 JSON、处理 SSE 流式、异常、重试代码量大。适合底层定制场景。第三方框架优点复用现有大模型框架代码多模型统一接入缺点受第三方框架限制版本兼容、新特性更新慢。适合多模型统一管理项目。二、接入SDK1.引入依赖注意技术较新一定要及时去看开发文档dependency groupIdai.z.openapi/groupId artifactIdzai-sdk/artifactId version0.3.5/version /dependency2.创建单元测试此时api-key可直接写死后续有api-key配置教程普通对话import ai.z.openapi.ZhipuAiClient; import ai.z.openapi.service.model.*; import ai.z.openapi.core.Constants; import java.util.Arrays; SpringBootTest public class ZhiPuAiTest { Test public void test() { // 初始化客户端 ZhipuAiClient client ZhipuAiClient.builder().ofZHIPU() .apiKey(你的api-key) .build(); // 创建聊天完成请求 ChatCompletionCreateParams request ChatCompletionCreateParams.builder() .model(glm-5.3) .messages(Arrays.asList( ChatMessage.builder() .role(ChatMessageRole.USER.value()) .content(你好请介绍一下自己) .build() )) .build(); // 发送请求 ChatCompletionResponse response client.chat().createChatCompletion(request); // 获取回复 if (response.isSuccess()) { Object reply response.getData().getChoices().get(0).getMessage(); System.out.println(AI 回复: reply); } else { System.err.println(错误: response.getMsg()); } }流式对话​ import ai.z.openapi.ZhipuAiClient; import ai.z.openapi.service.model.*; import ai.z.openapi.core.Constants; import java.util.Arrays; SpringBootTest public class ZhiPuAiTest { Test public void test() { ZhipuAiClient client ZhipuAiClient.builder().ofZHIPU() .apiKey(你的api-key) .build(); // 创建流式聊天请求 ChatCompletionCreateParams request ChatCompletionCreateParams.builder() .model(glm-5.3) .messages(Arrays.asList( ChatMessage.builder() .role(ChatMessageRole.USER.value()) .content(写一首关于春天的诗) .build() )) .stream(true) .build(); // 处理流式响应 ChatCompletionResponse response client.chat().createChatCompletion(request); if (response.isSuccess() response.getFlowable() ! null) { response.getFlowable().subscribe( data - { // 处理流式数据块 if (data.getChoices() ! null !data.getChoices().isEmpty()) { Delta content data.getChoices().get(0).getDelta(); System.out.print(content); } }, error - System.err.println(\n 流式错误: error.getMessage()), () - System.out.println(\n 流式完成) } } ​三、封装1.为什么要封装一个是为了方便调用再一个如果代码里到处都是你的api-key吧万一被别人刷了为钱包哭泣吧。。。。2.配置application.yml文件ai: apiKey: xxx注意配置格式要求非常严apikey后面一定要有一个空格3.定义config类Configuration ConfigurationProperties(prefix ai)//ai要与你上述yml文件中的保持一致 Data public class AiConfig { private String apiKey;//要与你yml文件中的名字保持一致 Bean public ZhipuAiClient zhipuAiClient() { return ZhipuAiClient.builder() .ofZHIPU() .apiKey(apiKey)//这里名字也要保持一致 .build(); } }4.封装请求模块根据阿里开发规范把对大模型的调用放在manager包下我们封装的思想是层层简化先封装最简单通用的方法再提供不同参数默认值的简化调用方法。通用模块/** * 通用请求(简化请求) * param messages 聊天消息列表 * param stream 是否使用流式响应 * param temperature 温度参数控制回答的随机性 * return AI返回的聊天内容 */ public String doRequest(ListChatMessage messages, Boolean stream, Float temperature) { // 构建请求参数对象 ChatCompletionCreateParams request ChatCompletionCreateParams.builder() .model(glm-5.3) // 指定使用的AI模型 .stream(stream) // 设置是否流式响应 .temperature(temperature) // 设置温度参数 .messages(messages) // 传入聊天消息列表 .build(); try { // 发送聊天请求并获取响应 ChatCompletionResponse response client.chat().createChatCompletion(request); // 检查响应是否成功 if (!response.isSuccess()) { throw new RuntimeException(调用智谱失败 response.getMsg()); } // 提取并返回AI生成的回复内容 return response.getData().getChoices().get(0).toString(); } catch (Exception e) { e.printStackTrace(); // 替换为你项目自定义业务异常没有就直接抛RuntimeException throw new RuntimeException(AI调用异常 e.getMessage(), e); } }简化通用请求的消息传递/** * 通用请求简化消息传递 * * param systemMessage * param userMessage * param stream * param temperature * return */ public String doRequest(String systemMessage, String userMessage, Boolean stream, Float temperature) { ListChatMessage 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); }这个重载方法内部自动组装系统消息、用户消息为消息列表再调用底层通用方法上层只需传入文本字符串省去手动构建消息集合的代码。通用同步请求/** * 同步请求 * * param systemMessage * param userMessage * param temperature * return */ public String doSyncRequest(String systemMessage, String userMessage, Float temperature) { return doRequest(systemMessage, userMessage, Boolean.FALSE, temperature); }由于上面已经封装了通用请求所以直接返回就好通用流式请求/** * 通用流式请求(简化请求) * param messages 聊天消息列表 * param temperature 温度参数控制回答的随机性 * return AI返回的聊天内容 */ public FlowableModelData doStreamRequest(ListChatMessage messages, Float temperature) { // 构建请求参数对象 ChatCompletionCreateParams request ChatCompletionCreateParams.builder() .model(glm-5.3) // 指定使用的AI模型 .stream(Boolean.TRUE) // 设置是否流式响应 .temperature(temperature) // 设置温度参数 .messages(messages) // 传入聊天消息列表 .build(); try { ChatCompletionResponse response client.chat().createChatCompletion(request); // 判断响应是否成功 if (!response.isSuccess() || response.getFlowable() null) { throw new BusinessException(ErrorCode.SYSTEM_ERROR, 智谱AI流式响应获取失败); } return response.getFlowable(); } catch (Exception e) { e.printStackTrace(); throw new BusinessException(ErrorCode.SYSTEM_ERROR, e.getMessage()); } }流式请求简化消息/** * 通用流式请求简化消息传递 * * param systemMessage * param userMessage * param temperature * return */ public FlowableModelData doStreamRequest(String systemMessage, String userMessage, Float temperature) { ListChatMessage 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 doStreamRequest(chatMessageList, temperature); }到此就结束辣最后去单元测试里实验一下吧。如果api-key传输有问题可以看这篇文章测试类注入 ZhipuAiClient 报空指针 NullPointerExceptionzhipuAiClient null-CSDN博客