首页
关于这个博客
Search
1
Java 实现Google 账号单点登录(OAuth 2.0)全流程解析
231 阅读
2
Spring AI 无法获取大模型深度思考内容?解决方案来了
201 阅读
3
微信小程序实现页面返回前确认弹窗:兼容左上角返回与右滑返回
91 阅读
4
服务器遭遇 XMRig 挖矿程序入侵排查与清理全记录
66 阅读
5
解决 Mac 版 PicGo 无法打开问题:“已损坏,无法打开” 报错处理指南
37 阅读
Java 核心
框架与中间件
数据库技术
开发工具与效率
问题排查与踩坑记录
程序员成长与思考
前端
登录
Search
标签搜索
java虚拟机
JVM
保姆级教程
Java
Spring AI
SpringBoot
Nginx
WebFlux
Spring
cdn
https
dcdn
网站加速
Tool
图片导出
服务部署
源码解析
单点登录
google
sso
Luca Ju
累计撰写
35
篇文章
累计收到
1
条评论
首页
栏目
Java 核心
框架与中间件
数据库技术
开发工具与效率
问题排查与踩坑记录
程序员成长与思考
前端
页面
关于这个博客
搜索到
1
篇与
的结果
2025-08-20
Spring AI 实战:调用本地 Tool 工具方法实现大模型能力扩展
前言大模型虽强,但在实时信息获取(如当前日期、天气)、复杂计算等场景下存在局限。而 Tool 工具方法 正是解决这一问题的关键 —— 它让大模型能调用本地代码获取结果,弥补自身能力短板。本文将通过具体代码案例,手把手教你在 Spring AI 中集成本地 Tool,实现大模型与本地逻辑的联动。一、基础准备:Spring AI 调用大模型环境搭建在集成 Tool 前,先搭建 Spring AI 调用大模型的基础环境,确保能正常与大模型交互。1. 添加核心依赖在 pom.xml 中引入 Spring AI OpenAI 适配器依赖(兼容主流大模型平台):<!-- Spring AI 大模型接入核心依赖 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-model-openai</artifactId> <version>1.0.0</version> </dependency>2. 基础调用代码实现(1)Controller:定义接口入口创建一个简单的 HTTP 接口,接收用户提问并调用服务层处理:import com.yeeiee.ailogic.module.ai.service.chat.SpringAiTestService; import jakarta.annotation.Resource; import org.springframework.http.MediaType; 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; import reactor.core.publisher.Flux; @RestController @RequestMapping("ai-test") public class SpringAiTestController { @Resource private SpringAiTestService springAiTestService; // 流式输出接口(支持实时返回大模型响应) @GetMapping(value = "stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> stream(@RequestParam("content") String content) { return springAiTestService.stream(content); } }(2)Service:实现大模型调用逻辑定义服务接口及实现类,配置大模型连接信息并发起调用:// 服务接口 public interface SpringAiTestService { // 大模型流式输出方法 Flux<String> stream(String content); } // 服务实现类 import cn.hutool.core.util.StrUtil; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.ai.openai.OpenAiChatOptions; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; @Service public class SpringAiTestServiceImpl implements SpringAiTestService { @Override public Flux<String> stream(String content) { // 配置大模型平台(以硅基流动为例,兼容 OpenAI 接口格式) OpenAiChatModel chatModel = OpenAiChatModel.builder() .openAiApi(OpenAiApi.builder() .baseUrl("https://api.siliconflow.cn") // 硅基流动 API 地址 .apiKey(System.getenv("SiliconFlow_API")) // 从环境变量获取 API Key .build()) .defaultOptions(OpenAiChatOptions.builder() .model("Qwen/Qwen3-30B-A3B-Instruct-2507") // 指定模型 .build()) .build(); // 构建提问并发起流式调用 Prompt prompt = new Prompt(content); Flux<ChatResponse> stream = chatModel.stream(prompt); // 处理响应流,提取文本内容 return stream.map(chunk -> { String text = chunk.getResult() != null && chunk.getResult().getOutput() != null ? chunk.getResult().getOutput().getText() : ""; return StrUtil.nullToDefault(text, ""); // 避免 null 结果 }); } }3. 未集成 Tool 时的问题当我们调用接口提问 “今天是几号?” 时,大模型因无实时能力,回答明显不准确:这正是需要 Tool 工具方法的场景 —— 让大模型调用本地代码获取真实日期。二、核心实现:集成本地 Tool 工具方法通过 Spring AI 的 Tool 机制,让大模型在需要时自动调用本地代码(如获取当前日期),步骤如下:1. 创建本地 Tool 工具类定义一个获取当前日期的工具类,交给 Spring 管理(需实现 Function 接口):import com.fasterxml.jackson.annotation.JsonClassDescription; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; import java.util.function.Function; /** * 本地 Tool:获取当前日期 */ @Slf4j @Component("current_date") // 组件名称,用于后续指定 Tool public class CurrentDateToolFunction implements Function<CurrentDateToolFunction.Request, CurrentDateToolFunction.Response> { // 工具方法请求参数(无参数时为空类) @Data @JsonClassDescription("查询今天的日期") // 描述工具用途,帮助大模型理解 public static class Request { } // 工具方法响应结果 @Data @AllArgsConstructor @NoArgsConstructor public static class Response { private String date; // 日期结果(格式:yyyy-MM-dd) } // 核心逻辑:获取当前日期并返回 @Override public Response apply(Request request) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String currentDate = dateFormat.format(new Date()); log.info("调用本地 Tool 获取当前日期:{}", currentDate); return new Response(currentDate); } }关键说明:类上添加 @Component("current_date"),指定 Tool 名称为 current_date;Request 和 Response 类用于定义工具的输入输出格式,需配合 JSON 注解描述用途;apply 方法实现具体逻辑(此处为获取当前日期)。2. 修改大模型配置,启用 Tool在 Service 实现类中,为大模型配置 Tool 相关参数,使其能调用本地工具:@Override public Flux<String> stream(String content) { // 配置大模型,添加 Tool 支持 OpenAiChatModel chatModel = OpenAiChatModel.builder() .openAiApi(OpenAiApi.builder() .baseUrl("https://api.siliconflow.cn") .apiKey(System.getenv("SiliconFlow_API")) .build()) .defaultOptions(OpenAiChatOptions.builder() .model("Qwen/Qwen3-30B-A3B-Instruct-2507") .toolNames("current_date") // 指定启用的 Tool 名称(对应@Component的value) .build()) .toolCallingManager(SpringUtil.getBean(ToolCallingManager.class)) // 注入 Tool 调用管理器(Spring AI 提供) .build(); // 后续调用逻辑与之前一致... Prompt prompt = new Prompt(content); Flux<ChatResponse> stream = chatModel.stream(prompt); return stream.map(chunk -> { String text = chunk.getResult() != null && chunk.getResult().getOutput() != null ? chunk.getResult().getOutput().getText() : ""; return StrUtil.nullToDefault(text, ""); }); }核心配置:toolNames("current_date"):告诉大模型可调用名为 current_date 的 Tool;toolCallingManager:注入 Spring AI 提供的 ToolCallingManager,负责处理 Tool 调用流程。三、测试验证:Tool 工具调用效果再次调用接口提问 “今天是几号?”,大模型会自动触发 current_date 工具调用:1. 大模型响应结果大模型先说明 “将调用工具获取日期”,随后返回通过本地代码获取的准确日期。2. 本地日志验证查看应用日志,确认 Tool 被成功调用:2025-08-20 15:19:44.637 | INFO 28998 | boundedElastic-1 [TID: N/A] c.y.a.m.a.s.m.t.CurrentDateToolFunction | 调用本地 Tool 获取当前日期:2025-08-20总结通过本文案例,我们实现了 Spring AI 与本地 Tool 工具的集成,核心步骤可概括为:定义 Tool 工具类(实现 Function 接口,交给 Spring 管理);在大模型配置中指定 Tool 名称和调用管理器;大模型会根据提问自动判断是否调用 Tool,获取结果后整理回答。这种方式让大模型突破了自身局限,能灵活扩展实时数据获取、复杂计算等能力。下一篇将深入源码解析 Spring AI Tool 的底层实现原理,敬请期待!
2025年08月20日
14 阅读
0 评论
1 点赞