大模型之Spring AI实战系列(三十二):Spring Boot + DeepSeek 实战指南:工具函数(Function Call)实战应用

发布于:2025-07-17 ⋅ 阅读:(17) ⋅ 点赞:(0)

系列篇章💥

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 初体验——搭建首个可调用工具
16 大模型之 Spring AI实战系列(十六):Spring AI Tools 初级开发——解锁天气查询与数据库操作工具
17 大模型之 Spring AI实战系列(十七):Spring AI Tools 高级技巧——异步调用、事务控制与错误处理攻略
18 大模型之 Spring AI实战系列(十八):Spring AI Tools 进阶实战——深度集成 RESTful API 联通外部服务
19 大模型之Spring AI实战系列(十九):Spring Boot + 智谱AI 一站式开发指南,带你玩转大模型
20 大模型之Spring AI实战系列(二十):Spring AI + MCP + Brave Search 实战指南
21 大模型之Spring AI实战系列(二十一):Spring AI + MCP + 本地文件系统实战指南
22 大模型之Spring AI实战系列(二十二):Spring AI + MCP + SQLite 数据库实战指南
23 大模型之Spring AI实战系列(二十三):Spring AI + MCP + 自定义MCP服务开发实战
24 大模型之Spring AI实战系列(二十四):Spring Boot + OpenAI 集成DeepSeek模型构建智能对话应用
25 大模型之Spring AI实战系列(二十五):Spring Boot + DeepSeekAPI构建DeepSeek模型智能对话应用
26 大模型之Spring AI实战系列(二十六):Spring Boot + DeepSeek 实战指南:构建AI聊天应用
27 大模型之Spring AI实战系列(二十七):Spring Boot + DeepSeek 实战指南:构建智能代码生成器
28 大模型之Spring AI实战系列(二十八):Spring Boot + DeepSeek 实战指南:构建推理系统与思维链解析
29 大模型之Spring AI实战系列(二十九):Spring Boot + DeepSeek 实战指南:构建多轮对话系统
30 大模型之Spring AI实战系列(三十):Spring Boot + DeepSeek 实战指南:系统提示词设计
31 大模型之Spring AI实战系列(三十一):Spring Boot + DeepSeek 实战指南:结构化输出处理与实战应用
32 大模型之Spring AI实战系列(三十二):Spring Boot + DeepSeek 实战指南:工具函数(Function Call)实战应用


前言

随着人工智能技术的飞速发展,大模型在各个领域的应用日益广泛,为开发者带来了前所未有的机遇和挑战。在众多的框架和平台中,Spring Boot以其简洁、高效的特点,成为了构建企业级应用的首选之一。而DeepSeek作为一款强大的人工智能平台,提供了丰富的API接口和功能,能够满足各种复杂的应用需求。本文将深入探讨如何将Spring Boot与DeepSeek相结合,通过工具函数(Function Call)的实战应用,帮助读者快速掌握这一前沿技术,实现高效、智能的应用开发。

一、开发环境准备

(一)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"

(三)DeepSeek API Key

你需要注册 DeepSeek 官网 获取 API Key,并设置为环境变量:

export DEEPSEEK_API_KEY="your_deepseek_api_key"

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

二、POM依赖引入

引入DeepSeek集成依赖包

<dependencies>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-model-deepseek</artifactId>
    </dependency>
</dependencies>

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

三、配置文件详解

在application.yml中配置DeepSeek服务的基本信息:

server:
  port: 8080
spring:
  ai:
    deepseek:
      api-key: ${DEEPSEEK_API_KEY}
      base-url: https://api.deepseek.com
      chat:
        options:
          model: deepseek-chat
          temperature: 0.8

关键配置说明:

  • 使用环境变量DEEPSEEK_API_KEY管理敏感信息,避免硬编码
  • 设置temperature为0.8,平衡创造性和准确性
  • 默认使用deepseek-chat模型,但在代码中会动态切换到deepseek-reasoner

