当前位置: 首页 > news >正文

SpringAI 搭建智能体(二):搭建客服系统智能体

在现代人工智能应用中,智能体(Agent) 是一个重要的概念,它的核心能力是自主性与灵活性。一个智能体不仅能够理解用户的需求,还能拆解任务、调用工具完成具体操作,并在复杂场景中高效运行。在本篇博客中,我们将围绕一个基于 Spring AI 的智能体实现,深入探讨智能体的概念、构建流程以及实际应用场景。


1. 什么是智能体?

智能体是一种能够根据目标自主执行任务的系统。与传统的 AI 模型生成内容的模式不同,智能体通过整合语义理解、任务分解和工具调用等功能,具备以下特征:

  • 目标驱动:智能体能够根据输入指令明确任务目标。
  • 任务拆解:将复杂任务分解为多个子任务。
  • 工具调用:根据任务需求动态选择并调用工具。
  • 自适应性:根据上下文调整行为,处理动态变化的环境。
智能体 vs 传统 AI

传统 AI 通常专注于单一功能(如文本生成、分类任务等),而智能体是一个更高层次的概念,它整合了多个功能模块,能够在复杂场景中完成多步骤任务。


2. 智能体的核心功能

在一个智能体系统中,核心功能包括:

  1. 语义解析:理解用户输入,明确任务目标。
  2. 工具管理:维护一组工具及其描述,供智能体调用。
  3. 任务执行:动态调用工具完成任务,并整合结果。
  4. 结果生成:将工具返回的结果组合成易于理解的输出。

3. 基于 Spring AI 的智能体架构

我们基于 Spring AI 实现了一个完整的智能体系统,其架构如下:

3.1 核心组件
  1. 工具接口(Tool Interface)
    每个工具都实现一个统一的接口,包含名称、描述、支持状态和执行逻辑等。

  2. 工具管理器(Tool Manager)
    用于维护工具列表并提供工具调用的功能。

  3. 语义分析模块(Semantic Analysis)
    调用 ChatGPT 等语言模型,解析任务并生成格式化的任务步骤。

  4. 智能体核心(Agent Core)
    负责任务拆解、工具调用和结果整合,是智能体的“大脑”。


3.2 智能体执行流程
  1. 用户输入
    用户通过系统输入任务描述,例如:

    查询北京的天气,并获取推荐的景点信息。
    
  2. 工具列表生成
    系统将工具的名称、描述和支持状态提供给语义分析模块。

  3. 任务解析
    语义分析模块(基于 ChatGPT)解析任务,并生成 JSON 格式的任务步骤,例如:

    [{"toolName": "weather", "input": "Beijing"},{"toolName": "tourism", "input": "Beijing"}
    ]
    
  4. 工具调用
    智能体根据任务步骤依次调用对应工具,并获取结果。

  5. 结果整合
    将工具返回的结果整合成最终输出,返回给用户。


4. 实际应用场景

4.1 智能客服

智能体可以根据用户问题调用多个工具完成复杂的客服任务。

  • 示例:用户输入:
    查询上海今天的天气,并推荐适合的活动。
    
    • 工具调用:
      1. WeatherTool 查询天气。
      2. ActivityRecommendationTool 提供活动推荐。
    • 输出结果:
      上海今天晴天,气温 26°C。推荐的活动有:游览外滩、参观上海博物馆。
      

4.2 数据处理与分析

在数据处理场景中,智能体可以调用数据清洗、分析和可视化工具,完成复杂的数据管道任务。

  • 示例:用户输入:
    对销售数据进行清洗,然后计算过去一年的月度增长率。
    
    • 工具调用:
      1. DataCleaningTool 处理数据。
      2. GrowthAnalysisTool 计算增长率。
    • 输出结果:
      数据已清洗。过去 12 个月的月度增长率为:10%、12%、8%...
      

4.3 自动化运维

