

1.大模型应用开发





2.spring AI
快速入门
1.对话机器人




用流式的话要指定字符编码,不然要乱码


在@Bean中加一个default的配置来加环绕通知来加输出日志,要自己在配置中配置输出日志的级别,不然也看不到





2.提示词工程-哄哄模拟器(prompt)

3.智能客服



4.ChatPDF-RAG



向量数据库



使用springAI自带的simpleVectorStore来实现向量数据库,这个不需要下载,所以不用占很多的存,用来示例,但实际开发中不要使用这个。用simple这个也不用引入依赖但是要配置,配置一个Bean,然后注入使用就可以

如果你也听说,有没有像过我,对流言会附和,还是你知道我还是我,跌跌撞撞才明白了许多,懂我的人就我一个我,想到你想起我,胸口依然温热


有了前提的知识,那么怎么把这些知识(JSON,Test,PDF...(引入对应相关的依赖))转化为document的文档呢,用spring提供的DocumentReader可以帮我们完成这件事

将docment加入向量库后也不用自己去将文件向量化了,向量数据库会自己将传入的文件向量化
一、为什么Java开发者需要关注Spring AI?
1.1 AI时代的Java机遇
2022年11月,OpenAI发布ChatGPT,AI一夜之间进入普通人的生活。2025年1月,DeepSeek-R1的发布更是彻底震惊了全球科技界------训练成本仅560万美元,性能却比肩OpenAI o1,这让中小型企业也有了参与AI开发的资格。
面对这场技术变革,Java开发者难免焦虑:AI开发似乎是Python的天下,我们这些深耕Spring生态的程序员该怎么办?
答案是:Spring AI。
要知道,全球有**25亿+**的Java应用正在运行,超过90%的服务端应用采用Java语言。传统应用要AI化,最好的方式就是用Java自己的方案。而Spring AI正是Spring官方在2024年推出的AI框架,它的核心思想很简单:
让Java开发者像使用Spring Boot一样方便地调用AI模型。
1.2 Spring AI是什么?
打个比方,如果把各种AI模型(OpenAI、DeepSeek、通义千问等)比作不同品牌的电器,那Spring AI就是一个万能转换插头------你只需要学会一套接口,就能调用所有主流模型。
Spring AI的架构分为两层:
-
Spring AI:Spring官方定义的AI标准规范(接口层)
-
Spring AI Alibaba / OpenAI Starter:各厂商的具体实现
1.3 核心概念速览
在学习具体代码之前,先理解几个核心概念:
| 概念 | 大白话解释 |
|---|---|
| ChatModel | 智能对话机器人,你发消息,它回答案 |
| ChatClient | ChatModel的升级版,带链式调用等高级功能 |
| Prompt | 你给AI的指令,包含系统设定和用户问题 |
| SystemMessage | 设置AI的"人格"和规则 |
| UserMessage | 你实际想问的问题 |
二、零基础实战:三步集成Spring AI
理论说再多,不如动手跑起来。下面我们用三步完成Spring AI的集成,目标是实现一个简单的聊天接口。
2.1 第一步:添加依赖
在pom.xml中添加以下配置:
xml
<!-- Spring Boot 父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
</parent>
<!-- 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>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI OpenAI Starter(兼容DeepSeek) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
</dependencies>
💡 小提示 :虽然我们用的是DeepSeek模型,但因为它兼容OpenAI的API规范,所以引入
spring-ai-starter-model-openai即可。
2.2 第二步:配置API密钥
在src/main/resources/application.yml中添加配置:
yaml
spring:
ai:
openai:
api-key: your-deepseek-api-key # 换成你自己的
base-url: https://api.deepseek.com
chat:
options:
model: deepseek-chat # 模型名称
temperature: 0.7 # 控制回答的随机性(0-1)
max-tokens: 500 # 最大输出长度
⚠️ 安全提醒:生产环境请使用环境变量管理API Key,不要硬编码在配置文件中!
2.3 第三步:编写Controller
java
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class AIController {
private final ChatClient chatClient;
// 构造器注入ChatClient
public AIController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
2.4 测试运行
启动Spring Boot应用,访问:
text
http://localhost:8080/ai/chat?message=用Java写一个Hello World
你会看到AI返回的代码示例:
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
🎉 恭喜!你已经完成了第一个Spring AI应用!
三、进阶玩法:让AI更聪明
基础调用只是开始,Spring AI提供了丰富的功能来提升AI应用的智能水平。
3.1 使用PromptTemplate实现提示词模板
java
import org.springframework.ai.chat.prompt.PromptTemplate;
@PostMapping("/translate")
public String translate(@RequestBody TranslateRequest request) {
PromptTemplate promptTemplate = new PromptTemplate("""
将以下{sourceLang}文本翻译成{targetLang}:
{text}
""");
promptTemplate.add("sourceLang", request.sourceLang());
promptTemplate.add("targetLang", request.targetLang());
promptTemplate.add("text", request.text());
return chatClient.call(promptTemplate.render());
}
record TranslateRequest(String sourceLang, String targetLang, String text) {}
3.2 系统消息:给AI设定"人格"
系统消息(SystemMessage)是让AI扮演特定角色的关键:
java
@GetMapping("/chat-with-role")
public Flux<String> chatWithRole(String question) {
return chatClient.prompt()
.system("""
你是一个专业的Java技术博主。
1. 回答时优先使用代码示例
2. 用通俗易懂的语言解释概念
3. 每次回答控制在500字以内
4. 使用Markdown格式输出代码块
""")
.user(question)
.stream()
.content();
}
优秀的系统消息包含四个要素:
| 要素 | 说明 | 示例 |
|---|---|---|
| 角色设定 | AI是什么身份 | "你是一个法律顾问" |
| 能力边界 | 能回答什么 | "只回答法律相关问题" |
| 输出格式 | 要求如何返回 | "用HTML格式返回" |
| 风格要求 | 语气、措辞要求 | "用通俗易懂的语言" |
3.3 流式响应:实现打字机效果
传统接口需要等待AI完全生成答案才能看到结果,体验不够好。流式响应可以实现逐字输出:
java
@GetMapping(value = "/chat-stream", produces = "text/event-stream")
public Flux<String> chatStream(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
前端通过EventSource接收数据,就能实现ChatGPT那样的打字机效果。
3.4 多模型支持:一个项目调用多个AI
Spring AI支持同时配置多个模型:
java
@Configuration
public class MultiModelConfig {
@Bean("deepseek")
public ChatModel deepseekChatModel() {
return new OpenAiChatModel(/* DeepSeek配置 */);
}
@Bean("qwen")
public ChatModel qwenChatModel() {
return new DashScopeChatModel(/* 通义千问配置 */);
}
@Bean("deepseekChatClient")
public ChatClient deepseekChatClient(@Qualifier("deepseek") ChatModel model) {
return ChatClient.builder(model).build();
}
@Bean("qwenChatClient")
public ChatClient qwenChatClient(@Qualifier("qwen") ChatModel model) {
return ChatClient.builder(model).build();
}
}
使用时根据场景选择不同模型:
java
@RestController
public class MultiModelController {
@Resource(name = "deepseekChatClient")
private ChatClient deepseekClient;
@Resource(name = "qwenChatClient")
private ChatClient qwenClient;
@GetMapping("/chat/deepseek")
public String chatWithDeepSeek(String msg) {
return deepseekClient.prompt().user(msg).call().content();
}
@GetMapping("/chat/qwen")
public String chatWithQwen(String msg) {
return qwenClient.prompt().user(msg).call().content();
}
}
四、避坑指南与最佳实践
4.1 常见错误处理
java
import org.springframework.ai.openai.api.OpenAiApiException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(OpenAiApiException.class)
public ResponseEntity<String> handleOpenAiError(OpenAiApiException ex) {
// API Key无效、余额不足等情况
return ResponseEntity.status(ex.getStatusCode())
.body("AI服务错误: " + ex.getMessage());
}
}
4.2 超长文本处理
如果输入文本过长,可能超过模型的token限制,需要在配置中调整:
yaml
spring:
ai:
openai:
chat:
options:
max-tokens: 2000 # 增加最大输出长度
4.3 生产环境配置建议
yaml
# 使用环境变量管理密钥
spring:
ai:
openai:
api-key: ${AI_API_KEY} # 从环境变量读取
base-url: ${AI_BASE_URL:https://api.openai.com/v1}
chat:
options:
temperature: 0.7
max-tokens: 500
timeout: 30s # 设置超时时间
4.4 切换模型提供商
Spring AI的核心优势是面向接口编程------切换模型提供商只需三步:
-
换依赖 :将
spring-ai-starter-model-openai换成spring-ai-alibaba-starter-dashscope -
改配置 :将
spring.ai.openai.api-key改成spring.ai.dashscope.api-key -
Controller代码完全不用改!
五、Spring AI能做什么?------应用场景
| 场景 | 说明 | 典型案例 |
|---|---|---|
| 智能客服 | 7x24小时自动解答客户问题 | 梅奥诊所的智能医疗咨询客服 |
| 代码生成 | 根据需求自动生成代码片段 | 辅助开发、代码审查 |
| 内容创作 | 生成文章、故事、文案初稿 | 新闻报道草稿生成 |
| 数据分析 | 从大量数据中提取洞察 | 金融数据分析辅助决策 |
| 教育辅导 | 个性化学习推荐、题目解析 | 智能教育平台 |
| 翻译服务 | 多语言实时翻译 | 跨国业务沟通 |
六、总结与展望
6.1 核心知识点回顾
-
Spring AI是Spring官方AI框架,让Java开发者用熟悉的方式调用AI模型
-
ChatClient是日常开发的首选,90%的场景用它就够了
-
Prompt工程是提升AI输出质量的关键,系统消息+用户消息的组合很重要
-
流式响应能大幅提升用户体验,实现打字机效果
-
多模型支持让你可以根据场景灵活选择最合适的模型
6.2 未来趋势
Spring AI正在快速演进,值得关注的几个方向:
-
多模态支持:从文本扩展到图像、语音、视频
-
本地模型集成:优化对Ollama等本地运行模型的支持,降低云端依赖
-
企业级能力:与Spring Security、Spring Cloud深度集成,提供鉴权、限流、熔断能力
-
RAG(检索增强生成):让AI能访问企业私有数据,生成更精准的回答