四、核心代码详解

(一)应用启动类:【DeepSeekApplication.java】

这是 Spring Boot 的启动类,非常简洁:

@SpringBootApplication
public class DeepSeekApplication {

    public static void main(String[] args) {
        SpringApplication.run(DeepSeekApplication.class, args);
    }

}

Spring Boot会自动扫描并加载所有的Controller、Service等Bean,为项目的启动和运行奠定基础。它通过@SpringBootApplication注解开启了Spring Boot的自动配置功能,使得项目能够快速搭建起一个完整的Spring应用环境。

(二)接口服务定义:【WeatherService.java】

public class WeatherService implements Function<WeatherService.WeatherRequest, WeatherService.WeatherResponse> {
    public WeatherResponse apply(WeatherRequest request) {
        return new WeatherResponse(30.0, Unit.C);
    }

    public enum Unit { C, F }
    public record WeatherRequest(String location, Unit unit) {}
    public record WeatherResponse(double temp, Unit unit) {}
}

(二)工具注册配置:【WeatherTools.java】

@Configuration(proxyBeanMethods = false)
class WeatherTools {

    public static final String CURRENT_WEATHER_TOOL = "currentWeather";

    @Bean(CURRENT_WEATHER_TOOL)
    @Description("Get the weather in location")
    Function<WeatherRequest, WeatherResponse> currentWeather() {
        return request -> {
            Assert.notNull(request, "Weather request cannot be null");
            double temperature = fetchTemperature(request.location());
            return new WeatherResponse(temperature, request.unit());
        };
    }

    public enum Unit {
        C, F
    }

    public record WeatherRequest(String location, WeatherService.Unit unit) {}

    public record WeatherResponse(double temp, WeatherService.Unit unit) {}

    private double fetchTemperature(String location) {
        return (Math.random() * 30 + 10); // 温度范围10~40°C
    }
}

这个配置类完成了以下重要功能:

  1. 定义工具名称常量CURRENT_WEATHER_TOOL
  2. 使用@Bean注解注册天气查询工具
  3. 提供详细的JavaDoc文档说明
  4. 实现温度单位枚举类型
  5. 定义请求和响应记录类
  6. 包含模拟的温度获取方法

(三)控制器实现:【FunctionCallingController.java】

/**
 * 函数调用控制器
 *
 * 该控制器用于演示如何使用 DeepSeek 模型进行函数调用(工具调用)。
 * 提供了两种不同的函数调用方式:
 * - /function/tool/test1:直接注册并调用天气查询工具
 * - /function/tool/test2:通过工具名称调用已注册的天气查询工具
 *
 * @author 寻道AI小兵
 */
@RestController
@RequestMapping("/function/tool")
public class FunctionCallingController {
    private static final Logger logger = LoggerFactory.getLogger(FunctionCallingController.class);

    private final DeepSeekChatModel chatModel;

    /**
     * 构造函数注入 DeepSeekChatModel 实例
     *
     * @param chatModel Spring AI 提供的 DeepSeek 聊天模型实例
     */
    @Autowired
    public FunctionCallingController(DeepSeekChatModel chatModel) {
        this.chatModel = chatModel;
    }

    /**
     * 函数调用测试接口1 - 直接注册并调用工具
     *
     * 示例请求:GET /function/tool/test1
     *
     * 功能描述:
     * - 创建一个直接绑定到 WeatherService 的函数调用回调
     * - 构建包含工具调用选项的 ChatOptions
     * - 向 DeepSeek 模型发送带有工具调用能力的提示
     * - 返回模型处理后的文本响应
     *
     * @return 包含 Copenhagen 当前天气信息的文本响应
     */
    @GetMapping("/test1")
    public String functionCallingTest1() {

        // 创建函数调用回调,绑定到 WeatherService
        ToolCallback toolCallback = FunctionToolCallback
                .builder("currentWeather", new WeatherService())
                .description("Get the weather in location")
                .inputType(WeatherService.WeatherRequest.class)
                .build();

        // 构建包含工具调用选项的 ChatOptions
        ChatOptions chatOptions = ToolCallingChatOptions.builder()
                .toolCallbacks(toolCallback)
                .build();

        // 创建包含提示和工具调用配置的 Prompt 对象
        Prompt prompt = new Prompt("What's the weather like in Copenhagen?", chatOptions);

        // 调用 DeepSeek 模型处理请求
        ChatResponse response = chatModel.call(prompt);

        // 返回模型处理后的文本响应
        return response.getResult().getOutput().getText();
    }

