汤锅
38.89M · 2026-04-02
[ s01 ] > s02 > s03 > s04 > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > s16 > s17 > s18
在正式学习之前,我们需要先弄清楚几个核心概念:
大语言模型(LLM) 是一种经过海量文本训练的人工智能模型,它能够:
就像一个读遍了全世界图书馆的"超级学霸",你问它什么问题,它都能给你相关的回答。
AI 模型 就是这个"超级学霸",而 API 就像是让你能够联系到这个学霸的电话号码。
Spring AI 是 Spring 官方在 2024 年推出的 AI 框架,它的核心思想就是:让 Java 开发者像使用 Spring Boot 一样方便地调用 AI 模型。
以前我们要调用某个 AI 模型,需要:
Spring AI 就像是一个"万能转接头",它把所有主流 AI 模型的 API 都统一了起来,你只需要学会一套接口,就能调用 OpenAI、阿里云、Meta、Ollama 等各种模型。
Spring AI Alibaba 当然包含 Spring AI 在阿里云上的模型接入能力,但在 1.1.2.x 版本里,它已经不再只是“阿里云实现版”这么简单。
更准确的理解是:
ChatModel、ChatClient、Prompt、Embedding、VectorStore、MCP 等基础抽象ReactAgent、多智能体编排、上下文工程、Human In The Loop 等 Agent 能力简单理解:
阿里云百炼平台提供了很多免费/付费的模型能力,比如:
本章是我们学习 Spring AI Alibaba 的起点,主要目标是:
在 Spring AI 中,ChatModel 是一个核心接口,它代表了与 AI 大模型的对话能力。
大白话解释:把 ChatModel 想象成一个"智能对话机器人",你给它发消息,它回复你答案。
// ChatModel 就是我们调用 AI 的入口
@Resource
private ChatModel chatModel;
ChatModel 的主要方法:
call(String message):发送一条消息,获取完整回复stream(String message):以流式方式获取回复(类似打字效果)ChatModel 是 Spring AI 定义的统一接口,不管底层用哪个厂商的模型服务,Controller 中注入的都是同一个类型:
@Resource
private ChatModel chatModel;
不同的 AI 厂商各自提供自己的 Starter 依赖 和 自动配置类 来实现这个接口:
| Starter 依赖 | 自动配置类 | 所需配置项 |
|---|---|---|
spring-ai-alibaba-starter-dashscope | DashScopeChatAutoConfiguration | spring.ai.dashscope.api-key |
spring-ai-starter-model-openai | OpenAiChatAutoConfiguration | spring.ai.openai.api-key |
工作原理:Spring Boot 启动时,自动配置类会检查 classpath 上有没有对应的依赖,如果有,就自动创建一个 ChatModel 的实现类(Bean),注入到 IoC 容器中。Controller 通过 @Resource 注入时,拿到的就是这个 Bean。
实际应用——如何切换底层模型服务?
场景:你不想用阿里云百炼,想换成 OpenAI 兼容的代理服务,只需要两步:
加依赖:在 pom.xml 中加入 spring-ai-starter-model-openai
排除冲突:在启动类上排除 DashScope 自动配置,防止两个自动配置打架:
@SpringBootApplication(exclude = {
DashScopeChatAutoConfiguration.class
})
改配置:把 spring.ai.dashscope.api-key 改成 spring.ai.openai.api-key,并配置 base-url 和 model
很多初学者在切换到 OpenAI 之后会产生一个错觉:
其实不是 OpenAI 不用,而是 OpenAI 也在用 configuration,只不过这个 configuration 不是你自己写的,而是 Starter 内置好的自动配置类。
换句话说,Spring 项目里 Bean 的来源通常有两种:
@Configuration + @Bean例如,自己手写配置类时通常是这样:
@Configuration
public class MyConfig {
@Bean
public ChatModel chatModel() {
return ...;
}
}
而使用 OpenAI Starter 时,你虽然没有写上面的代码,但 Starter 内部其实已经帮你准备了类似的自动配置类,例如:
OpenAiAutoConfigurationOpenAiChatAutoConfiguration它们本质上也是 @Configuration 类,只是被打包在依赖 jar 中,由框架作者维护,而不是由你亲自编写。
因此,OpenAI 不是“不需要配置类”,而是“你不需要自己写配置类” 。
| 方式 | 谁来写 | Bean 怎么来 | 适用场景 |
|---|---|---|---|
手写 @Configuration | 开发者自己 | 自己通过 @Bean 创建 | 需要高度定制时 |
| Starter 自动配置 | 框架/Starter 作者 | 启动时按条件自动创建 | 标准接入场景 |
比如你之前写过一个 SaaLLMConfig,那就是手写配置;而现在 OpenAI 能直接注入 ChatModel,走的就是 Starter 自动配置。
当你引入下面的依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
并在 application.yml 中配置:
spring:
ai:
openai:
api-key: your-key
base-url:
Spring Boot 启动时大致会经历这样的过程:
spring.ai.openai.* 配置项OpenAiChatModel@Resource private ChatModel chatModel; 注入成功所以从底层原理上看,OpenAI 和 DashScope 是一样的,都是:
区别只在于:
DashScopeChatAutoConfigurationOpenAiChatAutoConfigurationSaaLLMConfig 后来可以删除?因为在已经引入 OpenAI Starter 的前提下,ChatModel 所需的 Bean 已经由自动配置创建好了,项目并不需要你再手动写一个配置类去造 Bean。
也就是说:
@Configuration这正是 Spring Boot 提倡的理念:约定优于配置。
这也是为什么 Spring AI 项目看起来“只加依赖、写配置、直接注入就能用”——真正复杂的 Bean 创建过程,已经被自动配置封装起来了。
ChatClient 是构建在 ChatModel 之上的高级 API,它提供了更加便捷的链式调用写法。
大白话解释:如果说 ChatModel 是"功能手机",那 ChatClient 就是"智能手机"——它不仅能打电话,还自带了通讯录、短信、应用商店等丰富功能。
// ChatClient 的典型用法:链式调用
@Resource
private ChatClient chatClient;
public String chat(String msg)
{
// 链式调用,一气呵成
String result = chatClient.prompt()
.system("你是一个专业的Java助手") // 设置系统提示词
.user(msg) // 设置用户消息
.call() // 调用 AI
.content(); // 获取回复内容
return result;
}
ChatClient 的主要特点:
.prompt().system().user().call().content() 这样的方式,语义清晰.system("你是一个%s工程师", "Java").entity(MyClass.class) 直接映射 AI 返回为 Java 对象Advisor 可以实现上下文记忆功能阿里云百炼平台是阿里云提供的一站式大模型服务平台,你可以把它理解为"AI 应用商店",里面有很多现成的 AI 能力:
| 模型类型 | 模型名称 | 主要用途 |
|---|---|---|
| 对话模型 | qwen-plus, qwen-turbo | 日常问答、写作 |
| 对话模型 | deepseek-v3 | 开源高性能模型 |
| 文本转图像 | wanx2.1-t2i-turbo | 文字生成图片 |
| 文本转语音 | cosyvoice-v2 | 文字生成语音 |
| 向量嵌入 | text-embedding-v3 | 文本向量化 |
为什么要用阿里云?
SAA-01HelloWorld/
├── pom.xml # Maven 配置文件
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/atguigu/study/
│ │ │ ├── Saa01HelloWorldApplication.java # 启动类
│ │ │ ├── config/
│ │ │ │ └── SaaLLMConfig.java # LLM 配置类
│ │ │ └── controller/
│ │ │ └── ChatHelloController.java # 控制器
│ │ └── resources/
│ │ └── application.yml # 配置文件
│ └── test/
│ └── java/.../Saa01HelloWorldApplicationTests.java
<properties>
<java.version>17</java.version>
<spring-ai.version>1.1.2</spring-ai.version>
<spring-ai-alibaba.version>1.1.2.2</spring-ai-alibaba.version>
<spring-ai-alibaba-extensions.version>1.1.2.2</spring-ai-alibaba-extensions.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${spring-ai-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-extensions-bom</artifactId>
<version>${spring-ai-alibaba-extensions.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
</dependencies>
这里有个大坑提醒:
在 1.1.2.x 里,更推荐直接用 BOM 统一管理版本,而不是给每个 starter 单独写版本号。
本项目SAA-01HelloWorld只是父工程下面的一个子工程,在父工程的 pom.xml 中有一个重要的配置:dependencyManagement。这里我们重点讲解什么是 BOM 以及它在 Spring AI Alibaba 项目中的作用。
Pasted image 20260326161132.png
BOM(Bill of Materials,物料清单) 是 Maven 中用于统一管理依赖版本的机制。你可以把它理解成"一份购物清单"——
<!-- 父工程 pom.xml 中的 dependencyManagement 配置 -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot BOM -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring AI BOM -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring AI Alibaba BOM -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>${SpringAIAlibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
| 配置项 | 说明 |
|---|---|
groupId | 组织的标识,类似 Java 包名 |
artifactId | 库的唯一标识,类似类名 |
version | 版本号,这里使用变量占位 |
type=pom | 表示引入的是一个 POM 类型的依赖(即 BOM 本身) |
scope=import | 表示这是"导入"类型的依赖,会将 BOM 中的依赖"合并"进来 |
当你在一个子项目(比如 SAA-01HelloWorld)的 pom.xml 中写下这样的依赖时:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
Maven 会自动在 BOM 中查找这个 artifactId 对应的版本,然后使用 BOM 中定义的版本。BOM 只负责统一版本,不负责真正把依赖放进项目;真正引入依赖,仍然要写在 <dependencies> 中。
groupId 和 artifactId,不需要写 version不用 BOM(自己指定版本) :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.1.2.2</version>
</dependency>
用 BOM(自动获取版本) :
<!-- 子项目中只需要这样写 -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<!-- 版本号自动从父工程的 BOM 中获取 -->
| BOM | 作用 |
|---|---|
spring-boot-dependencies | 管理 Spring Boot 全家桶依赖 |
spring-ai-bom | 管理 Spring AI 核心依赖 |
spring-ai-alibaba-bom | 管理阿里云 AI 实现依赖 |
这就是为什么我们的项目可以稳定运行的原因——三个 BOM 各司其职,确保了所有依赖版本的兼容性。
server:
port: 8001 # 服务器端口,我们改成了8001避免冲突
spring:
application:
name: SAA-01HelloWorld
ai:
dashscope:
api-key: ${AI_DASHSCOPE_API_KEY:}
# `AI_DASHSCOPE_API_KEY` 是环境变量,我们可以在 IDEA 里配置
# 配置方式:Run/Debug Configurations -> Environment Variables
# 添加: AI_DASHSCOPE_API_KEY=你的阿里云APIKey
关于 API Key 获取:
这才是我们的重头戏!
package com.atguigu.study.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.model.ChatModel; // 对话模型接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 这是一个 REST 风格的控制器
* 类似于 Spring MVC 的 @Controller 但自动返回 JSON
*/
@RestController
public class ChatHelloController
{
// @Resource 是 JDK 自带的依赖注入注解
// 相当于 Spring 的 @Autowired
// 这里注入的是阿里云百炼平台的对话模型实现
@Resource
private ChatModel chatModel;
/**
* 普通调用方式:发送消息,获取完整回复
*
* 接口地址:你是谁
*
* @param msg 用户发送的消息
* @return AI 的回复
*/
@GetMapping(value = "/hello/dochat")
public String doChat(@RequestParam(name = "msg", defaultValue = "你是谁") String msg)
{
// 调用大模型的 call 方法
// 参数:用户的消息
// 返回:AI 的完整回复(字符串形式)
String result = chatModel.call(msg);
return result;
}
/**
* 流式调用方式:类似打字效果,逐字返回
*
* 接口地址:介绍下Java
*
* @param msg 用户发送的消息
* @return Flux<String> 流式返回的字符串
*/
@GetMapping(value = "/hello/streamchat")
public Flux<String> stream(@RequestParam(name = "msg", defaultValue = "你是谁") String msg)
{
// stream 方法返回一个 Flux(响应式流)
// 类似于 RxJava 或 Java Stream
// 它会一个字一个字地把答案返回给你
// 实际使用中,通常配合 SSE(Server-Sent Events)实现实时显示
return chatModel.stream(msg);
}
}
什么是 Flux?
Flux 来自 Project Reactor(Spring WebFlux 也在用),是一种响应式编程的体现。
大白话解释:
return "你好" → 一次性返回完整内容return fluxXxx() → 像玩水管游戏,水流一点一点流出为什么需要流式输出?
因为 AI 生成内容需要时间,如果等它全部生成完再返回,用户要等待很久。
流式输出可以让AI边生成边返回给用户,体验就像"打字机"一样,会让用户感觉:
Saa01HelloWorldApplicationStarted Saa01HelloWorldApplication in x.xxx seconds 表示启动成功# 测试普通对话
GET 用Java帮我写一个冒泡排序
# 测试流式对话
GET 今天天气怎么样
| 概念 | 说明 |
|---|---|
| Spring AI | Spring 官方 AI 框架,统一各厂商 AI 调用 |
| Spring AI Alibaba | 阿里云百炼平台的 Spring AI 实现 |
| ChatModel | AI 对话模型的核心接口 |
| DashScope | 模型服务灵积(现在已经变成阿里云百炼平台) |
| API Key | 调用百炼服务的凭证 |
| Flux | 响应式流,用于流式输出 |
本章重点:
下章剧透(s02):
很多初学者会疑惑:既然有了 Spring AI,为什么还需要 Spring AI Alibaba?
Spring AI 是 Spring 官方提供的 AI 框架,它定义了一套标准的接口和规范,让开发者可以用统一的方式调用不同的 AI _provider(如 OpenAI、Azure OpenAI、HuggingFace 等)。但它本身并不直接提供 AI _provider 的连接实现。
Spring AI Alibaba 则是 Alibaba 团队基于 Spring AI 的接口规范,针对阿里云百炼平台做的具体实现。它提供了:
| 特性 | Spring AI | Spring AI Alibaba |
|---|---|---|
| 定位 | AI 框架规范 + 通用实现 | 阿里云特化实现 |
| 支持模型 | OpenAI、HuggingFace等 | 通义千问、百炼平台服务 |
| 能力扩展 | 基础 AI 能力 | RAG、Agent、MCP等企业级能力 |
| 开发团队 | Spring 官方 | Alibaba 团队 |
| 维护更新 | 通用迭代 | 与阿里云服务同步 |
简单理解:Spring AI 是"规矩"(接口规范),Spring AI Alibaba 是"按规矩办事的具体人"(阿里云实现) 。
不过好消息是,Spring AI Alibaba 完全兼容 Spring AI 的接口!你学习完本课程后,会发现换到其他 AI _provider 非常容易。