在运维场景中,智能体可以调用状态检查、日志分析和自动化脚本执行工具。

  • 示例:用户输入:
    检查所有服务器的状态,如果有异常,重新启动服务。
    
    • 工具调用:
      1. HealthCheckTool 检查服务器状态。
      2. RestartServiceTool 重新启动异常服务。
    • 输出结果:
      检查完成。服务器 2 和 5 状态异常,已成功重启服务。
      

5. 智能体的优势

5.1 灵活性

通过语义解析和动态工具调用,智能体能够灵活处理多样化的任务。

5.2 可扩展性

新增工具只需实现工具接口并注册到工具管理器,无需改动核心逻辑。

5.3 可解释性

每个工具调用和结果整合过程都清晰透明,便于调试和改进。


6. 示例代码

以下是客服智能体实现的核心代码示例:

工具接口与实现
public interface Tool {String getName();String getDescription();boolean isSupported();String execute(String input);
}@Component
public class WeatherTool implements Tool {@Overridepublic String getName() {return "weather";}@Overridepublic String getDescription() {return "查询指定城市的天气";}@Overridepublic boolean isSupported() {return true;}@Overridepublic String execute(String input) {return "The weather in " + input + " is sunny and 25°C.";}
}
语义分析模块
@Component
public class ChatGPTService {// 调用 ChatGPT API 的逻辑public String analyze(String task, String toolsList) {// 调用 OpenAI 接口返回任务步骤return "[{\"toolName\": \"weather\", \"input\": \"Beijing\"}]";}
}
智能体核心逻辑
@Component
public class Agent {private final ToolManager toolManager;private final ChatGPTService chatGPTService;@Autowiredpublic Agent(ToolManager toolManager, ChatGPTService chatGPTService) {this.toolManager = toolManager;this.chatGPTService = chatGPTService;}public String execute(String task) {String toolsList = toolManager.getToolsDescription();String stepsJson = chatGPTService.analyze(task, toolsList);List<TaskStep> steps = parseSteps(stepsJson);List<String> results = new ArrayList<>();for (TaskStep step : steps) {results.add(toolManager.executeTool(step.getToolName(), step.getInput()));}return String.join("\n", results);}
}

代码实现
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;
import java.util.List;@Component
public class AdvancedSemanticAgent {private final ToolManager toolManager;private final ChatGPTService chatGPTService;@Autowiredpublic AdvancedSemanticAgent(ToolManager toolManager, ChatGPTService chatGPTService) {this.toolManager = toolManager;this.chatGPTService = chatGPTService;}// 核心执行逻辑public String execute(String task) {// 使用 ChatGPT 进行语义解析,生成任务步骤List<TaskStep> steps = parseTaskWithChatGPT(task);// 执行每一步任务List<String> results = new ArrayList<>();for (TaskStep step : steps) {String result = toolManager.executeTool(step.getToolName(), step.getInput());results.add(result);}// 整合结果return combineResults(results);}// 使用 ChatGPT 解析任务private List<TaskStep> parseTaskWithChatGPT(String task) {String toolList = generateToolListDescription();String prompt = "以下是可用工具列表及其描述,请根据任务选择合适的工具并生成任务步骤。" +"返回结果为 JSON 数组,每个对象包含工具名称(toolName)和输入参数(input)。" +"忽略工具列表中标注为不支持的工具。\n\n" +"任务描述:" + task + "\n\n" +"工具列表:" + toolList;String response = chatGPTService.generateResponse(prompt);// 解析 ChatGPT 返回的 JSONreturn parseStepsFromResponse(response);}// 生成工具列表的描述private String generateToolListDescription() {List<Tool> tools = toolManager.getAvailableTools();StringBuilder toolListBuilder = new StringBuilder();for (Tool tool : tools) {toolListBuilder.append("- 工具名称: ").append(tool.getName()).append(", 描述: ").append(tool.getDescription()).append(", 示例入参: ").append(tool.getExampleInput()).append(", 是否支持: ").append(tool.isSupported() ? "支持" : "不支持").append("\n");}return toolListBuilder.toString();}// 解析 ChatGPT 返回的 JSONprivate List<TaskStep> parseStepsFromResponse(String response) {List<TaskStep> steps = new ArrayList<>();try {ObjectMapper mapper = new ObjectMapper();steps = mapper.readValue(response, new TypeReference<List<TaskStep>>() {});} catch (Exception e) {throw new RuntimeException("解析任务步骤失败:" + e.getMessage(), e);}return steps;}// 整合结果private String combineResults(List<String> results) {return String.join("\n", results);}// 定义子任务步骤static class TaskStep {private String toolName;private String input;// Getters 和 Setterspublic String getToolName() {return toolName;}public void setToolName(String toolName) {this.toolName = toolName;}public String getInput() {return input;}public void setInput(String input) {this.input = input;}}
}

