Tool Calling 工具调用

发布时间:2026/11/14 17:02:25

Tool Calling 工具调用 目录一、概述二、工具定义与使用工具定义工具使用三、Tool Calling 使用案例1) 创建SpringBoot项目命名为“SpringAIToolCalling”2) 配置项目pom.xml3) 配置resources/application.properties4) 创建tools包并创建MyTools.java类5) 创建controller包并创建ToolUseController.java文件6) 启动项目并测试一、概述Tool Calling工具调用也称为函数调用是让大语言模型LLM在对话中“调用”外部定义的工具或 API 的机制通过这个机制模型可以在生成回答前提出需要执行的操作如获取实时天气、设置数据库记录、触发业务流程等然后由应用端执行工具结果再反馈回模型最终给用户完整回复。Tool Calling主要应用场景如下信息检索从外部源如数据库、Web 服务、文件系统或 Web 搜索引擎检索信息增强模型的知识使其能够回答其他方式无法回答的问题。执行操作在软件系统中执行特定操作如发送电子邮件、在数据库中创建新记录、提交表单或触发工作流。目标是自动执行原本需要人工干预或显式编程的任务。Spring AI 提供了方便的 API 来定义工具、解析来自模型的工具调用请求以及执行工具调用。二、工具定义与使用Spring AI中工具调用流程示意图如下开发者定义工具并将其注册到 Spring 容器中。模型在生成响应时识别到需要调用工具会生成包含工具调用信息的响应。应用程序接收到模型的响应后解析其中的工具调用信息执行相应的工具。工具执行完成后将结果返回给应用程序。应用程序将工具执行结果作为上下文信息传递给模型。模型使用工具执行结果生成最终的响应。工具定义开发者可以通过在方法上添加Tool注解定义工具该注解允许提供工具的名称、描述和输入参数等信息模型在调用工具时会根据这些信息生成相应的调用请求。定义工具示例如下Component public class Tools { Tool(description 获取当前日期和时间) public String getCurrentDateTime() { return 当前日期...; } Tool(description 设置闹钟) public void setAlarm(ToolParam(description 闹钟时间) String alarmTime) { // 设置闹钟的逻辑 } }以上注意点a. Component 加到类中表示是一个组件关键是将工具类让Spring容器管理起来也可以使用Configuration、Service标记类只要Spring 能扫描到并将其实例管理起来就可以。b. 工具方法使用Tool标注工具名称默认就是方法本身也可以通过Tool(nametool name)方式来指定。c. Tool(description...)中这里的description是工具描述大模型根据该描述决定要不要调用该工具。d. 工具方法中需要传入参数的通过使用ToolParam标注大模型自动决定调用时机和自动根据语义传入参数调用完成后生成最终对话。e. 工具不支持如下类型作为参数或返回值:Optional、异步类型如 CompletableFuture、Future、响应式类型如 Flow、Mono、Flux、函数式类型如 Function、Supplier、Consumer。工具使用//注册多个工具 ChatClient chatClient ChatClient.builder(chatModel) .defaultSystem(你是一个非常有帮助的助手你可以使用工具来帮助回答问题) .defaultTools(new ATools(),new BTools,new CTools ...) .build(); //与模型进行对话 String result chatClient.prompt() .user(给我设置10分钟后的闹钟) .call() .content();三、Tool Calling 使用案例如下创建SpringBoot项目在该项目中定义多个工具演示Spring AI中工具使用按照如下步骤实现即可。1) 创建SpringBoot项目命名为“SpringAIToolCalling”2) 配置项目pom.xml?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.5.3/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdSpringAIToolCalling/artifactId version0.0.1-SNAPSHOT/version nameSpringAIToolCalling/name descriptionSpringAIToolCalling/description properties java.version17/java.version /properties !-- 导入 Spring AI BOM用于统一管理 Spring AI 依赖的版本 引用每个 Spring AI 模块时不用再写 version只要依赖什么模块 Mavens 自动使用 BOM 推荐的版本 -- dependencyManagement dependencies dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version1.0.0-SNAPSHOT/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-starter-model-deepseek/artifactId /dependency /dependencies !-- 声明仓库 用于获取 Spring AI 以及相关预发布版本-- repositories repository idspring-snapshots/id nameSpring Snapshots/name urlhttps://repo.spring.io/snapshot/url releases enabledfalse/enabled /releases /repository repository nameCentral Portal Snapshots/name idcentral-portal-snapshots/id urlhttps://central.sonatype.com/repository/maven-snapshots//url releases enabledfalse/enabled /releases snapshots enabledtrue/enabled /snapshots /repository /repositories /project以上pom.xml中引入了“spring-ai-starter-model-deepseek”依赖包。3) 配置resources/application.propertiesspring.application.nameSpringAIToolCalling server.port8080 #配置 Deepseek的基础URL、密钥和使用模型 spring.ai.deepseek.base-urlhttps://api.deepseek.com spring.ai.deepseek.api-keysk-...21 spring.ai.deepseek.chat.options.modeldeepseek-chat4) 创建tools包并创建MyTools.java类package com.example.springaitoolcalling.tools; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; Component public class MyTools { Logger log LoggerFactory.getLogger(MyTools.class); Tool(description 返回当前系统时间) public String getCurrentTime() { log.info(调用 getCurrentTime 工具当前时间java.time.LocalDateTime.now().toString()); return java.time.LocalDateTime.now().toString(); } Tool(description 对两个数字执行加、减、乘、除运算) public double calculate( ToolParam(description 第一个数字) double a, ToolParam(description 第二个数字) double b, ToolParam(description 运算类型) String operation) { log.info(调用 calculate 工具第一个数字a,第二个数字b,运算类型operation); double result 0; switch (operation) { case add: result a b; break; case subtract: result a - b; break; case multiply: result a * b; break; case divide: if (b ! 0) { result a / b; } } return result; } private RestTemplate restTemplate new RestTemplate(); private String baseUrl http://shanhe.kim/api/youjia/youjia.php; Tool(description 查询指定省份的油价直接返回完整 JSON 字符串) public String getOilPriceJson(ToolParam(description 省份名称) String province) { log.info(调用 getOilPriceJson 工具查询省份province); String url String.format(%s?province%s, baseUrl, province); return restTemplate.getForObject(url, String.class); } }在MyTools.java类中我们定义了三个工具每个方法中进行了log日志输出getCurrentTime返回当前系统时间。calculate:对两个数字执行加、减、乘、除运算。getOilPriceJson:查询指定省份的油价直接返回完整 JSON 字符串。5) 创建controller包并创建ToolUseController.java文件package com.example.springaitoolcalling.controller; import com.example.springaitoolcalling.tools.MyTools; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/ai) public class ToolUseController { private final ChatClient chatClient; public ToolUseController(ChatModel chatModel, MyTools tools) { this.chatClient ChatClient.builder(chatModel) .defaultSystem(你是一个非常有帮助的助手你可以使用工具来帮助回答问题) .defaultTools(tools) .build(); } GetMapping(/chat) public String chat(RequestParam(message) String message) { return chatClient.prompt() .user(message) .call() .content(); } }6) 启动项目并测试启动项目后浏览器输入如下内容进行测试# http://localhost:8080/ai/chat?message今天是什么日期 今天是xxx年xx月xx日 # http://localhost:8080/ai/chat?message123乘以200是多少 123乘以200等于24600。 # http://localhost:8080/ai/chat?message北京油价是多少 北京的油价如下 - 92号汽油7.17 元/升 - 95号汽油7.64 元/升 - 98号汽油9.14 元/升 - 0号柴油6.86 元/升 数据更新时间xxx xxx # http://localhost:8080/ai/chat?message今天天气如何 我无法直接获取天气信息但您可以告诉我您所在的城市或地区我可以尝试为您提供相关的天气查询建议或链接。特别提示以上代码运行后与工具调用相关的提问可以看到后台打印的日志会调用到工具对应的方法。我们也可以在“ToolUseController.java”中设置不使用工具将“defaultToolsnew MyTools”注释掉再进行测试会发现以上访问不会调用工具都由大模型根据已有知识进行回复可能存在不精准情况。
延伸阅读

更多相关文章

2026/11/8 21:29:41

网络安全自学路线图:从零基础到实战渗透测试的90天学习路径

网络安全领域的技术迭代速度很快,但核心的知识体系、方法论和实践技能是相对稳定的。对于希望从零开始系统学习,并最终能够胜任渗透测试、漏洞挖掘等安全岗位的初学者而言,一个清晰、务实、可执行的学习路径远比追逐“最新”的标题更为重要。…

2026/11/10 18:38:21

VC++实战:从控制台到MFC的Windows计算器开发全解析

1. 项目概述与核心价值“VC编程实践:Windows计算器应用源代码详解”这个标题,对于任何一位从Windows桌面开发时代走过来的老程序员来说,都像是一把钥匙,瞬间打开了记忆的闸门。VC,或者说Visual C,不仅仅是微…

2026/10/26 1:03:09

PTA基础编程题目集 7-21求特殊方程的正整数解(C++语言实现)

摘要:本文是PTA编程题"求特殊方程的正整数解"的题解,涵盖题目描述、输入输出格式及C语言实现,展示双重枚举暴力搜索算法。题目描述 本题要求对任意给定的正整数N,求方程X Y N的全部正整数解。 输入格式: 输…

2026/11/14 17:02:17

考电工证赤峰能考吗?上岗必备证书怎么考?全流程看这篇

考电工证赤峰能考吗?上岗必备证书怎么考?全流程看这篇 你是不是刚毕业,正愁找不到工作?特种作业证成了 上岗必备 的门槛,尤其是电工证,几乎是电力、建筑、制造等行业招聘的硬性条件。但问题来了, 考电工证赤峰能考吗…

2026/11/14 17:02:17

唐山电工证考证多少钱 全国通用的电工证怎么考才划算

唐山电工证考证多少钱 全国通用的电工证怎么考才划算 你是不是正在找工作,却发现用人单位非要你有电工证?别急,这事儿我懂,现在特种作业证越来越受重视, 全国通用 的电工证,不光是找工作的门槛,更是你未来发展的“敲门砖”。…

2026/11/14 16:57:16

潍坊办电工证的地方怎么考,考前押题帮你避开培训费陷阱

潍坊办电工证的地方怎么考,考前押题帮你避开培训费陷阱 怕考不过白交培训费?你不是一个人。在潍坊办电工证的地方,很多人因为备考不充分,最终花了钱却拿不到证,甚至被培训机构坑了。别担心,今天我就来带你理清楚整个流程,从报名到考试,再到复审,一步…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