基于SpringAI实现简易聊天对话
简介
本文旨在记录学习和实践 Spring AI Alibaba 提供的 ChatClient 组件的过程。ChatClient 是 Spring AI 中用于与大语言模型(LLM)进行交互的高级 API,它通过流畅(Fluent)的编程接口,极大地简化了构建聊天应用程序的复杂度。相比直接使用底层的 ChatModel,ChatClient 封装了提示词构建、响应处理、结构化输出、流式响应以及与 RAG、聊天记忆等高级功能的集成。
通过本文的学习,我们将掌握:
ChatClient 的核心概念和优势。
如何创建和配置 ChatClient 实例。
使用 ChatClient 处理不同类型的 AI 响应(文本、完整响应对象、结构化实体、流式响应)。
结合 Spring Boot 快速搭建一个可交互的聊天后端服务。
了解 Server-Sent Events (SSE) 在流式响应中的应用。
我们将从官方文档入手,结合代码实践,逐步深入理解 ChatClient 的使用方法。
ChatClient相关原理
核心知识点:ChatClient in Spring AI Alibaba
ChatClient 是 Spring AI Alibaba 提供的一个更高级别的 API,用于与 AI 模型进行交互。它旨在简化开发流程,特别是当应用程序需要组合多个组件(如提示词模板、聊天记忆、模型本身、输出解析器、RAG 组件等)时。
- ChatClient 简介
目的: 提供一个 Fluent API (流畅 API) 与 AI 模型通信,支持同步和反应式 (Reactive) 编程模型。
优势:
隐藏复杂性: 将与 LLM (Large Language Model) 及其他组件(提示词模板、聊天记忆、RAG 等)交互的复杂性封装起来。
减少样板代码: 相比直接使用 ChatModel、Message 等原子 API,ChatClient 减少了需要编写的重复性代码。
类似服务层: 在应用程序中扮演类似服务层 (Service Layer) 的角色,直接为应用提供 AI 服务。
快速组装交互流程: 使用 Fluent API 可以快速地组装一个完整的 AI 交互流程。
基础功能:
定制和组装模型的输入 (Prompt)。
格式化解析模型的输出 (结构化输出 Structured Output)。
调整模型交互参数 (ChatOptions)。
高级功能:
聊天记忆 (Chat Memory)。
工具/函数调用 (Function Calling)。
检索增强生成 (RAG)。
- 创建 ChatClient
创建 ChatClient 实例需要使用 ChatClient.Builder 对象。有两种主要方式获取 ChatClient:
方式一:使用自动配置的 ChatClient.Builder (推荐)
Spring Boot 会根据你的依赖和配置自动创建一个默认的 ChatClient.Builder Bean。
你只需要在你的类中注入这个 ChatClient.Builder,然后调用 build() 方法即可获得 ChatClient 实例。
示例代码 (带详细注释):
import org.springframework.ai.chat.client.ChatClient; // 导入 ChatClient 类
import org.springframework.web.bind.annotation.GetMapping; // 导入 GetMapping 注解,用于处理 HTTP GET 请求
import org.springframework.web.bind.annotation.RequestParam; // 导入 RequestParam 注解,用于获取请求参数
import org.springframework.web.bind.annotation.RestController; // 导入 RestController 注解,标识这是一个 RESTful 控制器 // 声明这是一个 Spring MVC 的 REST 控制器,其方法默认返回 JSON 或其他指定格式的数据
public class ChatController {// 声明一个 final 的 ChatClient 成员变量,用于与 AI 模型交互private final ChatClient chatClient;// 控制器的构造函数// Spring Boot 会自动查找并注入一个 ChatClient.Builder 类型的 Beanpublic ChatController(ChatClient.Builder builder) {// 使用注入的 builder 构建 ChatClient 实例,并赋值给成员变量// builder 会使用自动配置好的底层 ChatModel (例如通义千问模型) 和其他默认设置this.chatClient = builder.build();}("/chat") // 将 HTTP GET 请求映射到 /chat 路径// @RequestParam("input") String input 表示从请求参数中获取名为 "input" 的值,并赋给 input 变量public String chat(("input") String input) {// 使用 chatClient 的 Fluent API 开始构建一个请求return this.chatClient.prompt() // 1. 调用 prompt() 方法开始构建一个 Prompt (提示).user(input) // 2. 调用 user() 方法设置用户角色的消息内容,内容为传入的 input 字符串.call() // 3. 调用 call() 方法,执行与 AI 模型的同步调用 (发送请求并等待响应).content(); // 4. 调用 content() 方法,从 AI 模型的响应 (ChatResponse) 中提取文本内容并返回}
}
方式二:以编程方式创建 ChatClient
禁用自动配置: 如果你想完全控制 ChatClient 的创建过程,或者需要使用多个不同的 ChatModel 实例,可以先禁用 ChatClient.Builder 的自动配置。在 application.properties 或 application.yml 中设置:
spring.ai.chat.client.enabled=false
手动创建: 然后,你可以手动创建 ChatClient.Builder,并传入你想要使用的 ChatModel 实例。
示例代码 (带详细注释):
import org.springframework.ai.chat.client.ChatClient; // 导入 ChatClient 类
import org.springframework.ai.chat.model.ChatModel; // 导入 ChatModel 接口// ... 其他 importpublic class MyService {private final ChatClient customChatClient;// 假设 myChatModel 是你通过其他方式配置或注入的特定 ChatModel 实例public MyService(ChatModel myChatModel) {// 方法一:使用 ChatClient.builder() 静态方法,并传入 ChatModel 实例ChatClient.Builder builder = ChatClient.builder(myChatModel);// 这里可以继续使用 builder 配置其他选项,例如 .defaultOptions(), .defaultSystem(), etc.this.customChatClient = builder.build(); // 构建 ChatClient 实例// 方法二:使用 ChatClient.create() 静态方法,这是一个更简洁的方式// 它会使用传入的 ChatModel 和默认的 Builder 设置来创建 ChatClient// this.customChatClient = ChatClient.create(myChatModel);}public String askSomething(String question) {// 使用手动创建的 customChatClient 进行交互return customChatClient.prompt().user(question).call().content();}
}
- 处理 ChatClient 响应
ChatClient API 提供了多种方式来处理和格式化来自 AI 模型的响应:
返回 ChatResponse:
call() 或 stream() 方法默认返回 ChatResponse 对象。
ChatResponse 是一个丰富的结构,包含:
AI 生成的实际结果 (Generation)。
与响应生成相关的元数据 (例如模型名称、token 使用情况等)。
可能包含多个子响应结果 (如果模型支持,例如返回多个候选答案)。
你可以从 ChatResponse 中获取详细信息。
示例: (在上面的 /chat 接口示例中,.call() 返回的就是 ChatResponse,之后 .content() 是从中提取内容)
返回实体类 (Entity) - 结构化输出:
ChatClient 支持将 AI 模型的文本输出自动映射为你定义的 Java POJO (Plain Old Java Object)。这对于需要固定格式输出的场景非常有用。
使用 .entity(YourClass.class) 方法来指定期望的输出类型。
示例代码 (带详细注释):
import org.springframework.ai.chat.client.ChatClient; // 导入 ChatClient 类
import org.springframework.web.bind.annotation.GetMapping; // 导入 GetMapping 注解
import org.springframework.web.bind.annotation.RequestParam; // 导入 RequestParam 注解
import org.springframework.web.bind.annotation.RestController; // 导入 RestController 注解
public class StructuredOutputController {private final ChatClient chatClient;// 定义一个简单的 POJO 类,用于接收结构化输出static class ActorFilms {public String actor; // 演员姓名public List<String> movies; // 电影列表}public StructuredOutputController(ChatClient.Builder builder) {this.chatClient = builder.build();}("/actor-films") // 将 HTTP GET 请求映射到 /actor-films 路径public ActorFilms getActorFilms(("actor") String actorName) {// 使用 chatClient 的 Fluent APIreturn this.chatClient.prompt()// 设置用户消息,要求模型列出指定演员的电影,并明确要求 JSON 格式.user("Generate a list of films for the actor " + actorName + ". Respond in JSON format with keys 'actor' and 'movies'.").call() // 执行与 AI 模型的同步调用// 调用 entity() 方法,并传入 ActorFilms.class// ChatClient 会尝试将 AI 返回的文本内容 (预期是 JSON 字符串)// 解析并映射到 ActorFilms 类的实例中.entity(ActorFilms.class);}
}
流式响应 (Streaming):
对于需要实时显示或处理部分结果的场景 (例如聊天机器人),可以使用流式响应。
调用 .stream() 方法代替 .call()。
.stream() 方法返回一个 Flux (如果使用了 Reactive 库) 或支持类似的流式处理机制。你可以订阅这个流来接收模型逐步生成的内容块。
示例代码 (概念性,具体实现依赖 Reactive 库如 Project Reactor):
import org.springframework.ai.chat.client.ChatClient; // 导入 ChatClient 类
import org.springframework.http.MediaType; // 导入 MediaType 类
import org.springframework.web.bind.annotation.GetMapping; // 导入 GetMapping 注解
import org.springframework.web.bind.annotation.RequestParam; // 导入 RequestParam 注解
import org.springframework.web.bind.annotation.RestController; // 导入 RestController 注解
import reactor.core.publisher.Flux; // 导入 Flux 类 (来自 Project Reactor)
import org.springframework.ai.chat.model.ChatResponse; // 导入 ChatResponse 类
public class StreamingChatController {private final ChatClient chatClient;public StreamingChatController(ChatClient.Builder builder) {this.chatClient = builder.build();}// produces = MediaType.TEXT_EVENT_STREAM_VALUE 指定响应类型为 Server-Sent Events (SSE)(value = "/stream-chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> streamChat(("input") String input) {// 使用 chatClient 的 Fluent APIreturn this.chatClient.prompt().user(input) // 设置用户消息.stream() // 1. 调用 stream() 方法,启动与 AI 模型的流式交互,返回 Flux<ChatResponse>.content(); // 2. 调用 content() 方法 (针对 Flux),将 ChatResponse 流映射为 String 内容流// 每次模型生成一部分内容,就会在这个 Flux 中发布一个 String 片段}// 如果需要更详细的流信息,可以直接处理 Flux<ChatResponse>(value = "/stream-chat-response", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ChatResponse> streamChatResponse(("input") String input) {return this.chatClient.prompt().user(input).stream() // 直接返回 ChatResponse 的流.chatResponse(); // 获取原始的 ChatResponse 流}
}
- 定制 ChatClient 默认值
可以在创建 ChatClient 时设置一些默认行为,这些默认值会应用于该 ChatClient 实例发出的所有请求,除非在单次请求中被覆盖。
设置默认系统消息 (System Message):
系统消息通常用于给 AI 模型设定角色、提供指令或上下文背景。
在 ChatClient.Builder 上调用 .defaultSystem(…) 方法。
ChatClient chatClient = ChatClient.builder(chatModel)// 设置默认的系统消息,告诉 AI 它是一个乐于助人的 AI 助手.defaultSystem("You are a helpful AI assistant.").build();// 后续使用这个 chatClient 发送请求时,会自动带上这个系统消息
chatClient.prompt().user("What is the capital of France?").call().content();
其他默认设置:
默认用户消息: .defaultUser(…)
默认模型选项: .defaultOptions(…),可以设置温度 (temperature)、最大 token 数 (maxTokens) 等模型参数。
默认函数: .defaultFunctions(…) (用于 Function Calling)
默认头信息: .defaultHeaders(…) (可能用于特定模型的 API 调用)
- Advisors (增强器/顾问)
Advisors 是一种强大的机制,用于向 ChatClient 的请求/响应流程中添加额外的功能,类似于中间件 (Middleware) 或 AOP (Aspect-Oriented Programming) 中的切面。
它们可以在请求发送前对其进行修改,或者在收到响应后对其进行处理。
通过 ChatClient.Builder 的 .defaultAdvisors(…) 方法添加。
常见的 Advisors 应用场景:
检索增强生成 (RAG): 在发送用户问题给 LLM 之前,先从知识库 (Vector Store) 中检索相关文档,并将文档内容添加到提示词中。QuestionAnswerAdvisor 是一个常见的 RAG Advisor。
聊天记忆 (Chat Memory): 在发送请求前,从 ChatMemory 组件中加载历史对话记录,并将其添加到提示词中;在收到响应后,将当前的问答对保存到 ChatMemory 中。ChatMemoryAdvisor 用于此目的。
日志记录: 记录请求和响应的详细信息。
示例 (概念性):
// 假设 vectorStore 和 chatMemory 是已经配置好的 Bean
VectorStore vectorStore = ...;
ChatMemory chatMemory = ...;ChatClient chatClient = ChatClient.builder(chatModel)// 添加一个 RAG Advisor,使用指定的 VectorStore 进行检索.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))// 添加一个聊天记忆 Advisor.defaultAdvisors(new ChatMemoryAdvisor(chatMemory)).build();// 现在使用这个 chatClient 时,会自动进行 RAG 检索和聊天记忆管理
chatClient.prompt().user("Tell me about Spring AI based on my previous questions.").call().content();
总结:
ChatClient 是 Spring AI Alibaba 中进行 AI 模型交互的核心组件之一。它通过 Fluent API 极大地简化了与 AI 模型的通信,隐藏了底层实现的复杂性,并提供了强大的功能,如结构化输出、流式响应和通过 Advisors 实现的 RAG、聊天记忆等高级特性。掌握 ChatClient 的使用对于在 Spring 应用中高效地集成 AI 功能至关重要。
资料推荐
💡大模型中转API推荐
✨中转使用教程
相关文章:
基于SpringAI实现简易聊天对话
简介 本文旨在记录学习和实践 Spring AI Alibaba 提供的 ChatClient 组件的过程。ChatClient 是 Spring AI 中用于与大语言模型(LLM)进行交互的高级 API,它通过流畅(Fluent)的编程接口,极大地简化了构建聊天…...
STM32单片机入门学习——第49节: [15-2] 读写内部FLASH读取芯片ID
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.29 STM32开发板学习——第49节: [15-2] 读写内部FLASH&读取芯片ID 前言开发板说…...
第14讲:科研图表的导出与排版艺术——高质量 PDF、TIFF 输出与投稿规范全攻略!
目录 📘 前言:导出,不只是“保存”! 🎯 一、你需要掌握的导出目标 🖼️ 二、TIFF / PNG 导出规范(适用于投稿) 🧲 三、PDF 矢量图导出(排版首选) 🧩 四、强烈推荐组合:showtext + Cairo 🧷 五、多个图的组合导出技巧 🧪 六、特殊投稿需求处理 �…...
SRIO IP调试问题记录(ready信号不拉高情况)
问题:调试过程中遇到有时写入数据后数据不发送,并且ready信号在写入一定数据后一直拉低的情况(偶发,不是每次必然出现)。buf空间设置为16时,写入15包数据,写完第16包包头后,ready信号…...
使用DDR4控制器实现多通道数据读写(十)
一、本章概述 本章节对目前单通道的读写功能进项测试,主要验证读写的数据是否正确,并观察该工程可以存储的最大容量。通过空满信号进行读写测试,根据ila抓取fifo和ddr4全部满的时刻,可以观察到最大容量。再通过debug逻辑可以测试读…...
从 BERT 到 GPT:Encoder 的 “全局视野” 如何喂饱 Decoder 的 “逐词纠结”
当 Encoder 学会 “左顾右盼”:Decoder 如何凭 “单向记忆” 生成丝滑文本? 目录 当 Encoder 学会 “左顾右盼”:Decoder 如何凭 “单向记忆” 生成丝滑文本?引言一、Encoder vs Decoder:核心功能与基础架构对比1.1 本…...
探寻软件稳定性的奥秘
在软件开发的广袤领域中,软件的稳定性宛如基石,支撑着整个软件系统的运行与发展。《发布!软件的设计与部署》这本书的第一部分,对软件稳定性进行了深入且全面的剖析,为软件开发人员、架构师以及相关从业者们提供了极具…...
Reverse-WP记录9
前言 之前写的,一直没发,留个记录吧,万一哪天记录掉了起码在csdn有个念想 1.easyre1 32位无壳elf文件 shiftF12进入字符串,发现一串数字,双击进入 进入main函数 int __cdecl main(int argc, const char **argv, const…...
日常开发小Tips:后端返回带颜色的字段给前端
一般来说,展示给用户的字体格式,都是由前端控制,展现给用户; 但是当要表示某些字段的数据为异常数据,或者将一些关键信息以不同颜色的形式呈现给用户时,而前端又不好判断,那么就可以由后端来控…...
partition_pdf 和chunk_by_title 的区别
from unstructured.partition.pdf import partition_pdf from unstructured.chunking.title import chunk_by_titlepartition_pdf 和 chunk_by_title 初看有点像,都在"分块",但是它们的本质完全不一样。 先看它们核心区别 partition_pdfchun…...
JAVA-使用Apache POI导出数据到Excel,并把每条数据的图片打包成zip附件项
最近项目要实现一个功能,就是在导出报表的时候 ,要把每条数据的所有图片都要打包成zip附件在excel里一起导出。 1. 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>…...
前端——CSS1
一,概述 CSS(Cascading Style Sheets)(级联样式表) css是一种样式表语言,为html标签修饰定义外观,分工不同 涉及:对网页的文字、背景、宽、高、布局进行修饰 分为内嵌样式表&…...
《AI大模型应知应会100篇》【精华】第40篇:长文本处理技巧:克服大模型的上下文长度限制
[精华]第40篇:长文本处理技巧:克服大模型的上下文长度限制 摘要 在大语言模型应用中处理超出其上下文窗口长度的长文本是一项挑战。本文面向初学者介绍长文本处理的常见难题,以及一系列有效策略和技巧,包括如何对文档进行合理分…...
开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验(一)
一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...
千问3(Qwen3)模型开源以及初体验
体验地址:百炼控制台 1 千问3模型:全球最强开源大模型震撼发布 2025年4月29日,阿里巴巴正式开源了新一代通义千问模型Qwen3(简称千问3),这一里程碑式的事件标志着中国开源大模型首次登顶全球性能榜首。千问…...
对 FormCalc 语言支持较好的 PDF 编辑软件综述
FormCalc是一种专为PDF表单计算设计的脚本语言,主要应用于Adobe生态及SAP相关工具。以下是对FormCalc支持较好的主流软件及其特点: 1. Adobe LiveCycle Designer 作为FormCalc的原生开发环境,LiveCycle Designer提供最佳支持: …...
20250429-李彦宏口中的MCP:AI时代的“万能接口“
目录 一、什么是MCP? 二、为什么需要MCP? 三、MCP的工作原理 3.1 核心架构 3.2 工作流程 四、MCP的应用场景 4.1 开发者工具集成 4.2 智能助手增强 4.3 企业应用集成 4.4 典型案例 五、MCP的技术特点 5.1 标准化接口 5.2 可扩展性设计 5.…...
汽车启动原理是什么?
好的!同学们,今天我们来讨论汽车的启动原理,重点分析其中的动力来源和摩擦力作用。我会结合物理概念,用尽量直观的方式讲解。 1. 汽车为什么会动?——动力的来源 汽车发动机(内燃机或电动机)工…...
LeetCode[347]前K个高频元素
思路: 使用小顶堆,最小的元素都出去了,省的就是大,高频的元素了,所以要维护一个小顶堆,使用map存元素高频变化,map存堆里,然后输出堆的东西就行了 代码: class Solution…...
《软件测试52讲》学习笔记:如何设计一个“好的“测试用例?
引言 在软件测试领域,设计高质量的测试用例是保证软件质量的关键。本文基于茹炳晟老师在《软件测试52讲》中关于测试用例设计的讲解,结合个人学习心得,系统总结如何设计一个"好的"测试用例。 一、什么是"好的"测试用例…...
【深度学习新浪潮】ISP芯片算法技术简介及关键技术分析
ISP芯片及其功能概述 ISP(Image Signal Processor)芯片作为现代影像系统的核心组件,负责对图像传感器输出的原始信号进行后期处理。ISP的主要功能包括线性纠正、噪声去除、坏点修复、色彩校正以及白平衡调整等,这些处理步骤对于提高图像质量和视觉效果至关重要。随着科技的…...
QtCreator Kits构建套件报错(红色、黄色感叹号)
鼠标移动上去,查看具体报错提示。 一.VS2022Qt5.14.2(MSVC2017) 环境VS2022Qt5.14.2(MSVC2017) 错误:Compilers produce code for different ABIs:x86-windows-msvc2005-pe-64bit,x86-windows-msvc2005-pe-32bit 错误࿱…...
天能资管(SkyAi):全球布局,领航资管新纪元
在全球化浪潮汹涌澎湃的今天,资管行业的竞争已不再是单一市场或区域的较量,而是跨越国界、融合全球资源的全面竞争。天能资管(SkyAi),作为卡塔尔投资局(Qatar Investment Authority,QIA)旗下的尖端科技品牌,正以其独特的全球视野和深远的战略眼光,积极布局资管赛道,力求在全球资…...
基于PHP的宠物用品商城
有需要请加文章底部Q哦 可远程调试 基于PHP的宠物用品商城 一 介绍 宠物用品商城系统基于原生PHP开发,数据库mysql,前端bootstrap,jquery.js等。系统角色分为用户和管理员。(附带参考文档) 技术栈:phpmysqlbootstrapphpstudyvsc…...
桂链:使用Fabric的测试网络
桂链是基于Hyperledger Fabric开源区块链框架扩展开发的区块链存证平台,是桂云网络(OSG)公司旗下企业供应链、流程审批等场景数字存证软件产品,与桂花流程引擎(Osmanthus)并列为桂云网络旗下的标准与可定制…...
k8s术语master,node,namepace,LABLE
1.Master Kubernetes中的master指的是集群控制节点,每个kubernetes集群里都需要有一个Master节点来负责整个集群的管理和控制,基本上kubernetes的所有控制命令都发给它,它来负责具体的执行过程。Master节点通常会占据一个独立的服务器(高可用建议3台服务器)。 Master节点…...
香港科技大学广州|智能制造学域硕、博研究生招生可持续能源与环境学域博士招生宣讲会—四川大学专场!
香港科技大学广州|智能制造学域硕、博研究生招生&可持续能源与环境学域博士招生宣讲会—四川大学专场!!! 两个学域代表教授亲临现场,面对面答疑解惑助攻申请!可带简历现场咨询和面试! &am…...
【Vue】 实现TodoList案例(待办事项)
目录 组件化编码流程(通用) 1.实现静态组件:抽取组件,使用组件实现静态页面效果 2.展示动态数据: 1. 常规 HTML 属性 3.交互——从绑定事件监听开始 什么时候要用 event: 什么时候不需要用 event&am…...
Ubuntu 20.04 安装 ROS 2 Foxy Fitzroy
目录 1,安装前须知 2,安装过程 2.1,设置语言环境 2.2,设置源 2.3,安装ROS 2软件包 2.4,环境设置 2.5,测试 2.6,不想每次执行source 检验是否成功(另…...
【Unity】使用LitJson保存和读取数据的例子
LitJson 是一个轻量级的 JSON 解析和生成库,广泛应用于 .NET 环境中。 优点:轻量级,易用,性能优秀,支持LINQ和自定义对象的序列化和反序列化。 public class LitJsonTest : MonoBehaviour { // Start is called before…...
飞蛾扑火算法优化+Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)
飞蛾扑火算法优化Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型) 目录 飞蛾扑火算法优化Transformer四模型回归打包(内含MFO-Transformer-LSTM及单独模型)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 …...
物联网平台厂商有哪些?2025物联网平台推荐?国内有哪些比较好的物联网平台?
评选维度: 技术实力:涵盖设备接入规模、数据处理效率、AI/边缘计算融合能力、协议兼容性及平台架构先进。 应用场景:包括垂直领域解决方案的成熟度、定制化能力、跨行业复用性及实际落地案例规模。 安全可靠:涉及数据传输加密、…...
瑞幸咖啡披露2025年Q1财报:门店净增1757家,营业利润率达8.3%
4月29日,瑞幸咖啡(OTC:LKNCY)公布2025年第一季度财报。数据显示,2025年第一季度总净收入88.65亿元人民币,同比增长41.2%,GMV达103.54亿元人民币。截止一季度末,门店总数达24097家。依…...
selenium IDE脚本如何转换为可运行的selenium webdriver java程序
上一篇博客(用selenium4 webdriver java 搭建并完成第一个自动化测试脚本-CSDN博客)介绍了如何创建一个selenium webdriver 的java工程。 之前博客(带你用selenium IDE的录制第一个自动化测试脚本也介绍了如何使用selenum ide …...
GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断,作者:机器学习之心
GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断 目录 GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GA-Transformer遗传算法优化编码器多特征分类预测/故障诊断,运行环境M…...
LeetCode热题100--53.最大子数组和--中等
1. 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,4] 输出&…...
【计算机视觉】深度解析MediaPipe:谷歌跨平台多媒体机器学习框架实战指南
深度解析MediaPipe:谷歌跨平台多媒体机器学习框架实战指南 技术架构与设计哲学核心设计理念系统架构概览 核心功能与预构建解决方案1. 人脸检测2. 手势识别3. 姿势估计4. 物体检测与跟踪 实战部署指南环境配置基础环境准备获取源码 构建第一个示例(手部追…...
血管造影正常≠心脏没事!无创技术破解心肌缺血漏诊困局
提到冠心病检查,很多人会纠结:到底哪项检查能更全面地反映病情、精准得出结论? 从准确性来说,冠脉 CT 与冠脉造影是临床常用手段。二者虽然能够清晰显示血管大冠脉是否存在狭窄或斑块,但二者本质上有相同的 “局限性”…...
ClickHouse副本集群
每个节点安装clickhouse服务安装 zookeeper每个节点修改 /etc/clickhouse-server/config.xml 863行左右 <remote_servers><default><shard><replica><host>18.1.13.30</host><port>9000</port></replica><replica&g…...
Go 语言中的 `os.Truncate` 函数详解
os.Truncate 是 Go 标准库中用于修改文件大小的函数。下面我将全面解析这个函数的功能、用法和注意事项。 函数签名 func Truncate(name string, size int64) error核心功能 os.Truncate 用于: 将指定文件截断或扩展到指定大小处理符号链接时会操作链接指向的实…...
java 加入本地lib jar处理方案
在 Java 项目中,如果想将本地的 .jar 文件加入到 Maven 构建流程中,有以下几种常见方式可以选择: ✅ 推荐方式:将本地 JAR 安装到本地 Maven 仓库 这是最佳实践。通过 mvn install:install-file 命令把JAR 包安装到本地仓库&…...
【Git】之【Get】TortoiseGit不显示状态图标
参考:Windows中解决TortoiseGit 不显示状态图标的问题 实测可行。 打开注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers路径 确保TortoiseGit文件夹在前几个,可以重命名将其他无关…...
[Linux网络_68] 转发 | 路由(Hop by Hop) | IP的分片和组装
目录 1.再谈网络转发 2.路由 举个例子 3.分片和组装 IP 层 [Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器 1.再谈网络转发 我们在上一篇文章中知道了路由器的功能有: 转发DHCP | 组建局域网NAT 组建局域网功能表现&…...
Sce2DriveX: 用于场景-到-驾驶学习的通用 MLLM 框架——论文阅读
《Sce2DriveX: A Generalized MLLM Framework for Scene-to-Drive Learning》2025年2月发表,来自中科院软件所和中科院大学的论文。 端到端自动驾驶直接将原始传感器输入映射到低级车辆控制,是Embodied AI的重要组成部分。尽管在将多模态大语言模型&…...
论文笔记-多智能体任务分配:动态智能空间中的拍卖与抢占机制
《IET Cyber-Systems and Robotics》出版中国电信研究院 Wei Li、Zhenhua Liu 团队与山东大学 Jianhang Shang 和 Guoliang Liu 团队的研究成果,文章题为“Multiagent Task Allocation for Dynamic Intelligent Space: Auction and Preemption With Ontology Knowle…...
数据库day-08
一、实验名称和性质 删除修改数据 验证 设计 二、实验目的 1.掌握数据操作-- 删除、修改; 三、实验的软硬件环境要求 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: Windows 10&#x…...
.NET 平台详解
什么是 .NET? .NET 是一个由微软开发的跨平台、开源的开发者平台,用于构建多种类型的应用程序。它提供了一致的编程模型和丰富的类库,支持多种编程语言(如 C#、F#、Visual Basic)。 .NET 的核心组成 运行时环境 CLR …...
高效 Transformer 的综述
20年9月来自谷歌研究的论文“Efficient Transformers: A Survey”。 文章主要针对一类X-former模型,例如Reformer, Linformer, Performer, Longformer为例,这些对原版Transformer做了改进,提高了其计算和内存的效率。 self-attention是Tran…...
java每日精进 4.29【框架之自动记录日志并插入如数据库流程分析】
1.日志记录注解(LogRecord) Repeatable(LogRecords.class) Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface LogRecord {String success();String fail() default "&q…...
HarmonyOS NEXT 诗词元服务项目开发上架全流程实战(二、元服务与应用APP签名打包步骤详解)
在HarmonyOS应用开发过程中,发布应用到应用市场是一个重要的环节。没经历过的童鞋,首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请,混在一起分不清。其实搞清楚后也就那会事,各个文件都有它存在的作…...