Spring AI 实战:调用本地 Tool 工具方法实现大模型能力扩展

Spring AI 实战:调用本地 Tool 工具方法实现大模型能力扩展

Luca Ju
2025-08-20 / 0 评论 / 14 阅读 / 正在检测是否收录...

前言

大模型虽强,但在实时信息获取(如当前日期、天气)、复杂计算等场景下存在局限。而 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 时的问题

当我们调用接口提问 “今天是几号?” 时,大模型因无实时能力,回答明显不准确:

image

这正是需要 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
  • RequestResponse 类用于定义工具的输入输出格式,需配合 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. 大模型响应结果

image

img

image

大模型先说明 “将调用工具获取日期”,随后返回通过本地代码获取的准确日期。

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 工具的集成,核心步骤可概括为:

  1. 定义 Tool 工具类(实现 Function 接口,交给 Spring 管理);
  2. 在大模型配置中指定 Tool 名称和调用管理器;
  3. 大模型会根据提问自动判断是否调用 Tool,获取结果后整理回答。

这种方式让大模型突破了自身局限,能灵活扩展实时数据获取、复杂计算等能力。下一篇将深入源码解析 Spring AI Tool 的底层实现原理,敬请期待!

1

评论 (0)

取消