发布时间:2026/9/4 18:48:14
【智谱 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博客

相关新闻

2026/9/4 18:43:10

开关电源纹波电流公式推导与降纹波系统方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 18:43:10

国产AI工具实战指南:从选型到集成,构建个人高效工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 18:43:10

Ollama+AnythingLLM+DeepSeek构建企业级RAG知识库实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/4 22:44:09

从芯片级到系统级:AI硬件合作背后的技术转向

如果你最近在看 AI 硬件方向的新闻,大概会碰到这样的标题:MediaTek 与 Nvidia 深化合作。这轮讨论里,郭明錤的解读把重点落在了一个很多人容易滑过去的词上——AI 业务从芯片设计升级到系统级设计。公开信息目前能确认的更多是方向&#xff0…

2026/9/4 22:44:09

显著性检验实战:用 Student t-test 与 Wilcoxon 检验拒绝玄学提升

显著性检验实战:用 Student t-test 与 Wilcoxon 检验拒绝玄学提升 在机器学习与自然语言处理的对比实验中,我们经常看到这样的描述:“新提出的算法在基准数据集上取得了 0.4% 的准确率提升,证明了该算法的优越性”。 然而&#x…

2026/9/4 22:44:09

先对齐再自迭代:RSI 训练前必须建好的模型稳定基线

如果你最近在关注大模型推理训练的讨论,大概率会频繁撞见 RSI、self-iterative RL、推理模型自迭代这些词。它们描述的新范式很有吸引力:让模型自己生成推理路径,自己筛选高质量答案,再拿这些结果继续训练自己,听起来几…

2026/9/4 22:44:09

RSI与模型对齐:为什么对齐是智能体自我改进的前提

如果你正在做智能体、RAG 或者带“自我修正”功能的 LLM 应用,最近大概率看过一类说法:下一代系统要具备 RSI,也就是模型能自己拆解任务、评估结果、修改行为策略,甚至自动迭代自己的提示词。这个方向听起来很性感,不少…

2026/9/4 22:44:09

代码的装订线:工程里的整洁与装帧的秩序

代码的装订线:工程里的整洁与装帧的秩序 美院大三那年,有一门让我至今记忆犹新的专业课——书籍装帧设计(Bookbinding)。期末作业要求我们亲手手工制作一本线装书。从裁切宣纸、对折页码、压平书背,到用锥子在预定间距…

2026/9/4 22:39:09

ggml_cgraph 的内存分配器:计算期零动态分配实现

ggml_cgraph 的内存分配器:计算期零动态分配实现在许多高性能 AI 运行时中,内存管理策略往往决定了推理底座在边缘端与多并发场景下的生死存亡。如果一个推理引擎在前向传播过程中,每执行一个算子(如一次矩阵乘或一次 LayerNorm&a…

2026/9/3 18:28:26

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/3 14:29:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/3 14:30:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/4 0:00:58

STM32H743 SPI从机DMA双缓冲通信实战

简介:本资源是面向嵌入式开发工程师与STM32进阶学习者的SPI DMA双机通信从机端完整实现方案,聚焦STM32H743高性能Cortex-M7单片机在工业控制与高速数据交互场景下的从机通信开发痛点。压缩包含1355个文件,主体为599个C源码与321个头文件&…

2026/9/4 0:00:58

CPU开盖降温教程:20元成本让温度直降30度的原理与实践

最近很多朋友都在抱怨,自己的电脑一到夏天就变成"烤箱",玩游戏时CPU温度动不动就飙到90度以上,风扇噪音堪比直升机。更让人头疼的是,明明配置不错,却因为高温降频导致性能大打折扣。如果你也遇到了类似问题&…

2026/9/4 0:00:58

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验

ArkTS 表单工程:场地预约页的三态场次 Grid 与校验 App 14「运动场地预约」场地 Tab(Func1Tab),是整 App 交互最丰富的页面——场地横向切换 三色图例 渐变预约预览卡 快捷模板 今日场次 Grid(可选/已选/已满三态&…

2026/9/3 20:43:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/3 17:51:43

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/3 21:06:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…