工具接口与管理器

工具接口扩展

扩展工具接口,增加工具描述和支持状态。

public interface Tool {String getName();String getDescription(); // 返回工具的描述String getExampleInput(); // 返回工具的示例入参boolean isSupported(); // 工具是否被支持String execute(String input);
}
工具实现示例

假设我们有三个工具:WeatherTool(支持)、DatabaseTool(支持)、UnsupportedTool(不支持)。

WeatherTool
@Component
public class WeatherTool implements Tool {@Overridepublic String getName() {return "weather";}@Overridepublic String getDescription() {return "查询指定城市的天气信息";}@Overridepublic String getExampleInput() {return "城市名称,例如 'New York'";}@Overridepublic boolean isSupported() {return true;}@Overridepublic String execute(String input) {return "The weather in " + input + " is sunny and 25°C.";}
}
DatabaseTool
@Component
public class DatabaseTool implements Tool {@Overridepublic String getName() {return "database";}@Overridepublic String getDescription() {return "查询数据库中的相关记录";}@Overridepublic String getExampleInput() {return "查询条件,例如 'customer:12345'";}@Overridepublic boolean isSupported() {return true;}@Overridepublic String execute(String input) {return "Query result for input [" + input + "]: {id: 1, name: 'Spring AI'}";}
}
UnsupportedTool
@Component
public class UnsupportedTool implements Tool {@Overridepublic String getName() {return "unsupported";}@Overridepublic String getDescription() {return "这是一个不支持的工具";}@Overridepublic String getExampleInput() {return "无";}@Overridepublic boolean isSupported() {return false;}@Overridepublic String execute(String input) {throw new UnsupportedOperationException("This tool is not supported.");}
}
工具管理器扩展
@Component
public class ToolManager {private final List<Tool> tools;@Autowiredpublic ToolManager(List<Tool> toolList) {this.tools = toolList;}public List<Tool> getAvailableTools() {return tools;}public String executeTool(String toolName, String input) {return tools.stream().filter(tool -> tool.getName().equals(toolName)).findFirst().orElseThrow(() -> new IllegalArgumentException("Tool not found: " + toolName)).execute(input);}
}

示例执行流程

工具列表

通过工具管理器提供给 ChatGPT 的工具列表如下:

工具列表:
- 工具名称: weather, 描述: 查询指定城市的天气信息, 示例入参: 城市名称,例如 'New York', 是否支持: 支持
- 工具名称: database, 描述: 查询数据库中的相关记录, 示例入参: 查询条件,例如 'customer:12345', 是否支持: 支持
- 工具名称: unsupported, 描述: 这是一个不支持的工具, 示例入参: 无, 是否支持: 不支持
输入任务

用户输入任务:

获取纽约的天气,并查询与天气相关的数据库记录。
ChatGPT 返回的结果
[{"toolName": "weather", "input": "New York"},{"toolName": "database", "input": "weather:New York"}
]
工具调用结果

智能体调用工具并返回结果:

The weather in New York is sunny and 25°C.
Query result for input [weather:New York]: {id: 1, name: 'Spring AI'}

7. 未来展望

