轻松入门 Spring AI 综合案例
(2025-2026 比较实用且完整的入门组合示例)
以下是一个相对完整的、适合初学者到中级的 Spring AI 综合案例,包含目前最常用的几种核心能力:
功能清单:
1. 普通对话(ChatClient 最基础用法)
2. 流式回答(打字机效果)
3. 会话记忆(短期记忆)
4. 系统提示词工程
5. RAG 简单实现(基于内存向量存储)
6. 函数调用(Function Calling / Tools)
7. 结构化输出(JSON模式 + Bean转换)
完整综合案例代码(单文件版)
@RestController
@RequestMapping("/ai/demo")
@RequiredArgsConstructor
@Slf4j
public class AiDemoController {
private final ChatClient chatClient;
// 1. 最基础聊天
@GetMapping("/chat")
public String simpleChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
// 2. 流式回答(前端最推荐)
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
// 3. 带记忆 + 系统角色(最常用的组合写法)
private final ChatMemory chatMemory = new MessageWindowChatMemory(10); // 保留最近10条
@GetMapping("/memory")
public String chatWithMemory(
@RequestParam String sessionId,
@RequestParam String message) {
return chatClient.prompt()
.system("""
你是一位友善、幽默、说话很接地气的「资深Java架构师」
用中文回答,尽量使用 markdown 格式排版
喜欢用表情和生活化比喻解释复杂概念
""")
.user(message)
.advisors(
new MessageChatMemoryAdvisor(chatMemory, sessionId)
)
.call()
.content();
}
// 4. 简单 RAG (内存向量存储版 - 适合快速体验)
private final EmbeddingModel embeddingModel;
private final VectorStore vectorStore = new SimpleVectorStore(embeddingModel);
@PostConstruct
public void initKnowledgeBase() {
List<String> docs = List.of(
"Spring AI 是 Spring 家族推出的官方大模型集成框架,目标是让 Java 开发者用最熟悉的方式使用大语言模型。",
"目前支持 OpenAI、Azure、Ollama、HuggingFace、阿里通义、百度文心、智谱、Moonshot、DeepSeek 等多种模型。",
"ChatClient 是 Spring AI 提供的核心高层抽象,类似 RestTemplate 在 HTTP 时代的地位。",
"2025年下半年开始,Spring AI 正式进入 1.0 阶段,API 基本稳定。"
);
List<Document> documents = docs.stream()
.map(content -> new Document(content, Map.of("source", "spring-ai-doc")))
.toList();
vectorStore.add(documents);
}
@GetMapping("/rag")
public String simpleRag(@RequestParam String question) {
List<Document> similarDocs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(3)
);
String context = similarDocs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
return chatClient.prompt()
.system("你现在是一个基于给定上下文回答问题的专家助手。\n上下文:\n" + context)
.user(question)
.call()
.content();
}
// 5. 函数调用(工具调用) - 经典天气例子
@GetMapping("/tools")
public String weatherWithTools(@RequestParam String city) {
record WeatherInfo(
@JsonProperty("city") String city,
@JsonProperty("temperature") double temperature,
@JsonProperty("condition") String condition,
@JsonProperty("humidity") int humidity) {}
Function<WeatherRequest, WeatherInfo> fakeWeatherFunction = req ->
new WeatherInfo(req.city(), 24.5, "多云转晴", 65);
return chatClient.prompt()
.user("请告诉我" + city + "现在的天气怎么样?")
.functions(List.of(
FunctionCallbackContext.builder()
.function("get_weather", fakeWeatherFunction)
.description("获取指定城市的当前天气信息")
.responseConverter(new BeanOutputConverter<>(WeatherInfo.class))
.build()
))
.call()
.content();
}
// 6. 结构化输出(最推荐的写法之一)
public record TravelPlan(
@JsonProperty("destination") String destination,
@JsonProperty("days") int days,
@JsonProperty("budget_level") String budgetLevel, // low/medium/high
@JsonProperty("highlights") List<String> highlights,
@JsonProperty("tips") List<String> tips
) {}
@GetMapping("/structured")
public TravelPlan structuredTravelPlan(
@RequestParam String destination,
@RequestParam(defaultValue = "3") int days,
@RequestParam(defaultValue = "medium") String budget) {
BeanOutputConverter<TravelPlan> converter =
new BeanOutputConverter<>(TravelPlan.class);
String jsonSchema = converter.jsonSchema;
String prompt = """
你是一位专业的旅行规划师。
请为用户规划一份 %d 天的%s预算%s旅行计划。
请严格按照以下 JSON Schema 输出,不要输出任何多余的文字:
%s
目的地:%s
""".formatted(days, budget, destination, jsonSchema, destination);
String rawJson = chatClient.prompt(prompt).call().content();
return converter.convert(rawJson);
}
}
推荐学习路径(难度递增)
| 阶段 | 重点掌握内容 | 建议耗时 | 推荐练习题目 |
|---|---|---|---|
| 第1天 | ChatClient基本用法 + 流式 + 系统提示词 | 2~4小时 | 写一个AI聊天室(带历史记录) |
| 第2天 | 会话记忆 + PromptTemplate | 3~5小时 | 实现多角色对话(客服/面试官/女友等) |
| 第3天 | 简单RAG(内存/文件/PGVector) | 6~10小时 | 做一个个人简历/知识库问答机器人 |
| 第4~5天 | Function Calling + 结构化输出 | 8~15小时 | 实现:天气+汇率+查快递+生成周报 |
| 第6天+ | 多Agent协作 / ReAct / 工具链编排 | 持续学习中 | 写一个「程序员小助手」Agent(写代码+查资料+写文档) |
一句话总结当前(2026年初)最舒服的入门技术栈建议:
Spring Boot 3.3.x + Spring AI 1.0.x +
硅基流动/DeepSeek官方 OpenAI兼容接口 +
deepseek-r1:free / deepseek-v3:free(推理最强) +
ChatClient流式 + Memory + 简单RAG + Function Calling + 结构化输出
祝你玩得开心,早日做出属于自己的AI小产品~ 🚀