系列篇章💥
目录
前言
随着人工智能技术的飞速发展,大模型在各个领域的应用日益广泛,为开发者带来了前所未有的机遇和挑战。在众多的框架和平台中,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
}
}
这个配置类完成了以下重要功能:
- 定义工具名称常量
CURRENT_WEATHER_TOOL
- 使用
@Bean
注解注册天气查询工具 - 提供详细的JavaDoc文档说明
- 实现温度单位枚举类型
- 定义请求和响应记录类
- 包含模拟的温度获取方法
(三)控制器实现:【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();
}
}
控制器提供了两种不同的实现方式:
直接注册工具方式:通过
functionCallingTest1
方法演示- 创建函数调用回调
- 构建包含工具调用选项的
ChatOptions
- 创建包含提示和工具调用配置的
Prompt
对象 - 调用DeepSeek模型处理请求
通过工具名称调用方式:通过
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的探索之旅,开启智能时代的大门!