前言
大模型虽强,但在实时信息获取(如当前日期、天气)、复杂计算等场景下存在局限。而 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 的底层实现原理,敬请期待!
评论 (0)