news 2026/3/24 17:15:25

轻松入门SpringAI-SpringAI的函数调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
轻松入门SpringAI-SpringAI的函数调用

Spring AI 函数调用(Tool/Function Calling)轻松入门
(2026年最新实用写法 · 零到上手完整示例)

函数调用是让大模型“知道自己不知道”并主动调用你提供的工具/函数来获取实时信息或执行操作的核心能力。

目前(2026年初)Spring AI 已经从早期的FunctionCallback升级到更强大的Tool Calling体系,主要有三种主流写法,按推荐顺序:

排名写法风格优点缺点/注意点推荐指数难度
1@Tool注解 + 对象实例最简洁、最现代、最推荐(1.0+主流)需要实例化类★★★★★★☆☆
2@Bean + @Description函数式纯函数风格、方便测试描述写在注解里,稍显分散★★★★☆★★☆
3手动FunctionToolCallback.builder()最大灵活性、可动态代码量多★★★☆☆★★★

推荐写法1:使用@Tool注解(最简单、最常用)

// 1. 先定义一个工具类(可以是普通的POJO)@Component// 可选,如果想自动扫描publicclassWeatherTools{@Tool(value="get_current_weather",// 工具唯一名称(模型会用这个名字调用)description="获取指定城市当前的天气信息,支持摄氏度和华氏度")publicStringgetWeather(@ToolParam(description="城市名称,如 '北京', 'Shanghai', 'Las Vegas'")Stringcity,@ToolParam(description="温度单位:celsius 或 fahrenheit,默认celsius")Stringunit){// 模拟真实查询,也可以换成调用第三方APIStringtemp=switch(city.toLowerCase()){case"beijing","北京"->"今天北京 -5℃,寒冷刺骨,多穿点!";case"shanghai","上海"->"上海今天12℃,阴天,有点湿冷";case"las vegas"->"拉斯维加斯现在是"+(unit.equalsIgnoreCase("fahrenheit")?"68°F":"20℃")+",阳光明媚适合游泳";default->"抱歉,目前只知道北京、上海、拉斯维加斯的天气~";};returntemp;}}
// 2. Controller中使用(最常用写法)@RestController@RequestMapping("/ai/tool")@RequiredArgsConstructorpublicclassToolDemoController{privatefinalChatClientchatClient;@GetMapping("/weather")publicStringaskWeather(@RequestParamStringquestion){// 直接把工具类实例传进去(支持多个)returnchatClient.prompt().user(question).tools(newWeatherTools())// ← 这里最关键// .tools(工具实例1, 工具实例2, ...) // 支持多个工具类.call().content();}}

测试例子(浏览器或postman直接试):

http://localhost:8080/ai/tool/weather?question=拉斯维加斯现在天气怎么样?用华氏度告诉我 http://localhost:8080/ai/tool/weather?question=北京今天冷不冷?

模型会自动判断是否需要调用工具 → 调用 → 把结果塞回上下文 → 最终给出自然语言回答

推荐写法2:函数式(@Bean + @Description)

适合喜欢函数式风格的同学,也非常常用:

@ConfigurationpublicclassToolFunctionsConfig{@Bean@Description("获取指定城市的当前天气,支持celsius/fahrenheit两种单位")publicFunction<WeatherQuery,String>currentWeather(){returnquery->{// 模拟实现returnswitch(query.city().toLowerCase()){case"beijing"->"北京 "+(query.unit().equals("f")?"-5℃ ≈ 23°F":"-5℃")+",冷到想回家";case"las vegas"->"Las Vegas "+(query.unit().equals("f")?"68°F":"20℃")+",适合户外活动";default->"暂无该城市天气数据";};};}// 记录类型(作为输入参数)publicrecordWeatherQuery(Stringcity,Stringunit){}}

使用方式:

chatClient.prompt().user("上海天气如何?").functions("currentWeather")// ← 使用bean名称.call().content();

进阶小技巧(生产常用)

  1. 多个工具一起用(并行调用)
.tools(newWeatherTools(),newStockPriceTools(),newCalculatorTools())
  1. 流式 + 工具调用(前端打字机 + 工具)

目前大多数模型流式下工具调用支持有限,建议先用普通.call(),等模型成熟再切.stream()

  1. 带记忆的工具对话(最实用组合)
chatClient.prompt().system("你是生活助手,会用工具帮用户解决问题").user(question).tools(newWeatherTools()).advisors(newMessageChatMemoryAdvisor(chatMemory)).call().content();
  1. 强制/禁用工具(精细控制)
// 只允许使用某个工具.tools(newWeatherTools())// 强制调用某个工具(极少用).toolChoice(ToolChoice.REQUIRED)// 或 ToolChoice.FORCE("get_weather")

一句话总结2026年最舒服的入门函数调用方式

ChatClient + .tools(带有@Tool注解的类实例) + DeepSeek-R1 / GPT-4o / 通义千问 / 硅基流动兼容模型

快速练习建议(由易到难):

  1. 实现天气查询工具(上面例子)
  2. 实现汇率查询工具(调用免费汇率API)
  3. 实现计算器工具(加减乘除)
  4. 实现查快递工具
  5. 实现生成周报/日报小工具

需要我帮你把上面任意一个练习做成更完整的可运行小项目(包含配置、假数据/真API、测试页面)吗?
直接告诉我你想先实现哪个工具~ 😄

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 16:54:54

轻松入门SpringAI-SpringAI实现RAG

轻松入门 Spring AI RAG&#xff08;Retrieval-Augmented Generation&#xff09;实现 &#xff08;2026年主流实用写法 从最简单到生产可用&#xff09; RAG 是目前使用大模型最常见、最有效的增强方式之一&#xff1a; 让模型“先查资料&#xff0c;再回答”&#xff0c;大…

作者头像 李华
网站建设 2026/3/19 18:58:01

Python+Vue的笔记管理系统的设计与实现 django Pycharm flask

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

作者头像 李华
网站建设 2026/3/15 0:56:36

Python+Vue的 第三方物流管理系统 django Pycharm flask

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

作者头像 李华
网站建设 2026/3/5 15:49:11

Python+Vue的河南省红色文化旅游管理服务平台 django Pycharm flask

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

作者头像 李华
网站建设 2026/3/21 19:13:42

小程序计算机毕设之基于springboot+微信小程序的服装购物平台的设计与实现小程序(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/14 10:32:13

ESP8266-01S学习笔记

这里写目录标题传模式 vs 非透传模式解析JSON的差异一、透传模式 vs 非透传模式的JSON解析1.1 两种模式下的串口数据格式对比非透传模式&#xff08;默认模式&#xff09;透传模式1.2 两种模式对比表1.3 透传模式设置代码二、堆栈设置问题详解2.1 为什么需要调整堆栈大小&#…

作者头像 李华