随着 AI 模型和工具生态的不断发展,智能体将进一步扩展到以下领域:

  • 多模态任务:支持文本、图像、语音等多种输入与输出。
  • 学习与优化:通过强化学习优化任务拆解和工具调用策略。
  • 全局规划:在任务间建立依赖关系,优化多任务执行流程。

智能体是 AI 应用发展的重要方向,其灵活性和扩展性为解决复杂问题提供了强大的工具。


8. 总结

通过引入智能体的概念和实践,我们展示了如何构建一个灵活、高效的系统,完成复杂任务。智能体结合 Spring AI 提供的工具管理和语义分析能力,成为连接用户需求和执行逻辑的桥梁。未来,智能体将在更多场景中展现其强大的应用潜力,为智能化发展注入新动力。

相关文章:

SpringAI 搭建智能体(二):搭建客服系统智能体

在现代人工智能应用中&#xff0c;智能体&#xff08;Agent&#xff09; 是一个重要的概念&#xff0c;它的核心能力是自主性与灵活性。一个智能体不仅能够理解用户的需求&#xff0c;还能拆解任务、调用工具完成具体操作&#xff0c;并在复杂场景中高效运行。在本篇博客中&…...

JAVA设计模式:依赖倒转原则(DIP)在Spring框架中的实践体现

文章目录 一、DIP原则深度解析1.1 核心定义1.2 现实比喻 二、Spring中的DIP实现机制2.1 传统实现 vs Spring实现对比 三、Spring中DIP的完整示例3.1 领域模型定义3.2 具体实现3.3 高层业务类3.4 配置类 四、Spring实现DIP的关键技术4.1 依赖注入方式对比4.2 自动装配注解 五、D…...

LeetCode题练习与总结:N 叉树的前序遍历--589

一、题目描述 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,3,2,4,nu…...

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…...

【漫话机器学习系列】064.梯度下降小口诀(Gradient Descent rule of thume)

梯度下降小口诀 为了帮助记忆梯度下降的核心原理和关键注意事项&#xff0c;可以用以下简单口诀来总结&#xff1a; 1. 基本原理 损失递减&#xff0c;梯度为引&#xff1a;目标是让损失函数减少&#xff0c;依靠梯度指引方向。负梯度&#xff0c;反向最短&#xff1a;沿着负…...

Vue 3 中的 TypeScript:接口、自定义类型与泛型

在 Vue 3 中&#xff0c;TypeScript 提供了强大的类型系统&#xff0c;帮助我们更好地管理代码的类型安全。通过使用 接口&#xff08;Interface&#xff09;、自定义类型&#xff08;Type Aliases&#xff09; 和 泛型&#xff08;Generics&#xff09;&#xff0c;我们可以编…...

[SaaS] 内容创意生产平台

1.即梦 2.讯飞绘镜 typemovie 3.Krea.ai 4.Pika 5.runway 6.pixVerse 7....

低代码系统-产品架构案例介绍、明道云(十一)

明道云HAP-超级应用平台(Hyper Application Platform)&#xff0c;其实就是企业级应用平台&#xff0c;跟微搭类似。 通过自设计底层架构&#xff0c;兼容各种平台&#xff0c;使用低代码做到应用搭建、应用运维。 企业级应用平台最大的特点就是隐藏在冰山下的功能很深&#xf…...

2025年1月26日(超声波模块:上拉或下拉电阻)

添加上拉或下拉电阻是在电子电路设计和嵌入式系统编程中常用的一种技术手段&#xff0c;下面为你详细解释其含义、作用和应用场景。 基本概念 在数字电路里&#xff0c;引脚的电平状态通常有高电平&#xff08;逻辑 1&#xff09;和低电平&#xff08;逻辑 0&#xff09;两种…...

【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现

文章目录 介绍深度循环神经网络&#xff08;DRNN&#xff09;原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 介绍 **自然语言处理&#xff08;Natural Language Pr…...

C语言学习阶段性总结(五)---函数