    /**
     * 函数调用测试接口2 - 通过工具名称调用已注册工具
     *
     * 示例请求:GET /function/tool/test2
     *
     * 功能描述:
     * - 使用已注册的工具名称构建工具调用选项
     * - 向 DeepSeek 模型发送带有工具调用能力的提示
     * - 返回模型处理后的文本响应
     *
     * 注意事项:
     * - 这种方式依赖于已在 Spring 上下文中注册的工具
     * - 在本示例中需要确保 WeatherTools 配置类已被正确加载
     *
     * @return 包含 Copenhagen 当前天气信息的文本响应
     */
    @GetMapping("/test2")
    public String functionCallingTest2() {

        // 使用已注册工具名称构建工具调用选项
        ChatOptions chatOptions = ToolCallingChatOptions.builder()
                .toolNames("currentWeather")
                .build();

        // 创建包含提示和工具调用配置的 Prompt 对象
        Prompt prompt = new Prompt("What's the weather like in Copenhagen?", chatOptions);

        // 调用 DeepSeek 模型处理请求
        ChatResponse response = chatModel.call(prompt);

        // 返回模型处理后的文本响应
        return response.getResult().getOutput().getText();
    }
}

控制器提供了两种不同的实现方式:

  1. 直接注册工具方式:通过functionCallingTest1方法演示

    • 创建函数调用回调
    • 构建包含工具调用选项的ChatOptions
    • 创建包含提示和工具调用配置的Prompt对象
    • 调用DeepSeek模型处理请求
  2. 通过工具名称调用方式:通过functionCallingTest2方法演示

    • 使用已注册的工具名称构建工具调用选项
    • 向DeepSeek模型发送带有工具调用能力的提示
    • 返回模型处理后的文本响应

五、部署与测试

(一)启动应用

可以直接基于IntelliJ IDEA启动并运行Spring Boot应用程序,也可以进入项目根目录,执行 mvn clean package 进行打包,之后采用 java -jar xxx.jar 命令进行部署运行。运行成功后,应用将在 http://localhost:8080 启动。

(二)测试接口

完成上述步骤后,你可以运行项目并通过浏览器访问以下URL来测试接口是否正常工作:

可以使用Postman、curl或其他HTTP客户端测试API接口:

1./function/tool/test1:直接注册并调用天气查询工具

http://localhost:8080/function/tool/test1

响应输出:

The current temperature in Copenhagen is 30°C.

2./function/tool/test2:通过工具名称调用已注册的天气查询工具

http://localhost:8080/function/tool/test2

响应输出:

The current temperature in Copenhagen is approximately 34.1°C.

六、总结

通过本文的详细讲解,我们成功地将Spring Boot与DeepSeek进行了集成,并实现了工具函数(Function Call)的实战应用。从开发环境的准备到核心代码的实现,再到最终的部署与测试,每一步都为大家提供了清晰的指导。通过两种不同的函数调用方式的演示,大家可以灵活地选择适合自己的方法来实现功能。希望本文能够为大家在人工智能领域的开发实践提供有价值的参考,助力大家在未来的项目中更好地利用Spring Boot和DeepSeek的强大功能,开发出更加智能、高效的应用程序。


在这里插入图片描述

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

😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!


网站公告

今日签到

点亮在社区的每一天
去签到