大模型之 Spring AI实战系列(十五):Spring AI Tools 初体验——搭建首个可调用工具

06-01 1176阅读

系列篇章💥

No.文章
1大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅
2大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略
3大模型之Spring AI实战系列(三):Spring Boot + OpenAI 实现聊天应用上下文记忆功能
4大模型之Spring AI实战系列(四):Spring Boot + OpenAI 使用OpenAI Embedding实现文本向量化
5大模型之Spring AI实战系列(五):Spring Boot + OpenAI 构建带角色设定的智能对话系统
6大模型之Spring AI实战系列(六):Spring Boot + OpenAI 利用PromptTemplate构建动态提示词系统
7大模型之Spring AI实战系列(七):Spring Boot + OpenAI 构建结构化输出的AI响应系统
8大模型之Spring AI实战系列(八):Spring Boot + OpenAI 使用Whisper实现语音转文本功能
9大模型之Spring AI实战系列(九):Spring Boot + OpenAI 使用TTS实现文本转语音功能
10大模型之Spring AI实战系列(十):Spring Boot + OpenAI 使用 DALL·E实现文本生成图像功能
11大模型之Spring AI实战系列(十一):Spring Boot + OpenAI 集成本地向量数据库Chroma
12大模型之Spring AI实战系列(十二):Spring Boot + OpenAI 构建基于RAG的智能问答系统
13大模型之Spring AI实战系列(十三):Spring Boot + OpenAI 基于 Tool Calling 实现单个外部工具调用
14大模型之Spring AI实战系列(十四):Spring Boot + OpenAI 支持多个 Tool 的插件化调用实践
15大模型之 Spring AI实战系列(十五):Spring AI Tools 初体验——搭建首个可调用工具

