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

大型语言模型中的工具调用(Function Calling)技术详解

一、引言

随着大型语言模型(LLM)能力的飞速发展,它们在自然语言理解、文本生成、对话交互等方面展现出了令人惊叹的表现。然而,LLM 本身并不具备执行外部操作的能力,比如访问网页、调用第三方 API、执行精确数学运算等。在实际应用中,我们往往需要将 LLM 与各种工具(Tool)进行结合,让模型在生成文本时,能够在必要时发出“调用工具”的指令,由外部程序执行该工具,并将结果反馈给模型,以获得准确、可执行的输出。

“工具调用”或“功能调用”(Function Calling)正是为了解决这一需求而设计的一种机制。它允许我们在向模型发送请求时,声明一组可用的工具(或函数),并在模型的回复中,通过特殊的字段告知“我想调用哪个工具,传入什么参数”。随后,应用程序负责执行该工具,将执行结果再送回给模型,模型据此继续生成最终回复。

本文将从原理、示例、API 概览、Spring AI 集成、具体代码示例以及最佳实践等多个角度,深入解析 Function Calling 的使用方法,帮助读者在自己的项目中顺利落地这一强大功能。


二、为什么需要工具调用

  1. 弥补模型自身能力的局限

    • LLM 在常识、语言表达方面表现优异,但在精确计算、实时信息检索、与外部系统交互等方面仍有短板。
    • 例如,让模型直接回答“475695037565 的平方根是多少?”往往只能给出近似值,且可能不够准确。
  2. 降低 Prompt 复杂度,提升可维护性

    • 通过将外部逻辑封装为工具/函数,Prompt 中无需硬编码调用细节,只需告知模型“我有一个叫 squareRoot 的工具,你需要的时候就调用它”。
    • 工具逻辑集中管理,易于维护和升级。
  3. 支持多样化的应用场景

    • 网页搜索(googleSearch)、邮件发送(sendEmail)、数据库查询、业务系统接口调用等。
    • 只要定义好函数签名并注册给模型,就能让模型“像写 RPC 调用”一样使用这些工具。

三、Function Calling 的基本流程

下面以一个简单的数学计算示例,说明 Function Calling 在消息交互中的具体工作流程。

3.1 普通对话(无工具调用)

User: What is the square root of 475695037565?
AI: The square root of 475695037565 is approximately 689710.
  • 模型直接在文本中给出答案,但结果不够精确(实际应为 ~689706.486532)。

3.2 启用 Function Calling

  1. 请求 1:声明工具
{"messages": [{ "role": "user", "content": "What is the square root of 475695037565?" }],"functions": [{"name": "squareRoot","description": "Returns the square root of a given number","parameters": {"type": "object","properties": {"x": { "type": "number", "description": "The number to take the square root of" }},"required": ["x"]}}]
}
  1. 模型响应:发起工具调用
{"role": "assistant","content": null,"function_call": {"name": "squareRoot","arguments": { "x": 475695037565 }}
}
  1. 执行工具:
  • 应用程序接收到 function_call,调用相应的工具(如内部实现或外部 API),得到结果 689706.486532
  1. 请求 2:将工具执行结果反馈给模型
{"messages": [{ "role": "user", "content": "What is the square root of 475695037565?" },{"role": "assistant","function_call": {"name": "squareRoot","arguments": { "x": 475695037565 }}},{ "role": "tool", "name": "squareRoot", "content": "689706.486532" }]
}
  1. 模型生成最终回答:
The square root of 475695037565 is 689706.486532.

通过上述流程,模型能够借助外部工具得到精确结果,并在对话中正确呈现。


四、API 概览

要让 LLM 知道可调用哪些工具,需要在请求中提供每个工具的名称(name)、描述(description)和调用签名(parameters)。常见字段如下:

  • name:工具/函数的唯一标识,如 getWeathersearchWeb
  • description:对该工具功能的简要说明,帮助模型判断何时调用。
  • parameters:JSON Schema 格式,定义函数参数的类型、名称、描述、是否必填等。