函数构成五要素&#xff1a; 1、返回值类型 2、函数名 3、参数列表&#xff08;输入&#xff09; 4、函数体 &#xff08;算法&#xff09; 5、返回值 &#xff08;输出&#xff09; 返回值类型 函数名 (参数列表) { 函数体&#xff1b; return 返回值&#xff1b; } void 类型…...

C++初阶—string类

第一章&#xff1a;为什么要学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&…...

Solon Cloud Gateway 开发:Route 的过滤器与定制

RouteFilterFactory 是专为路由过滤拦截处理设计的接口。对应路由配置 filters 1、内置的路由过滤器 过滤器工厂本置前缀说明与示例AddRequestHeaderFilterFactoryAddRequestHeader添加请求头 (AddRequestHeaderDemo-Ver,1.0)AddResponseHeaderFilterFactoryAddResponseHeade…...

【MySQL】 数据类型

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 数据类型 发布时间&#xff1a;2025.1.27 隶属专栏&#xff1a;MySQL 目录 数据类型分类数值类型tinyint类型数值越界测试结果说明 bit类型基本语法使用注意事项 小数类型float语法使用注意事项 decimal语…...

基于vue和elementui的简易课表

本文参考基于vue和elementui的课程表_vue实现类似课程表的周会议列表-CSDN博客&#xff0c;原程序在vue3.5.13版本下不能运行&#xff0c;修改两处&#xff1a; 1&#xff09;slot-cope改为v-slot 2&#xff09;return background-color:rgb(24 144 255 / 80%);color: #fff; …...

vim的多文件操作