目录

  • 系列篇章💥
  • 前言
  • 一、什么是 Spring AI Tools?
  • 二、开发环境准备
    • (一)Java 版本要求
    • (二)Maven 构建工具
    • (三)OpenAI API 密钥
    • 三、POM依赖引入
      • (一)Spring AI与OpenAI集成依赖包
      • (二)SpringAI相关依赖包版本管理
      • 四、配置文件详解
      • 五、编写第一个工具类:DateTimeTool
      • 四、通过 ChatClient 调用工具
      • 五、运行测试
      • 六、常见问题与调试技巧
        • (一)报错:Cannot resolve symbol 'DateTimeTool'
        • (二)工具未被调用
        • (三)参数类型不匹配异常
        • 七、小结

          前言

          在当前的 AI 应用开发中,一个关键的能力是让大模型具备“调用外部工具”的能力。Spring AI 提供了对工具调用(Tools)的原生支持,允许开发者将业务逻辑封装成工具,并通过自然语言提示词(Prompt)驱动模型自动选择并执行这些工具。

          本文将带你从零开始,一步步构建一个简单的 DateTimeTool 工具类,并通过 ChatClient 接口调用它,实现获取当前时间的功能。

          一、什么是 Spring AI Tools?

          Spring AI 是 Spring 生态中用于集成 AI 能力的新一代框架,其 tools 模块提供了一种机制,使得开发者可以:

          • 将业务逻辑封装为工具;
          • 使用注解定义工具描述和参数;
          • 让模型根据 Prompt 自动决定是否调用这些工具;
          • 支持 OpenAI、Azure OpenAI 等主流模型平台。

            二、开发环境准备

            (一)Java 版本要求

            本项目采用Java 17进行编译和运行,请务必确保你的开发环境已成功安装JDK 17。你可以在命令行中输入以下命令进行检查:

            java -version
            

            输出应类似如下内容:

            openjdk version "17.0.8" 2023-07-18
            OpenJDK Runtime Environment (build 17.0.8+7)
            OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)
            

            (二)Maven 构建工具

            确保你已安装 Maven 并配置好环境变量:

            mvn -v
            

            输出应类似如下内容:

            Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
            Maven home: D:\Program Files (x86)\apache-maven-3.8.8
            Java version: 17.0.12, vendor: Oracle Corporation, runtime: D:\Program Files\jdk-17.0.12
            Default locale: zh_CN, platform encoding: GBK
            OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
            

            (三)OpenAI API 密钥

            你需要注册 OpenAI 官网 获取 API Key(国内可以直接使用中转地址),并设置为环境变量:

            export OPENAI_API_KEY="your_openai_api_key"
            export OPENAI_API_URL="https://api.openai.com/v1"
            

            注意:出于安全考虑,不建议将密钥硬编码在代码中,推荐使用环境变量或配置中心进行管理。

            三、POM依赖引入

            (一)Spring AI与OpenAI集成依赖包

             
                 org.springframework.ai
                 spring-ai-starter-model-openai
             
            

            此依赖包用于实现Spring AI与OpenAI的集成,为后续与OpenAI API进行交互提供了必要的支持。

            (二)SpringAI相关依赖包版本管理

            版本管理

             
                
                    
                        org.springframework.ai
                        spring-ai-bom
                        1.0.0-SNAPSHOT
                        pom
                        import
                    
                
            
            

            部分通过引入spring-ai-bom,实现了对SpringAI相关依赖包版本的统一管理。这样,在项目中使用Spring AI相关依赖时,无需在每个依赖声明中单独指定版本号,只需遵循spring-ai-bom中定义的版本即可,极大地简化了依赖管理工作,同时确保了项目中依赖版本的一致性和稳定性。

            四、配置文件详解

            在配置文件 application.yml 中,对 OpenAI 相关参数进行配置:

            server:
              port: 8801
            spring:
              ai:
                openai:
                  base-url: ${OPENAI_API_URL}
                  api-key: ${OPENAI_API_KEY}
                  chat:
                    options:
                      model: gpt-4-turbo
                      temperature: 0.7
            

            五、编写第一个工具类:DateTimeTool

            我们来创建一个工具类,用于返回当前日期和时间。创建 DateTimeTool.java

            package com.example.demo.tools;
            import org.springframework.ai.tool.Tool;
            import org.springframework.stereotype.Component;
            import java.time.LocalDateTime;
            import java.time.format.DateTimeFormatter;
            @Component
            public class DateTimeTool {
                @Tool(description = "获取当前系统的日期和时间")
                public String getCurrentDateTime() {
                    LocalDateTime now = LocalDateTime.now();
                    return now.format(DateTimeFormatter.ISO_DATE_TIME);
                }
            }
            

            关键点说明:

            • @Component:将该类注册为 Spring Bean,便于后续注入。
            • @Tool(description = "..."):标记这是一个可被模型调用的工具方法,description 描述将作为提示词的一部分传给模型。

              四、通过 ChatClient 调用工具

              接下来,我们创建一个控制器,通过 ChatClient 接口调用我们刚刚编写的 DateTimeTool。

              创建 [ChatController.java]

              package com.example.demo.controller;
              import com.example.demo.tools.DateTimeTool;
              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.RestController;
              @RestController
              @RequestMapping("/chat")
              public class ChatController {
                  private final ChatModel chatModel;
                  private final DateTimeTool dateTimeTool;
                  public ChatController(ChatModel chatModel, DateTimeTool dateTimeTool) {
                      this.chatModel = chatModel;
                      this.dateTimeTool = dateTimeTool;
                  }
                  @GetMapping("/current-time")
                  public String getCurrentTime() {
                      String response = ChatClient.create(chatModel)
                              .prompt("What is the current date and time?")
                              .tools(dateTimeTool)
                              .call()
                              .content();
                      return response;
                  }
              }
              

              代码解析:

              • ChatClient.create(chatModel):构建一个对话客户端;
              • .prompt("..."):设置用户提问内容;
              • .tools(dateTimeTool):注入可用的工具;
              • .call():触发模型推理并处理工具调用;
              • .content():获取最终的文本响应。

                五、运行测试

                启动应用后,访问如下地址:

                http://localhost:8080/chat/current-time
                

                你会看到类似如下的输出:

                The current date and time is 2025-04-05T14:30:45.
                

                这表示模型成功调用了我们定义的 getCurrentDateTime() 工具,并将结果整合到回答中。

                六、常见问题与调试技巧

                (一)报错:Cannot resolve symbol ‘DateTimeTool’

                • 解决办法:确认 DateTimeTool 是否正确注册为 Spring Bean(是否有 @Component 注解);
                • 检查包扫描路径是否包含该类所在的 package。

                  (二)工具未被调用

                  • 查看日志是否有类似 Function calling: ... 的输出;
                  • 检查 Prompt 是否足够明确,例如尝试 "Please tell me the current date and time."

                    (三)参数类型不匹配异常

                    • 确保工具方法参数类型为基本类型或 JSON 可序列化对象;
                    • 不要使用自定义复杂对象作为参数。

                      七、小结

                      通过本文,你已经完成了以下任务:

                      • 了解了 Spring AI Tools 的核心作用;
                      • 搭建了一个基础的 Spring Boot + Spring AI 开发环境;
                      • 实现了一个简单的工具类 DateTimeTool;
                      • 学会了如何通过 ChatClient 调用工具;
                      • 成功运行并验证了工具调用流程。

                        在下一篇文章中,我们将继续深入,教你如何开发更复杂的工具类,比如天气查询、数据库操作等。欢迎关注!


                        大模型之 Spring AI实战系列(十五):Spring AI Tools 初体验——搭建首个可调用工具

                        🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

                        😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)

                        📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。

                        💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)

                        如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码