Spring AI 与大语言模型工具调用机制详细笔记
一、基本概念
大语言模型(LLM)工具调用机制是一种允许AI模型与外部系统交互的技术框架,它使模型能够在对话过程中请求调用预定义的函数或服务。这种机制极大地扩展了大模型的能力边界,使其不再局限于静态知识,而是能够实时获取信息、执行计算、访问数据库或调用业务逻辑。在Spring AI中,这一机制通过结构化的接口和注解系统实现,为开发者提供了简洁而强大的方式来集成AI能力与现有业务系统。
二、工具调用原理
1. 核心思想
- 职责分离:大模型负责理解用户意图并决定何时调用工具,但不直接执行代码。模型只会生成调用指令,描述应该调用哪个工具以及使用什么参数。
- 安全执行:实际的代码执行完全由应用框架控制,确保了系统安全性和可靠性。开发者可以严格限制模型能够访问的功能范围。
- 双向通信:执行结果会返回给模型,模型结合这些信息生成最终对用户的回复,形成一个完整的信息流循环。
- 语义映射:框架负责将模型的自然语言理解转换为具体的程序调用,并将程序输出转回自然语言。
2. 代码示例与解析
ChatClient.CallResponseSpec response = llmService.getPlanningChatClient().prompt(prompt).tools(List.of(planningTool.getFunctionToolCallback())).advisors(memoryAdvisor -> memoryAdvisor.param("chat_memory_conversation_id", planId).param("chat_memory_retrieve_size", 100)).call();
这段代码展示了Spring AI中构建工具调用请求的完整过程,它通过链式调用方式设置了对话内容、可用工具和记忆管理等关键参数,最终发起API调用并获取响应结果。
三、方法详细解析
-
getPlanningChatClient():
获取专用于规划任务的聊天客户端实例。这是一个工厂方法,根据特定任务类型返回配置好的客户端对象。客户端封装了与大模型通信的所有细节,包括认证、请求格式化、响应解析等复杂逻辑。 -
prompt():
设置发送给模型的提示词或用户问题。提示词是模型理解用户意图的关键,它可以包含任务描述、上下文信息、约束条件和期望输出格式等内容。良好设计的提示词能显著提高模型响应的准确性和相关性。 -
tools():
注册可供模型调用的工具函数列表。每个工具都包含函数名称、参数定义、功能描述等元数据,这些信息会被序列化为统一格式(通常是JSON Schema)发送给模型。模型根据这些描述理解每个工具的功能和使用方法,从而在合适的时机选择调用。 -
advisors():
配置对话记忆和上下文管理的高级参数。通过设置会话ID和检索大小,系统能够维护长期对话历史,使模型了解之前的交互内容,保持对话的连贯性和一致性。这对于需要多轮交互的复杂任务尤为重要。 -
call():
执行实际的API调用,将请求发送给大模型服务,并等待响应结果。这个方法负责处理网络通信、错误重试、超时控制等底层细节,同时将响应解析为结构化的对象返回给调用者。
四、完整交互流程
1. 工具注册阶段
在应用启动或模块初始化时,开发者通过@Tool
注解或实现特定接口的方式,将Java方法注册为AI可调用的工具。这些工具注册信息会被Spring容器管理,并在需要时提供给模型调用系统。注册过程可以包含详细的元数据,如参数描述、类型信息、示例值和使用限制等,帮助模型更准确地使用这些工具。
2. 请求构建与发送
当用户发起询问时,系统构建包含提示词和可用工具列表的请求:
chatClient.prompt("请问北京今天的天气如何?明天是否适合户外活动?").tools(List.of(weatherTool, activitySuggestionTool)).call();
请求被序列化为API所需的格式,工具描述以规范化的schema形式附加在请求中,随后通过HTTP或其他协议发送给大模型服务。
3. 大模型分析与决策
大模型接收到请求后,首先理解用户的问题和意图。模型会分析问题是否需要额外信息来回答,以及这些信息是否可以通过提供的工具获取。如果模型确定需要调用工具,它会生成一个结构化的调用指令,例如:
{"function_call": {"name": "getWeather","arguments": {"city": "北京","date": "today"}}
}
这个指令清晰地表达了模型希望调用哪个函数、使用什么参数,但模型本身不会执行任何实际代码。
4. 框架执行工具调用
Spring AI框架接收到模型的响应后,解析其中的function_call字段,并执行以下步骤:
- 根据函数名查找对应的已注册Java方法
- 验证参数类型和数量是否匹配
- 将JSON参数转换为Java对象
- 通过反射或直接调用执行目标方法
- 捕获方法返回值和可能的异常
- 将结果序列化为标准格式
整个过程由框架严格控制,确保了安全性和可靠性。任何未注册的方法都无法被调用,参数也会经过类型检查和验证。
5. 结果反馈与最终回复生成
工具执行的结果被格式化后,再次发送给大模型,作为对原始function_call的响应。模型接收到执行结果后,会结合这些新信息和原始问题,生成最终的自然语言回复。例如,模型可能基于获取的天气数据,回复:
“根据最新数据,北京今天晴朗,气温25°C,空气质量良好。明天预计有小雨,不太适合户外活动,建议选择室内场所。”
这种回复融合了工具提供的客观数据和模型自身的推理能力,为用户提供了既准确又自然的回答。
五、流程图解析
┌─────────────┐ ┌──────────────────┐ ┌───────────────┐
│ 用户提问 │───────→│ 构建请求 │───────→│ 大模型服务 │
└─────────────┘ │ (prompt+tools) │ └───────┬───────┘↑ └──────────────────┘ ││ │
┌─────┴─────────┐ ┌──────▼───────┐
│ 最终回复 │ │ 分析是否需要 │
│ 展示给用户 │ │ 调用工具 │
└───────────────┘ └──────┬───────┘↑ ││ │
┌─────┴─────────┐ ┌───────────────────┐ ┌──────▼───────┐
│ 模型生成 │◀───────┤ 模型处理工具结果 │◀──────┤ 输出调用指令│
│ 最终回复 │ └───────────────────┘ └──────┬───────┘
└───────────────┘ │↑ ││ │
┌─────┴─────────┐ ┌───────────────────┐ ┌──────▼───────┐
│ 框架返回 │◀───────┤ 框架执行本地方法 │◀──────┤ 框架解析 │
│ 执行结果 │ └───────────────────┘ │ function_call│
└───────────────┘ └──────────────┘
这个流程图展示了从用户提问到最终回复的完整过程,包括请求构建、模型决策、工具调用、结果处理和回复生成等关键环节。每个步骤都由专门的组件负责,形成了一个高效协作的系统。
六、实现详细示例
工具定义与参数处理
@Component
public class WeatherService {@Tool(name = "getWeather",description = "获取指定城市的天气预报信息,包括温度、湿度、风力等数据")public WeatherInfo getWeather(@Param(name = "city", description = "需要查询天气的城市名称") String city,@Param(name = "date", description = "查询日期,可选值:today, tomorrow, week") String date) {// 实现天气查询逻辑,可能涉及调用第三方API、查询数据库等WeatherInfo weatherInfo = weatherApiClient.queryWeather(city, date);// 对查询结果进行处理和转换if (weatherInfo != null) {// 或许需要格式化某些数据weatherInfo.setTemperature(formatTemperature(weatherInfo.getRawTemperature()));// 添加额外信息weatherInfo.setQueryTime(LocalDateTime.now());}return weatherInfo;}// 辅助方法private String formatTemperature(Double rawTemp) {return String.format("%.1f°C", rawTemp);}
}
这个例子展示了一个完整的天气查询工具定义,包括工具名称、描述、参数注解和实际业务逻辑实现。@Tool
注解标记方法为可调用工具,@Param
注解为每个参数提供详细说明,帮助模型理解如何正确使用该工具。
客户端调用与结果处理
@Service
public class WeatherQueryService {private final ChatClient chatClient;private final WeatherService weatherService;@Autowiredpublic WeatherQueryService(ChatClient chatClient, WeatherService weatherService) {this.chatClient = chatClient;this.weatherService = weatherService;}public String askAboutWeather(String userQuestion) {try {// 构建带工具的请求ChatResponse response = chatClient.prompt(userQuestion).tools(List.of(new FunctionTool(weatherService.getClass().getMethod("getWeather", String.class, String.class)))).withSystemMessage("你是一个专业的天气助手,可以回答关于天气的各类问题。必要时请使用提供的工具获取准确信息。").call();// 从响应中提取回复内容String answer = response.content();// 可能的后处理,如记录日志、分析用户问题模式等logUserInteraction(userQuestion, answer);return answer;}catch (Exception e) {log.error("Weather query failed", e);return "很抱歉,处理您的天气查询请求时遇到了问题。请稍后再试。";}}private void logUserInteraction(String question, String answer) {// 实现日志记录逻辑}
}
这段代码展示了如何在服务层集成工具调用,包括异常处理、系统提示词设置和结果处理等完整流程。通过依赖注入获取所需组件,然后构建请求、执行调用并处理响应,最终返回用户可理解的结果。
七、功能特性与优势
-
安全性与控制:
模型只能调用显式注册的方法,无法执行任意代码。每个工具都有明确的权限边界,开发者可以实现细粒度的访问控制和参数验证,防止恶意使用或越权操作。系统还可以对工具调用频率、资源消耗等方面进行限制,确保系统稳定性。 -
灵活性与扩展性:
开发者可以轻松定义新工具并立即使大模型能够使用它们,无需重新训练模型。工具系统支持各种复杂数据类型、异步操作和嵌套调用,能够满足不同场景的需求。框架提供了多层扩展点,允许自定义参数转换、结果处理和错误恢复策略。 -
无缝集成:
Spring AI的工具调用系统与Spring生态深度集成,可以直接利用已有的服务、组件和配置。通过简单注解,现有业务逻辑立即变成AI可调用的能力,大大减少了集成成本。系统支持事务管理、缓存、安全和监控等企业级特性,使AI功能能够无缝融入现有应用架构。 -
开发效率:
注解驱动的编程模型极大简化了开发流程,减少了模板代码和手动配置。开发者可以专注于业务逻辑实现,而不必担心底层通信和协议细节。框架提供了丰富的调试和测试支持,帮助开发者快速识别和解决问题。 -
可观测性:
系统内置了全面的日志、指标和追踪机制,使开发者能够清晰了解每次工具调用的完整过程。这些信息对于调试复杂问题、优化性能和审计系统行为至关重要,同时也为后续的功能改进提供了数据支持。
八、最佳实践与注意事项
工具设计原则
- 明确职责边界:每个工具应该有单一、明确的功能,避免大而全的"超级工具"
- 提供详尽描述:为工具和参数添加清晰、具体的描述,帮助模型正确理解其用途和使用方法
- 处理边缘情况:实现完善的错误处理和参数验证,确保工具在各种情况下都能稳定运行
- 返回结构化数据:工具返回值应该结构清晰、信息丰富,便于模型理解和处理
- 保持幂等性:尽可能设计成幂等操作,避免重复调用导致意外后果
性能优化建议
- 对频繁调用的工具实现缓存机制
- 考虑异步执行长时间运行的操作
- 设置合理的超时和重试策略
- 监控和限制资源密集型工具的使用频率
- 预热和池化连接等资源,减少冷启动开销
安全考量
- 实施最小权限原则,限制工具的访问范围
- 验证所有用户输入,防止注入攻击
- 考虑实施速率限制和使用配额
- 审计敏感操作,保留详细日志
- 定期检查权限设置,确保符合安全策略
相关文章:
Spring AI 与大语言模型工具调用机制详细笔记
一、基本概念 大语言模型(LLM)工具调用机制是一种允许AI模型与外部系统交互的技术框架,它使模型能够在对话过程中请求调用预定义的函数或服务。这种机制极大地扩展了大模型的能力边界,使其不再局限于静态知识,而是能够…...
数据清洗-电商双11美妆数据分析
1.数据读取(前八行) 2.数据清洗 2.1 因为数据中存在重复跟空值,将数据进行重复值处理 (删除重复值) 2.2 缺失值处理 存在的缺失值很可能意味着售出的数量为0或者评论的数量为0,所以我们用0来填补缺失值 2…...
公司项目架构搭建者
公司项目架构搭建者分析 项目架构搭建的核心角色 #mermaid-svg-FzOOhBwW3tctx2AR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FzOOhBwW3tctx2AR .error-icon{fill:#552222;}#mermaid-svg-FzOOhBwW3tctx2AR .err…...
广告场景下的检索平台技术
检索方向概述 数据检索领域技术选型大体分为SQL事务数据库、NoSQL数据库、分析型数据库三个类型。 SQL数据库的设计思路是采用关系模型组织数据,注重读写操作的一致性,注重数据的绝对安全。为了实现这一思路,SQL数据库往往会牺牲部分性能&…...
LintCode407-加一,LintCode第479题-数组第二大数
第407题: 描述 给定一个非负数,表示一个数字数组,在该数的基础上1,返回一个新的数组。 该数字按照数位高低进行排列,最高位的数在列表的最前面. 样例 1: 输入:[1,2,3] 输出:[1,2,4] 样例 …...
网络安全的范式革命:从被动防御到 AI 驱动的主动对抗
当黑客利用生成式 AI 在 30 秒内生成 10 万组钓鱼邮件,当恶意代码学会根据网络环境自主进化,传统网络安全防线正面临前所未有的挑战。2025 年,全球网络安全领域正在经历一场从 “被动挨打” 到 “主动出击” 的革命性转变,AI 与量…...
内网im软件,支持企业云盘的协同办公软件推荐
BeeWorks不仅是一个即时通讯工具,更是一个综合性的企业管理平台。其云盘功能支持大容量文件存储,便企业集中管理文件。并且具备在线协同编辑的能力,这使得企业在文件管理和团队协作方面更加高效和便捷。以下是BeeWorks在企业云盘和在线协同编…...
JAVA SE(9)——多态
1.多态的概念&作用 多态(Polymorphism)是面向对象编程的三大基本特性之一(封装和继承已经讲过了),它允许不同类的对象对同一消息做出不同的响应。具体来说,多态允许基类/父类的引用指向派生类/子类的对象(向上转型…...
单调栈算法精解(Java实现):从原理到高频面试题
在算法与数据结构的领域中,单调栈(Monotonic Stack)凭借其独特的设计和高效的求解能力,成为解决特定类型问题的神兵利器。它通过维护栈内元素的单调性,能将许多问题的时间复杂度从暴力解法的\(O(n)\)优化至\(O(n)\)&am…...
密码工具类-生成随机密码校验密码强度是否满足要求
生成随机密码 符合密码强度的密码要求: 至少有一个大写字母至少有一个小写字母至少有一个数字至少有一个特殊字符长度满足要求(通常为8-16位) // 大写字母private static final String UPPERCASE "ABCDEFGHIJKLMNOPQRSTUVWXYZ";…...
什么是进程,如何管理进程
基本概念(什么是进程?) 课本概念:程序的一个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 描述进程-PCB 进程信息被放在一个叫做进程控…...
小刚说C语言刷题—1044 -找出最经济型的包装箱型号
1.题目描述 已知有 A,B,C,D,E五种包装箱,为了不浪费材料,小于 10公斤的用 A型,大于等于 10公斤小于 20 公斤的用 B型,大于等于 20公斤小于 40 公斤的用 C型,大于等于 40…...
用 GRPO 魔法点亮Text2SQL 的推理之路:让模型“思考”得更像人类
推理能力(Chain of Thought, CoT)可以帮助模型逐步解释其思考过程,从而提高Text-to-SQL 生成的准确性和可解释性。本文探讨了如何将一个标准的 7B 参数的大型语言模型(Qwen2.5-Coder-7B-Instruct)转变为一个能够为Text…...
k8s service的类型
service和Pods service通过使用labels指向pods,而不是指向deployments或者replicasets。这种设计的灵活性极高,因为创建pods的方式有很多,而Service不需要关心pods通过那种方式创建 不使用service(首先看不使用service的情况) 如下…...
机器学习 day6 -线性回归练习
题目: 从Kaggle的“House Prices - Advanced Regression Techniques”数据集使用Pandas读取数据,并查看数据的基本信息。选择一些你认为对房屋价格有重要影响的特征,并进行数据预处理(如缺失值处理、异常值处理等)。…...
机器学习-简要与数据集加载
一.机器学习简要 1.1 概念 机器学习即计算机在数据中总结规律并预测未来结果,这一过程仿照人类的学习过程进行。 深度学习是机器学习中的重要算法的其中之一,是一种偏近现代的算法。 1.2 机器学习发展历史 从上世纪50年代的图灵测试提出、塞缪尔开发…...
HTTP请求与前端资源未优化的系统性风险与高性能优化方案
目录 前言一、未合并静态资源:HTTP请求的隐形杀手1.1 多文件拆分的代价1.2 合并策略与工具链实践 二、未启用GZIP压缩:传输流量的浪费2.1 文本资源的压缩潜力2.2 服务端配置与压缩算法选择 三、未配置浏览器缓存:重复请求的根源3.1 缓存失效的…...
黑马点评day04(分布式锁-setnx)
4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程并行&#x…...
哈尔滨服务器租用
选择一家正规的本地服务商,能够直接促进您网站今后的发展、确保您企业的信息化进程安全、高效。擦亮您的慧眼,用我的经验告诉您该怎么选择服务商。。。。。。。。综合我们为数据客户服务的经验,选择服务器租用、服务提供商客户所需要关注的主…...
企业级RAG架构设计:从FAISS索引到HyDE优化的全链路拆解,金融/医疗领域RAG落地案例与避坑指南(附架构图)
本文较长,纯干货,建议点赞收藏,以免遗失。更多AI大模型应用开发学习内容,尽在聚客AI学院。 一. RAG技术概述 1.1 什么是RAG? RAG(Retrieval-Augmented Generation,检索增强生成) 是…...
js获取uniapp获取webview内容高度
js获取uniapp获取webview内容高度 在uni-app中,如果你想要获取webview的内容高度,可以使用uni-app提供的bindload事件来监听webview的加载,然后通过调用webview的invokeMethod方法来获取内容的高度。 以下是一个示例代码: <te…...
AI量化解析:从暴跌5%到飙涨3%—非线性动力学模型重构黄金极端波动预测框架
AI分析:假期效应褪去,金价回调背后的市场逻辑 五一假期期间,全球贵金属市场经历显著波动。5月1日,现货黄金单日跌幅达5.06%,价格从历史高位回落至3200美元/盎司附近,国内金饰价格同步回调,主流…...
Python之pip图形化(GUI界面)辅助管理工具
Python之pip图形化(GUI界面)辅助管理工具 pip 是 Python 的包管理工具,用于安装、管理、更新和卸载 Python 包(模块)。用于第三方库的安装和管理过程,是 Python 开发中不可或缺的工具。 包的安装、更新、…...
数字传播生态中开源链动模式与智能技术协同驱动的品牌认知重构研究——基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的场景化传播实践
摘要:在数字传播碎片化与用户注意力稀缺的双重挑战下,传统品牌认知构建模式面临效率衰减与情感黏性缺失的困境。本文以“开源链动21模式AI智能名片S2B2C商城小程序”的协同创新为切入点,构建“技术赋能-场景重构-认知强化”的分析框架。通过对…...
小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?
在科技飞速发展的今天,半导体行业作为信息技术的核心领域之一,其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而,随着芯片制造工艺的不断进步,传统的单片集成方式逐渐遇到了技术瓶颈,如摩尔定律逐渐逼近…...
链表的面试题3找出中间节点
来来来,接着继续我们的第三道题 。 解法 暴力求解 快慢指针 https://leetcode.cn/problems/middle-of-the-linked-list/submissions/ 这道题的话,思路是非常明确的,就是让你找出我们这个所谓的中间节点并且输出。 那这道题我们就需要注意…...
Java泛型深度解析与电商场景应用
学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 泛型的工作原理可能包括类型擦除、参数化类型、类型边…...
C语言 指针(7)
目录 1.函数指针变量 2.函数指针数组 3.转移表 1.函数指针变量 1.1函数指针变量的创建 什么是函数指针变量呢? 根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论: 函数指针变量应该是用来…...
go 编译报错:build constraints exclude all Go files
报错信息: package command-line-arguments imports github.com/amikos-tech/chroma-go imports github.com/amikos-tech/chroma-go/pkg/embeddings/default_ef imports github.com/amikos-tech/chroma-go/pkg/tokenizers/libtokenizers: …...
Android Service 从 1.0 到 16 的演进史
一、Android 1.0(API 1) - 服务的诞生 核心特性: 基础服务组件:作为四大组件之一,Service 用于在后台执行长时间运行的任务,不提供 UI 界面。 启动方式:通过 startService() 启动独立运行的服…...
如何保障服务器租用中的数据安全?
网络科技和互联网的飞速发展,让用户越来越依赖与网络业务,各个行业开展了不同的线上服务,租用服务器已经成为必不可少的组成部分,能够为企业带来便捷,但是数据安全也是不可忽视的,为了能够保护服务器中数据…...
python校园二手交易管理系统-闲置物品交易系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录
#工作记录 尝试消除 消除“模块ttsfrd没有属性ttsfrontendengine”的错误的记录 报错摘录: Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…...
MD2card + Deepseek 王炸组合 一键制作小红书知识卡片
本文目录 MD2Card介绍使用示例deepseek 提示词输出结果MD2Card 制作小红书卡片 MD2Card介绍 MD2Card 是一个免费的 Markdown 转知识卡片工具,支持一键生成小红书风格海报、社交媒体文案排版,让创作者轻松制作精美的图文内容。支持多种主题风格、长文自动…...
Relay算子注册(在pytorch.py端调用)
1. Relay算子注册 (C层) (a) 算子属性注册 路径: src/relay/op/nn/nn.cc RELAY_REGISTER_OP("hardswish").set_num_inputs(1).add_argument("data", "Tensor", "Input tensor.").set_support_level(3).add_type_rel("Identity…...
基于RT-Thread的STM32F4开发第二讲第一篇——ADC
文章目录 前言一、RT-Thread工程创建二、ADC工程创建三、ADC功能实现1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享总结 前言 ADC是什么不多讲了,前面裸机操作部分有很多讲述。我要说的是RT-Thread对STM32的ADC外设的适配极其不好,特别是STM32G4系类&…...
py实现win自动化自动登陆qq
系列文章目录 py实现win自动化自动登陆qq 文章目录 系列文章目录前言一、上代码?总结 前言 之前都是网页自动化感觉太容易了,就来尝尝win自动化,就先写了一个qq登陆的,这个是拿到className 然后进行点击等。 一、上代码…...
Axure : 列表分页、 列表翻页
文章目录 引言I 列表分页操作说明II 列表翻页操作说明引言 列表分页实现思路:局部变量、 中继器设置每页项目数 I 列表分页 操作说明 在列表元件底部添加一个分页下拉控件,分别为10,20,30,40,50; 将列表转换为动态面板,将设置面板大小勾选取消 给分页大小下拉控件添加…...
大学之大:隆德大学2025.5.6
隆德大学:北欧学术明珠的八百年传承与创新 一.前身历史:从中世纪神学院到现代综合大学的蜕变 隆德大学的历史可追溯至1425年,由丹麦国王埃里克七世在瑞典南部城市隆德创立的“神学与教会法研究院”。这所中世纪学府最初以培养天主教神职人员…...
每日算法-250506
每日算法学习记录 - 250506 今天记录了三道算法题的解题过程和思路,分享给大家。 3192. 使二进制数组全部等于 1 的最少操作次数 II 题目 思路 贪心 解题过程 我们从左到右遍历数组。使用一个变量 ret 来记录已经执行的操作次数。 对于当前元素 nums[i]&#x…...
【免费试用】LattePanda Mu x86 计算模块套件,专为嵌入式开发、边缘计算与 AI 模型部署设计
本次活动为载板设计挑战,旨在激发创意与技术实践能力,鼓励电子工程师、创客、学生及开发者围绕指定LattePanda Mu进行功能丰富、应用多样的载板开发设计。参赛用户将有机会展示硬件设计能力,并通过作品解决实际问题或构建创新项目。本次挑战活…...
用于备份的git版本管理指令
一、先下载一个git服务器软件并安装,创建一个git服务器进行备份的版本管理。 下列指令用于git常用备份: 1、强制覆盖远程仓库: git push --force origin master 2、重新指向新仓库: git remote set-url origin http://192.168.1.2…...
STM32H743单片机实现ADC+DMA多通道检测
在stm32cubeMX上配置ADCDMA实现多通道检测功能 DMA配置 生成代码,HAL_ADC_Start_DMA开始DMA读取ADC值,HAL_ADC_Stop_DMA关闭DMA读取 void Start_ADC2_DMA(void) {/* 初始化后校准ADC */HAL_ADCEx_Calibration_Start(&hadc2, ADC_CALIB_OFFSET, ADC_…...
(提升)媒体投稿技能
1\前期策划与准备 精准定位目标受众,分析内容偏好与活跃媒体基于目标受众,确定发稿核心主题与内容方向 2\内容创作与素材 撰写稿件注重标题吸引力,确保内容逻辑清晰价值突出。素材整合准备高质量的配图、视频 3\内部审核与优化 对稿件内…...
2025年提交App到Appstore从审核被拒到通过的经历
今年3月份提交一个App到Appstore,感觉比以前要严格了很多,被拒了多次才通过。 如果周末提交审核会非常非常,所以最好选择周一之周四的中午提交。 第一次提交被拒,原因为 Guideline 2.1 - Performance - App Completeness Guidel…...
63.微服务保姆教程 (六) SkyWalking--分布式链路追踪系统/分布式的应用性能管理工具
SkyWalking—分布式链路追踪系统/分布式的应用性能管理工具(APM) 一、为什么要用SkyWalking 对于一个有很多个微服务组成的微服务架构系统,通常会遇到一些问题,比如: 如何串联整个调用链路,快速定位问题如何缕清各个微服务之间的依赖关系如何进行各个微服务接口的性能分…...
vue3 computed方法传参数
我们对computed的基础用法不陌生,比如前端项目中经常会遇到数据处理的情况,我们就会选择computed方法来实现。但大家在碰到某些特殊场景,比如在template模板中for循环遍历时想给自己的计算属性传参,这个该怎么实现呢,很…...
Linux中为某个进程临时指定tmp目录
起因: 在linux下编译k8s,由于编译的中间文件太多而系统的/tmp分区设置太小,导致编译失败,但自己不想或不能更改/tmp分区大小,所以只能通过其他方式解决。 现象: tmp分区大小: 解决方法&#x…...
Informer源码解析4——完整注意力机制解读
完整注意力机制 源码 class FullAttention(nn.Module):def __init__(self, mask_flagTrue, factor5, scaleNone, attention_dropout0.1, output_attentionFalse):"""实现完整的注意力机制,支持因果掩码和注意力权重输出。Args:mask_flag (bool): 是…...
第一节:Web3开发概述
一、什么是Web3? 如果把互联网比作一个「大超市」: Web1(1990年代):你只能看货架上的商品(比如新浪、搜狐这种只读网站)。Web2(现在):你不仅能看࿰…...