[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明&#xff1a;快捷键ctrlshift^&#xff0c…...

spring spring-boot spring-cloud发布以及适配

https://spring.io/blog/2024/10/01/from-spring-framework-6-2-to-7-0 看了 spring 的官网&#xff0c;提到 2025 年 spring 会跟随 jdk 25 LTS发布后&#xff0c;接着发布 Spring Framework 7.0 GA&#xff0c;与之对应 spring 系列的组件版本情况如下。 Spring Framework版…...

【快速上手】阿里云百炼大模型

为了创建自己的知识库&#xff0c;本文介绍一下阿里云的百炼大模型&#xff0c;方便大家快速上手&#xff01;快速查询自己想要的内容。 一、入口页 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 二、大模型的选择 首先前提条件是 1、账号不能欠费 2、需…...

Linux:多线程[2] 线程控制

了解&#xff1a; Linux底层提供创建轻量级进程/进程的接口clone&#xff0c;通过选择是否共享资源创建。 vfork和fork都调用的clone进行实现&#xff0c;vfork和父进程共享地址空间-轻量级进程。 库函数pthread_create调用的也是底层的clone。 POSIX线程库 与线程有关的函数构…...

010 mybatis-PageHelper分页插件

文章目录 添加依赖配置PageHelper项目中使用PageHelper注意事项 PageHelper分页插件介绍 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md 使用方法 添加依赖 <dependency><groupId>com.github.pagehelper</groupId>&l…...

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用&#xff1f; ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点&#xff08;RPO&#xff0c;Recoyery Point Objective&#xff09; ② 应用恢复时间&#xff08;RTO&#xff0c;Recoyery Time Objective&#xff09; 4…...

CVE-2023-38831 漏洞复现:win10 压缩包挂马攻击剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 影响范围 防御措施 复现步骤 环境准备 具体操作 前言 在网络安全这片没有硝烟的战场上&#xff0c;新型漏洞如同隐匿的暗箭&#xff0c;时刻威胁着我们的数字生活。其中&#xff0c;CVE - 2023 - 38831 这个关联 Win10 压缩包挂…...

回顾:Maven的环境搭建

1、下载apache-maven-3.6.0 **网址:**http://maven.apache.org 然后解压到指定的文件夹&#xff08;记住文件路径&#xff09; 2、配置Maven环境 复制bin文件夹 的路径D:\JavaTool\apache-maven-3.6.0\bin 环境配置成功 3、检查是否配置成功 winR 输入cmd 命令行输入mvn -v…...

从零到全栈开发

HTML&#xff1a;超文本标记语言 CSS&#xff1a;层叠样式表 HTML可以理解为框架----&#xff08;毛坯房&#xff09; CSS 可以理解为装修----&#xff08;装修&#xff09; 学习工具&#xff1a; Vscode应用----扩展&#xff08;中文&#xff09; AI ----KiMi &#xff0c;豆…...

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…...

两种交换排序算法--冒泡,快速

目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;基本思想是通过反复交换相邻的元素&#xff0c;直到整个序列有序。它的名字来源于较大的元素像气泡…...

langchain基础(一)

模型又可分为语言模型&#xff08;擅长文本补全&#xff0c;输入和输出都是字符串&#xff09;和聊天模型&#xff08;擅长对话&#xff0c;输入时消息列表&#xff0c;输出是一个消息&#xff09;两大类。 以调用openai的聊天模型为例&#xff0c;先安装langchain_openai库 1…...

【学术会议征稿】第五届能源、电力与先进热力系统学术会议(EPATS 2025)

能源、电力与先进热力系统设计是指结合物理理论、工程技术和计算机模拟&#xff0c;对能源转换、利用和传输过程进行设计的学科领域。它涵盖了从能源的生产到最终的利用整个流程&#xff0c;旨在提高能源利用效率&#xff0c;减少能源消耗和环境污染。 重要信息 官网&#xf…...

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…...

Salesforce Too Many Email Invocations: 11

在 Salesforce 中&#xff0c;“Too Many Email Invocations: 11” 错误通常表示您的组织在单个事务中超过了 Apex 电子邮件调用的限制。Salesforce 设置这些限制是为了防止滥用并确保公平使用。以下是解决该问题的方法&#xff1a; 理解限制 Salesforce 允许每个事务中最多进…...

2274. 不含特殊楼层的最大连续楼层数

2274. 不含特殊楼层的最大连续楼层数 题目链接&#xff1a;2274. 不含特殊楼层的最大连续楼层数 代码如下&#xff1a; class Solution { public:int maxConsecutive(int bottom, int top, vector<int>& special) {ranges::sort(special);int res max(special[0] …...

RGB 转HSV空间颜色寻找色块

文章目录 前言一、绿色确定二、红色确定总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 将RGB颜色空间转换为HSV颜色空间以寻找颜色&#xff0c;主要基于以下几个原因&#xff1a; 直观性&#xff1a; HSV颜色空间更符合人类…...

Kafka生产者ACK参数与同步复制

目录 生产者的ACK参数 ack等于0 ack等于1&#xff08;默认&#xff09; ack等于-1或all Kafka的同步复制 使用误区 生产者的ACK参数 Kafka的ack机制可以保证生产者发送的消息被broker接收成功。 Kafka producer有三种ack机制 &#xff0c;分别是 0&#xff0c;1&#xf…...

计算机图形学试题整理(期末复习/闭or开卷/>100道试题/知识点)

1.各种坐标变换&#xff0c;会产生变换前后维度改变的是&#xff08;投影变换&#xff09;。 A&#xff09;建模变换&#xff1b;B&#xff09;观察变换&#xff1b;C&#xff09;投影变换&#xff1b;D&#xff09;视口变换 不同的坐标变换对维度的影响如下&#xff1a; 建模…...

Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU

Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南&#xff1a;让Docker拥抱GPU 前言一、环境准备1.1 验证驱动状态 二、安装NVIDIA Container Toolkit2.1 添加官方仓库2.2 执行安装 三、配置Docker运行时3.1 更新Docker配置 四、验证安装结果4.1 运行测试容器 五、实战应用 …...

python3+TensorFlow 2.x(三)手写数字识别

目录 代码实现 模型解析&#xff1a; 1、加载 MNIST 数据集&#xff1a; 2、数据预处理&#xff1a; 3、构建神经网络模型&#xff1a; 4、编译模型&#xff1a; 5、训练模型&#xff1a; 6、评估模型&#xff1a; 7、预测和可视化结果&#xff1a; 输出结果&#xff…...

aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容&#xff1a; AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…...

GestureDetector组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了ListView响应事件的内容,本章回中将介绍GestureDetector Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的GestureDetector是一个事件响应Widget,它可以响应双击事件&…...

【HuggingFace项目】:Open-R1 - DeepSeek-R1 大模型开源复现计划

项目链接&#xff1a;https://github.com/huggingface/open-r1 概述 Open-R1 是由 HuggingFace 发布的一个完全开放的项目&#xff0c;旨在通过三个主要步骤复现 DeepSeek-R1 的完整训练流程。这个项目的目标是让更多人能够理解和使用 DeepSeek-R1 的技术方案&#xff0c;从而…...

K8S中数据存储之配置存储

配置存储 在Kubernetes中&#xff0c;ConfigMap和Secret是两种核心资源&#xff0c;用于存储和管理应用程序的配置数据和敏感信息。理解它们的功能和最佳实践对于提高Kubernetes应用程序的安全性和配置管理的效率至关重要。 ConfigMap ConfigMap是一种API对象&#xff0c;允许…...

群辉折腾日记【连续剧】

安装群辉6.23版本 对比不同的版本以及自己的硬件条件&#xff0c;我选择了6.2.3稳定养老版本&#xff0c;硬件参数可以看之前的文章&#xff1a;pve (群辉、软路由、win/linux)折腾日记 之前年轻气盛喜欢折腾&#xff0c;秉持着一个原则&#xff0c;可以不用&#xff0c;但不能…...

AIGC视频生成模型:慕尼黑大学、NVIDIA等的Video LDMs模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓&#xff0c;而慕尼黑大学同样不容小觑&#xff0c;…...

Hadoop 与 Spark:大数据处理的比较

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

VB6.0 显示越南语字符

近期接到客户咨询&#xff0c;说是VB6.0写软件界面上显示越南语乱码&#xff0c;需要看看怎样解决。 我在自己电脑上也试了下&#xff0c;确实显示越南语结果是乱码。编辑器里乱码&#xff0c;运行起来界面上也是乱码。 经过一天的折腾&#xff0c;算是解决了问题&#xff0c…...

微信小程序中实现进入页面时数字跳动效果(自定义animate-numbers组件)

微信小程序中实现进入页面时数字跳动效果 1. 组件定义,新建animate-numbers组件1.1 index.js1.2 wxml1.3 wxss 2. 使用组件 1. 组件定义,新建animate-numbers组件 1.1 index.js // components/animate-numbers/index.js Component({properties: {number: {type: Number,value…...

网络仿真工具Core环境搭建

目录 安装依赖包 源码下载 Core安装 FAQ 下载源码TLS出错误 问题 解决方案 找不到dbus-launch 问题 解决方案 安装依赖包 调用以下命令安装依赖包 apt-get install -y ca-certificates git sudo wget tzdata libpcap-dev libpcre3-dev \ libprotobuf-dev libxml2-de…...

JavaScript 的 Promise 对象和 Promise.all 方法的使用

JavaScript 中的 Promise 对象 什么是 Promise? Promise 是一种用于处理异步操作的对象。它代表一个尚未完成但预计将来会完成的操作及其结果。 主要特点&#xff1a; 状态: Pending&#xff08;进行中&#xff09;: 初始状态&#xff0c;既未成功&#xff0c;也未失败。Fu…...

农产品价格报告爬虫使用说明

农产品价格报告爬虫使用说明 # ************************************************************************** # * * # * 农产品价格报告爬虫 …...

Java 大视界 -- Java 大数据中的隐私增强技术全景解析(64)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

实战Linux Swap扩展分区

文章目录 定义命令格式案例注释 定义 Swap分区是Linux系统中的一种虚拟内存实现方式&#xff0c;它是磁盘上预留的专用区域。当系统的物理内存不足时&#xff0c;会将部分不活跃的数据从物理内存移动到Swap分区&#xff0c;从而释放更多可用内存空间。 命令格式 关闭Swap分区…...