✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
这里有:
- 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
- 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
- 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!
👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~
目录
欢迎来到 盹猫(>^ω^<)的博客
本篇文章主要介绍了
[SpringBoot三步集成AI模型并实现格式化输出]
❤博主广交技术好友,喜欢文章的可以关注一下❤
前言
在AI发展日益强大的今天,作为SpringBoot的忠实Coder,你是否仍然还在盯着数据库的增删改查操作?危险⚠️,你可能已经快要被淘汰了.你可能会说,Java可以做AI么?那不都是Python的事情么?
不,AI的时代已经到来,Spring官方当然不会错过机会.他们推出了SpringAI,用于快速在SpringBoot(Spring)中集成AI模型调用操作,并且提供了丰富的响应数据的格式化操作.
Spring AI 解决了 AI 集成的根本难题:
将企业数据和 API 与 AI 模型连接起来
。
网址:
SpringAI(https://springdoc.cn/spring-ai/index.html)
现在支持的模型类型如下:
AI无法在应用中集成的主要痛点就是两个:
1.接口调用困难(AI种类太多)
2.响应数据难控制(AI很调皮)
SpringAi通过预定于很好的解决了上述问题,这篇文章就是记录使用SpringBoot快速接入DeepSeek并进行格式化的输出操作.
环境准备
根据要求官方推荐的SpringBoot版本为3.5+以上版本,而要使用这个版本以上,则JDK版本至少为JDK17版本,所以在开发前请确保使用JDK17以上版本,并在Pom配置时使用3.5+以上的SpringBoot版本.
实现步骤
Pom依赖
在Pom文件中需保证环境版本为17以上,这里使用17版本,并且使用了3.5.2版本的父依赖.因为要接入DeepSeek使用的主要AI依赖为spring-ai-starter-model-deepseek,并且引入官方要求的快照仓库.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.uav</groupId>
<artifactId>spring-deepseek</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Spring Boot 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.2</version>
</parent>
<properties>
<!-- 注意:Java 24 是预览版,建议使用稳定版 Java 17 或 21 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<!-- Spring 快照仓库(用于 Spring AI 快照版本) -->
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<dependencies>
<!-- 核心:Spring Web 依赖(含 Tomcat 服务器,支持 @RestController) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI DeepSeek 集成依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-deepseek</artifactId>
<version>1.1.0-SNAPSHOT</version>
</dependency>
<!-- 可选:Spring Boot 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- Spring AI 版本管理 BOM -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.1.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
yml配置文件
在配置文件中对api-key进行配置,该key可以在DeepSeek官网进行申请,并且配置为deepseek-chat类型(聊天模式),随机性参数设置为 0.8.
spring:
ai:
deepseek:
api-key: 你的deepseek-key
chat:
options:
model: deepseek-chat
temperature: 0.8
请求接口
在Controller中主要使用DeepSeekChatModel和ChatClient进行AI接口的请求,DeepSeekChatModel 负责提供基础的接口请求功能,我们这里因为需要进行格式化输出,所以使用ChatClient进行扩展功能的请求,示例中:我们需要一个关于进行新闻的列表,根据描述,我们的预期响应结构是返回如下结构:
news:[{"title":"标题","detail":"详细描述"}....]
的一个列表.并且进行返回为(使用entity要求返回Map格式)Map格式(即Json字符串).
package com.uav;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class DeepSeekController {
private final DeepSeekChatModel chatModel;
@Autowired
public DeepSeekController(DeepSeekChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/ai/generate")
public Map<String, Object> generate(@RequestParam(value = "message") {
return ChatClient.builder(chatModel)
.build()
.prompt()
.user(u -> u.text("请返回一个关于{news}的列表")
.param("news", "今日新闻,item内容为{'title':'','detail':''},他们的key是'news'")
)
.call()
.entity(new ParameterizedTypeReference<Map<String, Object>>() {
});
}
}
效果图
通过在浏览器中访问:
http://127.0.0.1:8080/ai/generate
得到下述响应:
非常完美,响应结果完全符合预期.
总结
通过上述对DeepSeek的集成,可以看到SpringAI完美的解决了AI请求种类多(进行简单的配置即可),AI响应数据结构难以控制(通过增加提示词和转换器)的问题. 效果也是非常不错的.
赶紧去让你的应用加入AI功能吧!
注意:虽然增加了转换器,但仍然需要在实际应用中捕获异常(即使概率很低),以防止AI的调皮输出.
如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链
感谢您的关注和收藏!!!!!!