以 OpenAI Chat API 为例,请求体中的 functions 字段示例如下:

"functions": [{"name": "getWeather","description": "Get the weather in a given location","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. San Francisco, CA"},"unit": {"type": "string","enum": ["C", "F"],"description": "Temperature unit, Celsius or Fahrenheit"}},"required": ["location"]}}
]

当模型生成回答时,如果它判断需要调用 getWeather,就会在响应中输出 function_call 而非直接文本。


五、Spring AI 中的 Function Calling

在 Java 生态中,Spring AI(或类似框架)极大简化了工具注册和调用流程。我们只需将函数定义为 Spring Bean,并通过注解或配置将其暴露给 ChatModel。

5.1 定义函数 Bean

@Configuration
public class FunctionConfig {@Bean@Description("Get the weather in location") // 函数描述,帮助模型选择调用public Function<MockWeatherService.Request, MockWeatherService.Response> weatherFunction() {return new MockWeatherService();}}
  • Bean 名称(默认为方法名 weatherFunction)即作为函数名传给模型。
  • @Description 注解为该函数提供说明,模型据此判断何时调用。

5.2 MockWeatherService 示例

下面是一个模拟天气服务的简单实现,硬编码返回温度:

public class MockWeatherService implements Function<MockWeatherService.Request, MockWeatherService.Response> {public enum Unit { C, F }public record Request(String location, Unit unit) {}public record Response(double temp, Unit unit) {}@Overridepublic Response apply(Request request) {// 简单返回固定温度,真实场景可调用第三方天气 APIreturn new Response(30.0, Unit.C);}
}

5.3 注册并调用

在构建 ChatClient/ChatModel 时,将函数 Bean 名称传入:

ChatClient chatClient = ChatClient.builder(dashScopeChatModel).defaultFunctions("weatherFunction") // 注册函数.build();ChatResponse response = chatClient.prompt().user("What's the weather like in Boston?").call().chatResponse();

当模型判断需要调用天气服务时,框架会自动将 function_call 转为对 weatherFunction Bean 的调用,并将结果封装回模型继续生成对话。


六、函数调用流程详解

结合 Spring AI,整个 Function Calling 流程可分为以下几个步骤:

  1. 函数定义:在 Spring 应用上下文中,通过 @Bean 定义 Function<Req, Res>,并用 @Description 或 @JsonClassDescription 注解提供描述。

  2. 函数注册:在创建 ChatClient/ChatModel 时,将 Bean 名称通过 defaultFunctions(...) 或 withFunctionCallbacks(...) 传入模型选项。

  3. 构造 Prompt 请求:请求中包含用户消息和 functions 列表(由框架自动根据已注册 Bean 生成)。

  4. 模型响应 Function Call:模型在生成时,若判断需要调用某个工具,就输出 function_call 而非文本回复。

  5. 执行函数:框架捕获 function_call,将其中的 JSON 参数反序列化为对应 Bean 的 Request 对象,调用 Bean(即 Function.apply),得到 Response 对象。

