当前位置: 首页 > news >正文

Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot

引子

LLM 的浪潮以不可阻挡之势席卷全球,从改变用户交互到重塑商业模式,我们每一位开发者都身处这场技术变革的中心。作为庞大的 Java 生态中的一员,你是否也曾思考:当 Python 似乎成为 AI 的“官方语言”时,我们这些深耕 Spring 全家桶的开发者,该如何快速拥抱这个新时代?如今,Spring 团队亲自出手,为数百万 Java 开发者带来了官方答案——Spring AI。它将 AI 开发的复杂性进行封装,让集成 AI 能力变得像添加一个普通的 Starter 一样简单。

本文是 《Spring AI 进阶之路》 系列的第一篇,我们将从最基础的整合开始。你将看到,在 Spring Boot 的帮助下,集成一个强大的 AI 模型,真的只需三步!

话不多说,让我们直接开始动手实践。

前置准备

在开始三步集成前,先确保你已准备好以下基础环境:

  1. JDK 17+:Spring Boot 3 和 Spring AI 基于较新的 Java 版本,确保你的 JDK 版本不低于 17。
  2. Maven 或 Gradle:本文以 Maven 为例,它是我们管理项目依赖的得力助手。
  3. 一个顺手的 IDE:选择你最熟悉的 IDE 即可,本文以 IntelliJ IDEA 为例。
  4. 一个 LLM厂商的 API Key:本文以 DeepSeek 为例,价格便宜且无需科学上网,使用起来很方便。

第一步:添加依赖

让我们从创建项目开始。如果你使用 Spring Initializr 会更简单,但为了让大家理解每一步的细节,我们选择从零开始创建一个 Maven 项目。

首先,创建一个新的Maven空项目:
在这里插入图片描述

项目创建完成后,我们需要配置 pom.xml。整个依赖配置分为三个部分:

1.设置 Spring Boot 父项目

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.0</version>
</parent>

2.管理 Spring AI 的版本

通过 BOM 统一管理 Spring AI相关依赖的版本,避免版本冲突:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

3.添加具体依赖

<dependencies><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI OpenAI Starter --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency>
</dependencies>

你可能注意到,虽然我们前面提到本次使用的是 DeepSeek 的 API,但引入的却是 spring-ai-starter-model-openai。这是因为 DeepSeek 采用了与 OpenAI 完全兼容的 API 规范,我们可以直接复用 OpenAI 的客户端实现。这种设计让切换不同的 AI 服务商变得非常简单——只需要更换 API Key 和端点地址即可。

第二步:配置凭证

有了依赖,接下来需要告诉 Spring AI 如何连接到 AI 服务。在 src/main/resources 目录下创建 application.yml 文件(如果不存在的话),添加以下配置:

spring:ai:openai:api-key: {这里换成你自己的}base-url: https://api.deepseek.comchat:options:model: deepseek-chat

⚠️ 提醒:直接将 API Key 写在配置文件中仅适合本地开发和快速测试,但绝对不要在生产环境中这样做!在生产环境中,推荐使用环境变量来管理你的密钥。

第三步:编写代码调用

万事俱备,让我们开始编写代码来调用 AI 模型。

1.注入AI客户端

接下来,创建一个 REST 控制器来处理 AI 对话请求。Spring AI 的魅力在于,它将复杂的 AI 交互抽象成了简单的 Spring Bean:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/chat")
public class ChatController {private ChatClient chatClient;public ChatController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/test")public String completion(@RequestParam String message) {return chatClient.prompt().user(message).call().content();}  }

2.启动测试

启动应用,Spring Boot 的控制台会显示启动信息。待应用成功启动后,我们可以通过Apifox,向这个测试接口发送请求:
在这里插入图片描述

3.配置跨域

最终我们一定需要从前端应用调用这个接口,所以别忘了配置 CORS:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("/chat/*").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").allowCredentials(true).maxAge(3600);}
}

小结

至此,我们完成了 Spring AI 的基础集成。不过,如果你仔细观察测试结果,会发现当前的实现存在一个明显的体验问题:我们必须等待 AI 完全生成答案后才能看到结果。相比之下,那种逐字输出的效果就友好得多。用户能实时看到 AI 的"思考过程",体验更加流畅自然。

那么,如何在 Spring AI 中实现这种流式响应呢?这正是下一篇文章要探讨的内容。我们将介绍如何使用 SSE(Server-Sent Events)技术,让你的 AI 应用也能实现实时的打字机效果。

如果你对本文有任何疑问或建议,欢迎在评论区交流。下篇见!

http://www.xdnf.cn/news/1310509.html

相关文章:

  • 异构数据库兼容力测评:KingbaseES 与 MySQL 的语法・功能・性能全场景验证解析
  • linux设备驱动之字符设备驱动
  • Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍
  • 【LeetCode 热题 100】70. 爬楼梯——(解法二)自底向上
  • 在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
  • ISO27001 高阶架构 之 支持 -2
  • PHP域名授权系统网站源码/授权管理工单系统/精美UI/附教程
  • 广东省省考备考(第七十八天8.16)——资料分析、判断推理(强化训练)
  • Spring AMQP如何通过配置文件避免硬编码实现解耦
  • Linux -- 文件【下】
  • 深度解析和鲸社区热门项目:电商双 11 美妆数据分析的细节与价值
  • 41 C++ STL模板库10-容器3-list
  • 正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
  • docker-compose-mysql-定时备份数据库到其他服务器脚本
  • 【机器学习深度学习】OpenCompass:支持的开源评估数据集及使用差异
  • RemoteCtrl-初步的网络编程框架搭建
  • 安全审计-firewall防火墙
  • 算法训练营day52 图论③ 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
  • 基于Uni-app+vue3实现微信小程序地图固定中心点范围内拖拽选择位置功能(分步骤详解)
  • MySQL 配置性能优化赛技术文章
  • 基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
  • Flutter开发 网络请求
  • ESP32-S3_ES8311音频输出使用
  • 【嵌入式C语言】六
  • 【读论文】医疗AI大模型:百川开源Baichuan-M2
  • 第二十五天:构造函数/析构函数/拷贝构造
  • 开发一款多商户电商APP要多久?功能拆解与源码技术落地方案
  • 迭代器模式及优化
  • 模式匹配自动机全面理论分析
  • 【Web后端】Django、flask及其场景——以构建系统原型为例