
Spring AI 快速入门
什么是 Spring AI
就使用国内阿里巴巴 Spring AI 来讲解
以下内容引用自 Spring AI Alibaba
Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。从本质上讲,Spring AI 解决了 AI 集成的基本挑战。
Spring AI Alibaba 作为开发 AI 应用程序的基础框架,定义了以下抽象概念与 API,并提供了 API 与通义系列模型的适配。
- 开发复杂 AI 应用的高阶抽象 Fluent API — ChatClient
- 提供多种大模型服务对接能力,包括主流开源与阿里云通义大模型服务(百炼)等
- 支持的模型类型包括聊天、文生图、音频转录、文生语音等
- 支持同步和流式 API,在保持应用层 API 不变的情况下支持灵活切换底层模型服务,支持特定模型的定制化能力(参数传递)
- 支持 Structured Output,即将 AI 模型输出映射到 POJOs
- 支持矢量数据库存储与检索
- 支持函数调用 Function Calling
- 支持构建 AI Agent 所需要的工具调用和对话内存记忆能力
- 支持 RAG 开发模式,包括离线文档处理如 DocumentReader、Splitter、Embedding、VectorStore 等,支持 Retrieve 检索
以上框架功能可实现常见 AI 应用的快速开发,例如 “通过文档进行问答” 或 “通过文档进行聊天” 等。
如何使用 Spring AI
开发环境需求
- Java 17
- SpringBoot 3.x
- Maven 3.6.3 +
配置环境
从阿里云百炼平台获取一个 API-KEY,并设置 AI_DASHSCOPE_API_KEY
环境变量。
在 LInux 中,使用以下命令
export AI_DASHSCOPE_API_KEY=你的API-KEY
在 Windows 中,可安装如下步骤进行添加环境变量。
方法一:
- 使用
Win + i
打开系统设置 - 搜索>环境变量
- 点击>编辑系统环境变量
- 点击>环境变量
- 在系统变量下新建
- 输入对应的内容并进行确定即可
方法二:
- 打开 IDEA
- 选择 SpringBoot 启动类
- 点击修改选项
- 勾选环境变量
- 在环境变量框进行输入 API-KEY
- 确定,当前项目每次运行 SpringBoot 时,就会带上这个环境变量了
配置 Maven 仓库
导入 SpringAI 依赖到 pom.xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M5.1</version>
</dependency>
由于 Spring AI 相关依赖包还没有发布到中央仓库,还需要在项目中 pom.xml 依赖中加入如下仓库配置。
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
使用示例
本次使用示例就以对接 DashScope 为例
前置知识
- Chat Client
- Chat Model
- Spring AI Alibaba 快速开始
- 本次代码示例仓库,在spring-ai-demo-simple模块下,可执行拉取进行操作
Spring AI Alibaba 接入
- 配置 application.xml
spring:
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY}
chat:
model: qwen-omni-turbo-latest # 设置你的AI模型
- 开始编写 Controller 类
package top.kangyaocoding.tech.controller;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
/**
* 描述: AI 聊天
*
* @author K·Herbert
* @since 2025-04-13 20:05
*/
@Slf4j
@RestController
@RequestMapping("/api/v1/ai")
@CrossOrigin(origins = "*")
public class ChatController {
private static final String DEFAULT_PROMPT = "你好,你是谁?";
private final ChatModel chatModel;
public ChatController(ChatModel chatModel) {
this.chatModel = chatModel;
}
/**
* 简单调用。一次性输出全部结果
*
* @return String types.
*/
@GetMapping("/simple/chat")
public String simpleChat(HttpServletResponse response) {
// 避免返回乱码
response.setCharacterEncoding("UTF-8");
return chatModel.call(
new Prompt(DEFAULT_PROMPT)
).getResult().getOutput().getContent();
}
/**
* Stream 流式调用。输出的结果实现打字机效果。
* 注意要配置 MediaType.TEXT_EVENT_STREAM_VALUE,
* 这样配置说明定义了一个请求的 Header,
* 并设置为 Content-Type:text/event-stream;charset=UTF-8,
* 这样前端才能识别为流式请求。
*
* @return Flux<String> types.
*/
@PostMapping(name = "/stream/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(HttpServletResponse response) {
// 避免返回乱码
response.setCharacterEncoding("UTF-8");
Flux<ChatResponse> stream = chatModel.stream(
new Prompt(
DEFAULT_PROMPT
)
);
return stream.map(result -> result.getResult().getOutput().getContent());
}
}
接口测试
我们使用 Apifox 来进行测试一下
- 发送一次返回全部结果的聊天接口,可以看到正常的返回了我们想要的结果。
- 发送流式请求的聊天接口,可以看到数据是按照一块一块进行接收的。
总结:开启你的 Spring AI 之旅
我们已经学习了 Spring AI Alibaba 框架的基础应用。从环境配置到API调用,从同步响应到流式处理,现在我们已经掌握了使用 Spring AI 构建基础 AI 应用对话的能力。
但这仅仅是 Spring AI 的冰山一角!在接下来的系列文章中,我们将深入学习更多的高级特性:
🧱更多参数配置 - 封装更多的消息配置项
🔥 结构化输出 - 如何将AI响应自动映射到POJO对象
🚀 函数调用 - 实现AI与业务逻辑的无缝集成
🧠 RAG开发模式 - 构建基于文档的智能问答系统
🤖 AI Agent开发 - 打造具备记忆和工具调用能力的智能体
想了解如何用 Spring AI 实现更复杂的 AI 应用? 敬请期待下一期,我将带你解锁 AI 集成的无限可能!现在就开始你的 Spring AI 探索之旅吧,在评论区留下你的学习心得或问题,我们将选取最有价值的反馈在下一期详细解答。
小提示:关注专栏不迷路,点击订阅获取最新文章通知
如果需要获取最新的文章,欢迎访问我的个人博客 Photon Yao - Notes 我经常在这里更新编程技巧、项目教程和最新的技术动态。无论你是初学者还是资深开发者,都能找到有价值的内容。快来探索,提升你的编程技能吧!