一、框架概述
1.1 什么是 Spring AI Alibaba
Spring AI Alibaba 是阿里云基于 Spring AI 构建的企业级 AI 应用开发框架,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践。它将阿里云强大的 AI 能力与 Spring 生态完美融合,让 Java 开发者能够以熟悉的 Spring 方式快速构建智能应用。
核心定位:
- 基于 Spring Boot 3.x 和 Spring AI 框架
- 深度集成阿里云百炼平台(Bailian)和灵积平台(DashScope)
- 提供高层次的 AI API 抽象与云原生基础设施集成方案
- 支持企业级 AI 应用的快速开发和部署
1.2 为什么选择 Spring AI Alibaba
技术优势
1. Spring 生态无缝集成
- 遵循 Spring Boot 的开发习惯和最佳实践
- 支持 Spring Boot Starter 自动配置
- 兼容 Spring Cloud 微服务架构
- 可与 Spring Cloud Alibaba 生态无缝协作
2. 企业级能力
- 生产环境可用的稳定性和性能
- 完善的可观测性(集成 ARMS 监控)
- 多租户和安全管控
- 高并发场景优化
3. 丰富的 AI 能力
- 支持通义千问系列大模型(Qwen)
- 文本生成、对话、文生图、文生语音等多模态能力
- RAG(检索增强生成)能力
- 向量数据库集成
- Function Calling(函数调用)能力
4. 模块化架构设计
- 灵活的模块组合,按需引入
- 解耦的设计,易于扩展和定制
- 支持多种部署模式
业务价值
降低开发门槛
- Java 开发者无需深入学习复杂的 AI 技术
- 统一的 API 抽象,屏蔽底层模型差异
- 丰富的示例和文档支持
加速应用交付
- 开箱即用的组件和能力
- 最佳实践的沉淀
- 快速构建 MVP(最小可行产品)
保障生产质量
- 阿里云多年的 AI 服务经验
- 企业级的稳定性和可靠性
- 完善的监控和运维支持
二、核心功能详解
2.1 对话生成(Chat)
对话生成是 Spring AI Alibaba 最核心的功能,支持与大语言模型进行自然语言交互。
核心能力
1. 简单对话
java
@RestController
public class ChatController {
@Autowired
private ChatClient chatClient;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
功能亮点:
- 一行代码即可实现与 AI 对话
- ChatClient 自动处理请求封装和响应解析
- 支持同步和异步调用
2. 流式输出(Streaming)
java
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
功能亮点:
- 实时返回生成内容,提升用户体验
- 基于 Reactor 响应式编程模型
- 支持 Server-Sent Events (SSE) 协议
- 适合长文本生成场景
3. 上下文对话(Context Management)
java
@PostMapping("/chat/context")
public String chatWithContext(@RequestBody ChatRequest request) {
List<Message> messages = new ArrayList<>();
messages.add(new UserMessage("你好,我是张三"));
messages.add(new AssistantMessage("你好张三,很高兴认识你!"));
messages.add(new UserMessage("我刚才说的名字是什么?"));
return chatClient.prompt()
.messages(messages)
.call()
.content();
}
功能亮点:
- 维护多轮对话的上下文
- 支持角色区分(用户、助手、系统)
- 灵活的消息历史管理
4. 提示词模板(Prompt Template)
java
@Service
public class ChatService {
@Autowired
private ChatClient chatClient;
public String generateProductDescription(String productName, String features) {
String promptTemplate = """
请为以下产品撰写一份吸引人的商品描述:
产品名称:{productName}
产品特点:{features}
要求:
1. 突出产品优势
2. 语言生动活泼
3. 字数控制在200字以内
""";
return chatClient.prompt()
.user(u -> u.text(promptTemplate)
.param("productName", productName)
.param("features", features))
.call()
.content();
}
}
功能亮点:
- 参数化提示词,提高复用性
- 支持复杂的提示词工程
- 内置模板变量替换
2.2 Function Calling(函数调用)
Function Calling 是实现 AI 与外部系统交互的关键能力,让 AI 可以调用自定义函数获取实时数据或执行操作。
工作原理
- 开发者定义可供 AI 调用的函数
- AI 根据用户需求判断是否需要调用函数
- 框架自动执行函数并返回结果
- AI 基于函数返回值生成最终回复
实战示例
场景:天气查询助手
java
@Configuration
public class FunctionConfig {
// 定义天气查询函数
@Bean
@Description("获取指定城市的天气信息")
public Function<WeatherRequest, WeatherResponse> getWeather() {
return request -> {
// 调用天气API获取实际数据
return weatherService.getWeatherByCity(request.city());
};
}
}
// 请求对象
record WeatherRequest(
@JsonProperty(required = true)
@JsonPropertyDescription("城市名称,例如:北京、上海")
String city
) {}
// 响应对象
record WeatherResponse(
String city,
String temperature,
String weather,
String humidity
) {}
@RestController
public class WeatherChatController {
@Autowired
private ChatClient chatClient;
@GetMapping("/weather/chat")
public String weatherChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.functions("getWeather") // 注册函数
.call()
.content();
}
}
使用效果:
用户:北京今天天气怎么样?
AI:(内部调用 getWeather 函数)
北京今天晴,温度25°C,湿度45%,天气不错,适合外出活动。
用户:明天上海需要带伞吗?
AI:(内部调用 getWeather 函数)
明天上海有小雨,建议您带上雨伞。
功能亮点:
- 自动识别用户意图并调用对应函数
- 支持多个函数注册,AI 智能选择
- 类型安全的参数传递
- 函数执行过程对用户透明
2.3 RAG(检索增强生成)
RAG 技术通过结合外部知识库,让 AI 能够基于专有数据生成准确的回答。
核心组件
1. 文档加载(Document Loaders)
java
@Service
public class DocumentService {
@Autowired
private DocumentReader documentReader;
public List<Document> loadDocuments(String filePath) {
// 支持多种格式:PDF, Word, TXT, Markdown
return documentReader.read(filePath);
}
}
支持格式:
- PDF 文档
- Word 文档
- 文本文件
- Markdown 文件
- JSON 数据
- 网页内容
2. 文档分割(Text Splitter)
java
@Configuration
public class RagConfig {
@Bean
public TextSplitter textSplitter() {
return new TokenTextSplitter(
500, // 每个分块的最大 token 数
100 // 分块之间的重叠 token 数
);
}
}
分割策略:
- 按 Token 数量分割
- 按字符数分割
- 按段落分割
- 保持语义完整性
3. 向量化(Embeddings)
java
@Service
public class EmbeddingService {
@Autowired
private EmbeddingClient embeddingClient;
public List<Double> embed(String text) {
return embeddingClient.embed(text);
}
}
功能亮点:
- 使用通义千问的 Embedding 模型
- 高质量的向量表示
- 支持批量向量化处理
4. 向量存储(Vector Store)
java
@Configuration
public class VectorStoreConfig {
@Bean
public VectorStore vectorStore(
EmbeddingClient embeddingClient,
DataSource dataSource) {
return new PgVectorStore(dataSource, embeddingClient);
}
}
支持的向量数据库:
- PostgreSQL + pgvector
- Redis
- Elasticsearch
- Milvus
- 阿里云向量检索服务
5. 完整 RAG 流程
java
@Service
public class KnowledgeBaseService {
@Autowired
private VectorStore vectorStore;
@Autowired
private ChatClient chatClient;
// 知识入库
public void indexDocuments(List<Document> documents) {
// 1. 分割文档
List<Document> chunks = textSplitter.split(documents);
// 2. 向量化并存储
vectorStore.add(chunks);
}
// 基于知识库的问答
public String answerQuestion(String question) {
// 1. 检索相关文档
List<Document> relevantDocs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(3)
);
// 2. 构建上下文
String context = relevantDocs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
// 3. 生成回答
String prompt = String.format("""
基于以下知识库内容回答问题:
知识库内容:
%s
问题:%s
请基于知识库内容给出准确的回答。如果知识库中没有相关信息,请说明。
""", context, question);
return chatClient.prompt()
.user(prompt)
.call()
.content();
}
}
应用场景:
- 企业内部知识库问答
- 客户服务智能助手
- 文档智能检索
- 法律法规查询
- 技术文档助手
2.4 多模态能力
1. 文生图(Text-to-Image)
java
@Service
public class ImageGenerationService {
@Autowired
private ImageClient imageClient;
public String generateImage(String prompt) {
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse response = imageClient.call(imagePrompt);
// 返回图片 URL
return response.getResult().getOutput().getUrl();
}
}
使用示例:
java
@RestController
public class ImageController {
@Autowired
private ImageGenerationService imageService;
@PostMapping("/image/generate")
public String generate(@RequestParam String description) {
// 描述:一只可爱的橙色猫咪坐在窗台上看雨
return imageService.generateImage(description);
}
}
功能特性:
- 支持通义万相模型
- 多种图片尺寸和风格
- 高质量图片生成
- 支持艺术风格定制
2. 文生语音(Text-to-Speech)
java
@Service
public class SpeechGenerationService {
@Autowired
private SpeechClient speechClient;
public byte[] generateSpeech(String text, String voice) {
SpeechPrompt prompt = new SpeechPrompt(text, voice);
SpeechResponse response = speechClient.call(prompt);
return response.getResult().getOutput();
}
}
音色选择:
- 多种音色(男声、女声、童声等)
- 可调节语速和音调
- 支持多语言
- 高自然度语音合成
3. 图像理解(Image Understanding)
java
@Service
public class ImageUnderstandingService {
@Autowired
private ChatClient chatClient;
public String analyzeImage(String imageUrl, String question) {
return chatClient.prompt()
.user(u -> u.text(question)
.media(MimeTypeUtils.IMAGE_PNG, imageUrl))
.call()
.content();
}
}
应用场景:
- 图片内容描述
- 场景识别
- OCR 文字识别
- 商品识别
2.5 结构化输出(Output Parser)
将 AI 的自然语言输出转换为结构化数据,便于程序处理。
BeanOutputParser 示例
java
// 定义输出结构
public class MovieInfo {
private String title;
private String director;
private List<String> actors;
private String genre;
private Integer year;
// getters and setters
}
@Service
public class MovieExtractionService {
@Autowired
private ChatClient chatClient;
public MovieInfo extractMovieInfo(String text) {
BeanOutputParser<MovieInfo> parser =
new BeanOutputParser<>(MovieInfo.class);
String prompt = String.format("""
从以下文本中提取电影信息:
%s
%s
""", text, parser.getFormat());
String response = chatClient.prompt()
.user(prompt)
.call()
.content();
return parser.parse(response);
}
}
使用场景:
- 信息抽取
- 数据结构化
- 表单自动填充
- 内容分类标注
2.6 Graph 工作流编排
Graph 是 Spring AI Alibaba 的高级特性,支持构建复杂的多步骤 AI 工作流。
核心概念
1. 节点(Node)
- LLM 节点:调用大模型
- Router 节点:条件路由
- Tool 节点:执行工具调用
- Lambda 节点:自定义逻辑
2. 边(Edge)
- 定义节点间的流转关系
- 支持条件分支
- 支持并行执行
示例:客服工作流
java
@Configuration
public class CustomerServiceGraphConfig {
@Bean
public Graph customerServiceGraph(ChatClient chatClient) {
return Graph.builder()
// 意图识别节点
.addNode("intent-recognition", (state) -> {
String userMessage = state.get("message");
String intent = chatClient.prompt()
.user("识别用户意图:" + userMessage)
.call()
.content();
state.put("intent", intent);
return state;
})
// 路由节点
.addRouter("router", (state) -> {
String intent = state.get("intent");
return switch (intent) {
case "退款咨询" -> "refund-handler";
case "产品咨询" -> "product-handler";
default -> "general-handler";
};
})
// 退款处理节点
.addNode("refund-handler", (state) -> {
// 处理退款逻辑
return state;
})
// 产品咨询节点
.addNode("product-handler", (state) -> {
// 查询产品信息
return state;
})
// 通用处理节点
.addNode("general-handler", (state) -> {
// 通用回复
return state;
})
// 定义流程
.addEdge("__start__", "intent-recognition")
.addEdge("intent-recognition", "router")
.build();
}
}
应用价值:
- 可视化 AI 流程
- 复杂业务逻辑编排
- 多模型协同
- 提升可维护性
三、技术亮点
3.1 统一抽象层
Spring AI Alibaba 提供了统一的 API 抽象,使得切换不同的 AI 模型变得简单。
java
// 统一的接口,底层可以是任何大模型
public interface ChatClient {
ChatResponse call(Prompt prompt);
Flux<ChatResponse> stream(Prompt prompt);
}
优势:
- 降低供应商锁定风险
- 便于测试和开发
- 快速切换模型版本
3.2 Spring Boot Starter 模式
遵循 Spring Boot 的自动配置理念,极简依赖管理。
xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>
配置文件:
yaml
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
chat:
options:
model: qwen-max
temperature: 0.7
优势:
- 零代码配置即可使用
- 约定优于配置
- 快速启动开发
3.3 响应式编程支持
基于 Project Reactor,天然支持异步非阻塞。
java
// 响应式流处理
Flux<String> responseStream = chatClient.prompt()
.user(message)
.stream()
.content()
.doOnNext(chunk -> log.info("Received: {}", chunk))
.doOnComplete(() -> log.info("Stream completed"));
优势:
- 高并发性能
- 流式处理大数据
- 优雅的异步编程模型
3.4 企业级可观测性
深度集成阿里云 ARMS,提供全链路监控。
监控指标:
- 请求耗时
- Token 消耗
- 错误率
- QPS 统计
- 模型调用链路
配置示例:
yaml
spring:
ai:
alibaba:
observability:
enabled: true
tracing: true
metrics: true
3.5 安全与合规
API Key 管理:
- 支持环境变量注入
- 配置中心集成
- 密钥轮换机制
内��安全:
- 自动内容审核
- 敏感信息过滤
- 合规性检查
四、快速开始
4.1 环境要求
- JDK 17 或更高版本
- Spring Boot 3.x
- Maven 或 Gradle 构建工具
4.2 创建第一个应用
Step 1: 添加依赖
xml
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
</dependencies>
Step 2: 配置 API Key
yaml
spring:
ai:
dashscope:
api-key: sk-your-api-key-here
Step 3: 编写代码
java
@SpringBootApplication
public class AiApplication {
public static void main(String[] args) {
SpringApplication.run(AiApplication.class, args);
}
}
@RestController
public class ChatController {
@Autowired
private ChatClient chatClient;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
Step 4: 运行测试
bash
curl "http://localhost:8080/chat?message=你好"
响应:
你好!我是通义千问,很高兴为您服务。有什么我可以帮助您的吗?