发布时间:2026/8/8 8:40:10
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/8/8 8:40:10

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

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

2026/8/8 8:40:10

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

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

2026/8/8 8:40:10

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

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

2026/8/8 9:40:14

【电商项目】新手角色管理代码测试报错排查与解决方案

之前小编已经把管理员的CRDU逐个完成并认真看了报错总结了自己踩的坑。角色管理这里也是实现CRDU,我自己尝试独立完成,实现过程比较顺利,就是有几处总是忘写注解,这个等后期要总结一篇新博文发,这篇主要记录一下编写和…

2026/8/8 9:40:14

中国车牌生成器:3分钟快速生成符合国标的车牌图片

中国车牌生成器:3分钟快速生成符合国标的车牌图片 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个功能强大的开源Python工具&#xf…

2026/8/8 9:40:14

80.资深 SAP 开发总结:ALV 宏字段目录 + 双击事务穿透最佳实践

摘要 本文面向具备一定编程基础、希望系统掌握SAP ABAP开发的技术人员。文章从SAP系统架构与ABAP语言特性出发,深入剖析ABAP数据字典、内表操作、模块化程序设计等核心原理,并通过一个完整的采购订单报表开发实例,逐步演示从数据定义、逻辑编写到ALV输出的全过程。所有代码均…

2026/8/8 9:35:13

医疗影像VLM实战:CARE-X如何用三大核心技术实现AI辅助诊断

这次我们来看一个面向医疗影像领域的视觉语言大模型(VLM)项目——CARE-X。这个项目由研究团队提出,旨在解决当前通用VLM在临床放射学任务中表现不佳的问题。它的核心目标不是追求通用对话能力,而是要让AI模型真正理解医学影像&…

2026/8/7 19:43:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/8 0:04:22

Java图像处理实战指南

要执行这些 Java AWT 图像处理程序,你需要将它们分别保存为独立的 .java 文件,并使用 javac 编译,然后使用 java 运行。以下是每个程序的核心执行步骤、依赖关系和要点。 通用执行步骤 保存文件:将每个 listing 的代码复制到文本…

2026/8/8 0:04:23

昇腾AI代理实现多号通话自动化

基于昇腾(Ascend)硬件与AtomGit AI社区的开源生态,结合AI Agent技术,可以实现一个模拟“通话重复使用机号复制”功能的安卓手机应用原型。其核心是利用AI Agent进行意图理解、任务编排和自动化操作,模拟或管理多号码的…

2026/8/8 0:04:23

2026年Graph+AI Agents最新创新思路

本次围绕GraphAI Agents这个方向筛选了15篇高质量论文,都是近年来具有较高引用价值或方法创新的研究工作,其中部分来自IJCAI、AAAI、ICRA。 对于论文er来说,这些论文方法结构清晰、可复现性较强,在多个任务上都有可延展的空间。如…

2026/8/7 9:44:18

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/7 19:03:32

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/8 2:17:42

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…