  6. 反馈结果给模型:将函数调用结果作为新的消息(role="tool")附加到消息列表中,再次调用模型,让它基于工具返回值生成最终文本回复。

整个过程对开发者透明,大大简化了与模型的交互和工具调用逻辑。


七、使用已有 Service 的函数注册

除了新建 Bean,也可以将现有的 Service 方法通过函数调用暴露给模型。以下示例展示如何将一个已有的 MockOrderService 注册为 Function Call。

7.1 现有 Service

@Service
public class MockOrderService {public Response getOrder(Request request) {String productName = "尤尼克斯羽毛球拍";return new Response(String.format("%s 的订单编号为 %s, 购买的商品为: %s",request.userId, request.orderId, productName));}@JsonInclude(JsonInclude.Include.NON_NULL)public record Request(@JsonProperty(required = true, value = "orderId")@JsonPropertyDescription("订单编号, 比如1001***")String orderId,@JsonProperty(required = true, value = "userId")@JsonPropertyDescription("用户编号, 比如2001***")String userId) {}public record Response(String description) {}
}

7.2 注册为 Function Call

@Configuration
public class FunctionCallConfiguration {@Bean@Description("根据用户编号和订单编号查询订单信息")public Function<MockOrderService.Request, MockOrderService.Response> getOrderFunction(MockOrderService mockOrderService) {// 将 Service 方法引用作为 Function Beanreturn mockOrderService::getOrder;}}

7.3 调用示例

ChatClient chatClient = ChatClient.builder(dashScopeChatModel).defaultFunctions("getOrderFunction").build();ChatResponse response = chatClient.prompt().user("帮我查询订单, 用户编号为1001, 订单编号为2001").call().chatResponse();String content = response.getResult().getOutput().getContent();
System.out.println("模型回复: " + content);

这样,模型在收到查询订单的请求时,就会自动触发对 getOrderFunction 的调用,并将结果融入最终回复。


八、为 Prompt 动态指定函数

在某些场景下,我们希望根据上下文动态选择可用函数,而非在应用启动时一次性注册所有函数。Spring AI 支持通过 FunctionCallbackWrapper 在 Prompt 级别动态注入函数。

// 构造 FunctionCallbackWrapper 列表
List<FunctionCallbackWrapper<?, ?>> callbacks = List.of(new FunctionCallbackWrapper<>("CurrentWeather",               // name"Get the weather in location",  // descriptionnew MockWeatherService()        // function 实现)
);var promptOptions = OpenAiChatOptions.builder().withFunctionCallbacks(callbacks).build();ChatResponse response = chatModel.call(new Prompt(List.of(new UserMessage("What's the weather like in Tokyo?")),promptOptions)
);

这样,每次调用时都可灵活传入不同的函数集合,无需预先在 Spring 容器中定义 Bean。


九、最佳实践与注意事项

  1. 函数描述要精准:使用 @Description 或 @JsonClassDescription 为函数和参数添加清晰说明,帮助模型准确选择。

  2. 参数模式要完整:在 JSON Schema 中为每个参数提供 typedescription,并对必填字段使用 required,避免模型生成错误调用。

  3. 合理拆分工具:将功能独立的操作拆分为不同工具,避免“万能”函数导致模型调用混乱。

  4. 调用结果校验:在将工具执行结果反馈给模型前,最好进行必要的校验或清洗,防止异常数据影响后续生成。

  5. 安全与权限控制:对敏感操作(如发送邮件、数据库写入)要做好鉴权与审计,避免模型被滥用。

  6. 限流与降级:对外部 API 调用要做好限流,遇到失败时可设计降级方案,让模型给出合理的错误提示。


十、总结

“工具调用(Function Calling)”为 LLM 提供了与外部系统、API、代码逻辑无缝对接的能力,大大拓展了模型在实际应用中的边界。通过在请求中声明工具、让模型在合适时机发起调用、由应用程序执行并将结果反馈给模型,整个流程犹如一次透明的 RPC 调用,让模型既保留了强大的自然语言生成能力,又具备了执行外部操作的可能。

在 Java/Spring 生态中,借助 Spring AI、FunctionCallbackWrapper 等框架,我们只需将函数以 Bean 形式定义,并通过注解或配置进行注册,便可轻松实现 Function Calling。无论是简单的数学运算、天气查询,还是复杂的业务系统交互,都能通过这种方式优雅地集成到对话流程中。

希望本文能帮助读者全面了解并掌握 Function Calling 的原理与实践,快速在自己的项目中落地这一功能,打造更智能、更实用的 AI 应用。未来,随着 LLM 与工具生态的不断完善,我们将见证更加丰富、多样的智能化场景落地,值得持续关注与探索。

相关文章:

大型语言模型中的工具调用(Function Calling)技术详解

一、引言 随着大型语言模型&#xff08;LLM&#xff09;能力的飞速发展&#xff0c;它们在自然语言理解、文本生成、对话交互等方面展现出了令人惊叹的表现。然而&#xff0c;LLM 本身并不具备执行外部操作的能力&#xff0c;比如访问网页、调用第三方 API、执行精确数学运算等…...

IKBC F108 白色背光普通版说明书

部分按键白色背光版和新的 RGB 版并不相同。比如灯光控制&#xff0c;新老款会有按键配置冲突的。 IKBC F108 白色背光款&#xff08;普通款&#xff09;按键说明​ ScrLk 倒计时定时器​ 使用 F1~F12 及 1~9 控制时间&#xff0c;设置完成按 Enter 确认&#xff0c;或按 En…...

Microsoft Office 如何启用和正常播放 Flash 控件

对于新安装的 Office 默认是不支持启用 Flash 组件的&#xff0c;Flash 组件会无法播放或者黑屏。 本片文章就带你解决这个问题&#xff0c;相关资料都在下方连接内。前提概要&#xff0c;教程对应的版本是 mso16&#xff0c;即 Office 2016 及更新版本&#xff0c;以及 365 等…...

muduo库源码分析: One Loop Per Thread

One Loop Per Thread的含义就是&#xff0c;一个EventLoop和一个线程唯一绑定&#xff0c;和这个EventLoop有关的&#xff0c;被这个EventLoop管辖的一切操作都必须在这个EventLoop绑定线程中执行 1.在MainEventLoop中&#xff0c;负责新连接建立的操作都要在MainEventLoop线程…...

[ARC196A] Adjacent Delete 题解

假设 n n n 是偶数。如果我们忽略删除相邻数的条件&#xff0c;即可以任选两个数相减&#xff0c;那么答案应该是前 n 2 \frac{n}{2} 2n​ 大的数&#xff08;记作“较大数”&#xff09;的和减去前 n 2 \frac{n}{2} 2n​ 小的数&#xff08;记作“较小数”&#xff09;的和…...

拼团系统设计-人群标签的设计与思考

目录 轻量化人群标签数据采集与Redis BitMap应用 为什么需要人群标签&#xff1f; 设计思路&#xff1a;轻量化人群标签系统 1. 核心目标 2. 技术选型&#xff1a;Redis BitMap 3. 数据链路设计 技术实现&#xff1a;代码级拆解 1. 人群标签任务调度 2. 用户ID与BitMap索引映射…...

【Python] pip制作离线包

制作离线安装包是一种非常实用的方法&#xff0c;尤其是在网络环境受限或需要在多台机器上部署相同环境时。以下是详细的步骤&#xff0c;帮助您创建一个包含所有依赖项的离线安装包&#xff0c;并在后续环境中复用。 步骤 1&#xff1a;准备工具和环境 确保您有一台可以访问互…...

Java学习手册:Java异常处理机制

在Java编程中&#xff0c;异常处理是确保程序健壮性和稳定性的关键机制。异常是指程序运行过程中出现的错误或异常情况&#xff0c;如除以零、文件找不到或网络连接失败等。Java提供了强大的异常处理机制&#xff0c;帮助开发者捕获和处理这些异常情况&#xff0c;从而避免程序…...

[特殊字符] 第十二讲 | 地统计学基础与克里金插值法(Kriging)建模实践

&#x1f4d8; 专栏&#xff1a;科研统计方法实战分享 | 地学/农学人的数据分析工具箱 ✍️ 作者&#xff1a;平常心0715 &#x1f5dd;️ 本讲关键词&#xff1a;Kriging、地统计学、变异函数、空间插值、空间预测、R语言 一、什么是地统计学&#xff1f; 地统计学&#xff0…...

Introducing Machine Learning with SAP Leonardo

Introducing Machine Learning with SAP Leonardo...

软考 系统架构设计师系列知识点之杂项集萃(49)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;48&#xff09; 第76题 某文件管理系统在磁盘上建立了位视图&#xff08;bitmap&#xff09;&#xff0c;记录磁盘的使用情况。若磁盘上物理块的编号依次为&#xff1a;0、1、2、……&#xff1b…...

list容器

1. list 的介绍 list 是序列容器&#xff0c;允许在序列中的任何位置进行O(1)时间复杂度的插入和删除操作以及双向迭代。 list 容器实现为带头结点双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。 2. list 的使用 2.1 构造函数 1.…...

Linux xorg-server 解析(一)- 编译安装Debug版本的xorg-server

一:下载代码 1. 配置源,以Ubuntu24.04 为例( /etc/apt/sources.list.d/ubuntu.sources): 2. apt source xserver-xorg-core 二:编译代码 1. sudo apt build-dep ./ 2. DEB_BUILD_OPTIONS="nostrip" DEB_CFLAGS_SET="-g -O0" dpkg-buildpac…...

VTK使用Render()渲染窗口的相关问题

转自个人博客&#xff1a;VTK使用Render()渲染窗口的相关问题 1. VTK更新数据但窗口不更新 问题&#xff1a;在对窗口内的数据进行更新后&#xff0c;VTK窗口不会立即更新&#xff0c;需要鼠标等交互后才会更新。 解决办法&#xff1a;对数据更新后&#xff0c;对VTK窗口也要…...

基于php的成绩分析和预警与预测网站(源码+lw+部署文档+讲解),源码可白嫖!

摘要 人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与网络技术的飞速发展&#xff0c;对政治、经济、军事、文化、教育等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套…...

文档检索技术详解 (Document Retriever)

一、文档检索的定义与核心概念 文档检索&#xff08;Document Retriever&#xff09;是一种信息检索技术&#xff0c;旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线&#xff08;online&#xff09;方式运行&#xff0c;能够实时…...

大模型SFT用chat版还是base版 SFT后灾难性遗忘怎么办

大模型SFT用chat版还是base版 进行 SFT 时&#xff0c;基座模型选用 Chat 还是 Base 模型&#xff1f; 选 Base 还是 Chat 模型&#xff0c;首先先熟悉 Base 和 Chat 是两种不同的大模型&#xff0c;它们在训练数据、应用场景和模型特性上有所区别。 在训练数据方面&#xf…...

【生活相关-日语-日本-东京-搬家后-瓦斯申请(2)-办理手续】

【生活相关-日语-日本-东京-搬家后-瓦斯申请&#xff08;2&#xff09;-办理手续】 1、前言2、情况说明&#xff08;1&#xff09;他人代办&#xff08;2&#xff09;打电话&#xff08;3&#xff09;网络申请&#xff08;4&#xff09;你将会面临什么&#xff0c;主要步骤&…...

matplotlib数据展示

目录 一、绘制直方图 1、简单直方图 2、绘制横向直方图 3、绘制堆叠直方图 4、对比直方图 二、折线图与散点图 三、绘制饼图 四、雷达图 1、简单雷达图 2、多层雷达图 五、总和 在前面的学习中&#xff0c;我们能够使用一些库进行数据的整合&#xff0c;收集&#x…...

三维激光测量助力企业检测效率提升3倍

智能制造与数字化浪潮席卷下&#xff0c;三维扫描技术已成为工业检测领域不可或缺的工具。面对传统检测手段的精度瓶颈与效率局限&#xff0c;三维扫描仪&#xff0c;以毫米级精度、非接触式测量与超高速扫描三大核心优势&#xff0c;为汽车制造、航空航天、消费电子等行业的品…...

基于RISC-V内核的嵌入式系统在机器人关节控制中的应用研究

摘要 随着机器人技术的飞速发展&#xff0c;关节控制作为机器人系统中的关键环节&#xff0c;对机器人的性能和稳定性起着至关重要的作用。传统的关节控制多采用基于ARM或DSP的嵌入式系统&#xff0c;但RISC-V架构的兴起为机器人关节控制提供了新的选择。本文结合多个基于RISC…...

斯库拉集团介绍

斯库拉集团有限公司坐落于世界自由贸易圣地,国际金融服务中心英属维京群岛BVI. 旗下有香港斯库拉集团(香港主板 上市公司),斯库拉环球国际控股集团 (香港主板上市企业),斯库拉国际贸易 有限公司(斯库拉集团有限公司),新加坡斯库拉集团有限公司,德国斯库拉集团有限公司,新西…...

运用instanceof判断Animal a是否为Dog类和是否为cat类

//Animal类&#xff08;狗和猫的父类&#xff09; public class Animal {private String color;private int age;public Animal(String color, int age) {this.color color;this.age age;}public Animal() {}public String getColor() {return color;}public void setColor…...

蓝桥杯嵌入式考前模块总结

一.RTC 使用RTC直接再cubeMX中配置启动时钟和日历 如第六届省赛 想要让RTC的秒每隔一秒递增1需要在时钟树界面观察RTC的主频 由于RTC时钟主频为32KHZ将异步预分频计数器的值设为31&#xff0c;将同步预分频计数器的值设为999这样就可以将RTC的时钟信号分频为1HZ达到1秒自增的…...

《汽车电器与电子技术》实验报告

SRS系统结构原理与故障检测诊断 车辆上为什么要配安全气囊&#xff1f;——解析汽车被动安全的关键防线 一、安全气囊的核心作用&#xff1a;应对高速碰撞的“救命缓冲垫” 车辆在高速碰撞时&#xff08;如正面碰撞、侧面碰撞&#xff09;&#xff0c;人体会因惯性以极高速度…...

小刚说C语言刷题——第22讲 二维数组

昨天我们讲了一维数组&#xff0c;今天我们来讲二维数组。 1.定义 二维数组是指在数组名后跟两个方括号的数组。 2.语法格式 数据类型 数组名[下标][下标] 例如&#xff1a;int a[5][9];//表示5行9列的数组 3.访问二维数组元素 格式&#xff1a;数组名[行坐标][列坐标]…...

04--网络属性设置与多路复用

一、TCP可靠性分析 二、 scoket 属性设置 1、socket 属性设置表 NAMEgetsockopt, setsockopt - get and set options on sockets获取 和 设置 套接字属性 SYNOPSIS#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int so…...

AI大模型从0到1记录学习 day17

第 2 章 数据结构与算法基础 2.1 数据结构基础 2.1.1 什么是数据结构 数据结构是为了高效访问数据而设计出的一种数据的组织和存储方式。更具体的说&#xff0c;一个数据结构包含一个数据元素的集合、数据元素之间的关系以及访问和操作数据的方法。 像前面我们接触到的list、se…...

scanf函数功能与使用详解

【DeepSeek提问】 解释一下下面这段话&#xff1a; 函数scanf()是从标准输入流 stdin (标准输入设备&#xff0c; 一般指键盘)中读内容的通用子程序&#xff0c;可以按说明的格式读入多个字符&#xff0c;并保存在对应地址的变量中。 scanf函数返回成功读入的数据项数&#xf…...

使用Python从零开始构建端到端文本到图像 Transformer大模型

简介&#xff1a;通过特征向量从文本生成图像 回顾&#xff1a;多模态 Transformer 在使用Python从零实现一个端到端多模态 Transformer大模型中&#xff0c;我们调整了字符级 Transformer 以处理图像&#xff08;通过 ResNet 特征&#xff09;和文本提示&#xff0c;用于视觉…...

NDT和ICP构建点云地图 |【点云建图、Ubuntu、ROS】

### 本博客记录学习NDT&#xff0c;ICP构建点云地图的实验过程&#xff0c;参考的以下两篇博客&#xff1a; 无人驾驶汽车系统入门&#xff08;十三&#xff09;——正态分布变换&#xff08;NDT&#xff09;配准与无人车定位_settransformationepsilon-CSDN博客 PCL中点云配…...

第 1 篇✅ 用 AI 编程之前,你得先搞清楚你和 AI 是啥关系

程序员不是被替代的,是要学会主导 AI 的人 🧠 那些把 AI 当兄弟的程序员,后来都踩了坑 最近的一次线下开发者聚会,我们聊到“AI 编程”,现场笑声不断,也点醒了不少人。 有个朋友说: “我让 AI 写一个 Web 服务,它写得飞快,我一激动就上线了,结果上线后一堆坑,日志…...

Android Jetpack Compose 高级开发核心技术

Android Compose 高级技术总结 1. 性能优化 1.1 状态管理优化 状态提升原则&#xff1a;将状态提升到共享的最近共同父组件derivedStateOf&#xff1a;当需要基于多个状态计算派生状态时使用 val scrollState rememberScrollState() val showButton by remember {derivedS…...

Go小技巧易错点100例(二十五)

本期分享&#xff1a; 1. 使用atomic包实现无锁并发控制 2. Gin框架的中间件机制 3. 搞懂nil切片和空切片 使用atomic包实现无锁并发控制 sync/atomic包提供了原子操作&#xff0c;用于在多goroutine环境下安全地操作共享变量&#xff0c;避免使用锁带来的性能开销。 代码…...

如何用海伦公式快速判断点在直线的哪一侧

一、海伦公式的定义与推导 1. 海伦公式的定义 海伦公式&#xff08;Heron’s Formula&#xff09;是用于计算三角形面积的一种方法&#xff0c;适用于已知三角形三边长度的情况。公式如下&#xff1a; S s ( s − a ) ( s − b ) ( s − c ) S \sqrt{s(s - a)(s - b)(s - c…...

【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红

如图所示是我的clion项目目录 我自定义的data_structure.h和func_declaration.h在unit_test.c中无法检索到 cmakelists.txt配置文件如下所示&#xff1a; cmake_minimum_required(VERSION 3.30) project(noc C) #设置头文件的目录 include_directories(${CMAKE_SOURCE_DIR}/…...

自动驾驶技术关键技术梳理

一、硬件 1、 传感器系统设计主要注意以下几个问题&#xff1a; 1.时间同步 一般包括多传感器之间时钟同源、帧同步触发的问题。首先要解决时钟同源问题&#xff0c;然后为了帧同步触发&#xff0c;可以让所有传感器整秒触发。常用GPS&#xff08;最多分2路&#xff09;给激光雷…...

MySQL索引介绍

索引的定义 扇区&#xff1a;磁盘存储的最小单位&#xff0c;扇区一般大小为512Byte。磁盘块&#xff1a;文件系统与磁盘交互的的最小单位&#xff08;计算机系统读写磁盘的最小单位&#xff09;&#xff0c;一个磁盘块由连续几个&#xff08;2^n&#xff09;扇区组成&#xf…...

2025认证杯一阶段各题需要使用的模型或算法(冲刺阶段)

A题&#xff08;小行星轨迹预测&#xff09; 问题一&#xff1a;三角测量法、最小二乘法、空间几何算法、最优化方法 问题二&#xff1a;Gauss/Laplace轨道确定方法、差分校正法、数值积分算法&#xff08;如Runge-Kutta法&#xff09;、卡尔曼滤波器 B题&#xff08;谣言在…...

每天学一个 Linux 命令(13):touch

Linux 文件管理命令:touch touch 是 Linux 中一个简单但高频使用的命令,主要用于创建空文件或修改文件的时间戳(访问时间、修改时间)。它是文件管理和脚本操作的实用工具。 1. 命令作用 创建空文件:快速生成一个或多个空白文件。更新时间戳:修改文件的访问时间(Access …...

Flutter常用组件实践

Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…...

Python 实现最小插件框架

文章目录 Python 实现最小插件框架1. 基础实现项目结构plugin_base.py - 插件基类plugins/hello.py - 示例插件1plugins/goodbye.py - 示例插件2main.py - 主程序 2. 更高级的特性扩展2.1 插件配置支持2.2 插件依赖管理2.3 插件热加载 3. 使用 setuptools 的入口点发现插件3.1 …...

AUTOSAR_SWS_MemoryDriver图解

AUTOSAR 存储驱动程序&#xff08;Memory Driver&#xff09;详解 AUTOSAR存储驱动规范 - 技术解析与架构详解 目录 1. 概述2. Memory Driver架构设计 2.1 整体架构 3. Memory Driver核心组件4. 作业管理5. Memory Driver错误处理6. 时序流程7. 配置与设置8. 总结 1. 概述 A…...

AI结合VBA提升EXCEL办公效率尝试

文章目录 前言一、开始VBA编程二、主要代码三、添加到所有EXCEL四、运行效果五、AI扩展 前言 EXCEL右击菜单添加一个选项&#xff0c;点击执行自己逻辑的功能。 然后让DeepSeek帮我把我的想法生成VBA代码 一、开始VBA编程 我的excel主菜单没有’开发工具‘ 选项&#xff0c;…...

Python中NumPy的索引和切片

在数据科学和科学计算领域&#xff0c;NumPy是一个功能强大且广泛使用的Python库。它提供了高效的多维数组对象以及丰富的数组操作函数&#xff0c;其中索引和切片是NumPy的核心功能之一。通过灵活运用索引和切片操作&#xff0c;我们可以轻松访问和操作数组中的元素&#xff0…...

普通通话CSFB方式(2g/3g)

一、CSFB的触发条件 当模块&#xff08;或手机&#xff09;驻留在 4G LTE网络 时&#xff0c;若发生以下事件&#xff0c;会触发CSFB流程&#xff1a; 主叫场景&#xff1a;用户主动拨打电话。被叫场景&#xff1a;接收到来电&#xff08;MT Call&#xff09;。紧急呼叫&…...

daily routines 日常生活

总结 🛏 起床相关(Waking Up) 动作常用表达示例句子醒来wake upI usually wake up around 6:30.起床(离床)get up / get out of bedI got out of bed at 6:45.赖床stay in bed / lay thereI stayed in bed for another 10 minutes.关闭闹钟turn off the alarm / hit snoo…...

系分论文《论面向服务开发方法在设备租赁行业的应用》

系统分析师论文系列 【摘要】 2022年5月&#xff0c;我司承接某工程机械租赁企业"智能租赁运营管理平台"建设项目&#xff0c;我作为系统分析师主导系统架构设计。该项目需整合8大类2000余台设备资产&#xff0c;覆盖全国15个区域运营中心与300家代理商&#xff0c;实…...

深度解析python生成器和关键字yield

一、生成器概述 生成器&#xff08;Generator&#xff09;是Python中用于创建迭代器的工具&#xff0c;通过yield关键字实现。与普通函数不同&#xff0c;生成器函数返回的是迭代器对象&#xff0c;具有以下核心特性&#xff1a; 内存效率&#xff1a;只在需要时生成值&#x…...

蓝桥杯大模板

init.c void System_Init() {P0 0x00; //关闭蜂鸣器和继电器P2 P2 & 0x1f | 0xa0;P2 & 0x1f;P0 0x00; //关闭LEDP2 P2 & 0x1f | 0x80;P2 & 0x1f; } led.c #include <LED.H>idata unsigned char temp_1 0x00; idata unsigned char temp_old…...