Spring AI + DeepSeek :从入门到构建智能体应用
文章目录
前言
随着大语言模型(LLM)的爆发式增长,如何将AI能力高效地集成到企业级Java应用中,成为了一个热门方向。Spring AI 正是为此而生——它将Spring生态的设计哲学(如依赖注入、工厂模式、AOP)带入人工智能领域,提供了一套统一、标准化的接口来对接各类大模型(如DeepSeek、OpenAI、阿里云百炼等)。
本文将带你系统性地梳理:从大模型基础原理,到Spring AI环境搭建,再到RAG、Function Calling、智能体和MCP协议等高级实战。
一、大模型基础:了解你的AI伙伴
1. 人工智能发展脉络
-
机器学习:基于数据统计训练模型。
-
深度学习:模仿人脑神经网络,应用于图像识别、自然语言处理(NLP)。
-
大语言模型(LLM):NLP领域的前沿成果,核心是基于Transformer架构。
2. Transformer:大模型的“发动机”
Transformer的核心是自注意力机制(Self-Attention):
-
输入向量化:将文字转为数字(Embedding)。
-
注意力计算:让模型同时“看到”一句话中所有词,并计算彼此间的关联强度。
-
多层叠加:每一层提炼更复杂的语义,最终输出概率分布,预测下一个Token(文字单元)。
3. 预训练与微调
-
预训练:在海量通用数据上学习语言规律,形成“知识库”。
-
微调(Fine-tuning):针对特定领域(如法律、医疗),用专业数据进一步训练,提升专业表现。
4. 部署方式对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| 云部署 | 前期成本低、运维简单、弹性扩展、全球访问 | 数据隐私风险、依赖网络、长期成本高 |
| 本地部署(如Ollama) | 数据安全、无网络依赖、长期成本低、可定制 | 初期硬件投入大、运维复杂、部署周期长 |
| 开放API服务(如阿里云百炼) | 零运维、即开即用、全球访问 | 数据隐私顾虑、长期成本累积、定制能力受限 |
二、Spring AI 入门
1. 环境要求
-
JDK版本:17 及以上。
2. 核心架构
Spring AI 提供了统一的ChatClient,通过配置不同的Starter依赖,可无缝切换模型提供商。
3. 快速上手:一个简单的聊天机器人
步骤1:引入依赖
<!-- Spring AI 父依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>最新版本</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 具体模型依赖(例如OpenAI风格) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
步骤2:配置application.yml
spring:
ai:
openai:
api-key: ${AI_API_KEY}
base-url: ${AI_BASE_URL} # 如使用DeepSeek,可替换为第三方代理地址
chat:
options:
model: gpt-4
temperature: 0.7
步骤3:编写Service
@Service
public class AIChatService {
private final ChatClient chatClient;
public AIChatService(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是一个专业的Java技术顾问。")
.build();
}
public String chat(String userMessage) {
return chatClient.prompt(userMessage).call().content();
}
}
步骤4:流式输出(响应式编程)
public Flux<String> streamChat(String userMessage) {
return chatClient.prompt(userMessage).stream().content();
}
注意:流式输出需配置对应的编码和解码器,前端需支持SSE或WebSocket。
三、高级特性实战
1. 会话记忆(Chat Memory)
大模型本身是无状态的。Spring AI通过ChatMemory接口和Advisor实现记忆管理。
实现方案:
-
定义
ChatMemoryBean(可基于内存Map或Redis)。 -
在
ChatClient中通过Advisor引入:
@Bean
public ChatClient chatClient(ChatClient.Builder builder, ChatMemory chatMemory) {
return builder
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
.build();
}
-
前端每次请求传递
sessionId,相同ID自动共享历史上下文。
2. 提示词工程与安全
-
最佳实践:明确指令、使用分隔符、分步骤拆解、提供Few-shot示例、指定JSON输出格式。
-
攻击防范:
-
提示注入:使用分隔符隔离用户输入。
-
越狱攻击:接入内容审核API(如阿里云Moderation)。
-
DoS攻击:限制输入最大Token长度。
-
- 实现步骤:
1, 定义Tool类,使用@Tool注解描述功能。
@Component
public class OrderTool {
@Tool(description = "根据商品ID下单,返回订单号")
public String createOrder(String productId) {
// 调用业务Service
return "订单创建成功,订单号:12345";
}
}
2, 注册Tool到ChatClient:
@Bean
public ChatClient chatClient(ChatClient.Builder builder, OrderTool orderTool) {
return builder
.defaultTools(orderTool)
.build();
}
3, 大模型自动根据用户问题,决定是否调用createOrder方法。
4. RAG(检索增强生成)
解决大模型知识陈旧、无法访问私有数据的问题。
工作流程:
-
离线阶段:文档加载 → 分块(Split)→ 向量化(Embedding)→ 存入向量数据库。
-
在线阶段:用户提问 → 问题向量化 → 检索相似片段 → 拼接Prompt → 调用大模型生成回答。
Spring AI实现(以Elasticsearch为例):
spring:
ai:
vectorstore:
elasticsearch:
index-name: knowledge_index
dimensions: 1536 # 与Embedding模型一致
// 检索并增强回答
String answer = chatClient.prompt()
.user("Spring Boot 3.0有哪些新特性?")
.advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
.call()
.content();
5. 多模态(Multimodal)
支持图像、音频、视频等输入。以阿里云百炼的qwen-omni-turbo为例:
Media imageMedia = new Media(MimeTypeUtils.IMAGE_PNG, imageFile.getBytes());
String response = chatClient.prompt()
.user("描述这张图片的内容")
.media(imageMedia)
.call()
.content();
四、智能体(Agent)架构设计
单一Prompt难以处理复杂业务。智能体通过任务分解+工具调用协同工作。
| 架构模式 | 特点 | 适用场景 |
|---|---|---|
| 增强型(单Agent) | 输入→LLM→输出,带记忆和工具 | 简单问答 |
| 链式工作流 | 上一输出作为下一输入 | 多步骤处理(如生成→翻译→润色) |
| 路由工作流 | 根据意图分发给不同专家模型 | 多领域处理 |
| 并行工作流 | 多模型同时处理,结果汇总 | 高可靠性/多角度分析 |
| 协调器工作流 | 中心调度动态生成子任务 | 复杂业务编排 |
| 评估-优化工作流 | 生成结果后自我反思反馈 | 质量敏感场景 |
五、MCP(模型上下文协议)—— 下一代AI集成标准
MCP(Model Context Protocol)是一种标准化协议,让AI能以结构化方式与外部工具、数据源交互,突破传统Function Calling的单体限制。
1. MCP Client(调用外部工具)
示例:让AI直接“打开网页”并截图。
-
安装MCP浏览器控制服务(如
playwright-mcp-server)。 -
配置
mcp-servers.json。 -
Spring AI中通过
ToolCallbackProvider自动注册所有MCP工具。
@Bean
public ChatClient chatClient(ChatClient.Builder builder,
ToolCallbackProvider mcpTools) {
return builder
.defaultTools(mcpTools)
.build();
}
2. MCP Server(暴露自定义工具)
你也可以将Java服务封装为MCP Server,供其他AI客户端调用,实现跨语言、跨平台的工具生态。
六、本地部署:Ollama + Spring AI
对于数据敏感或成本敏感的项目,可使用Ollama本地部署模型(如DeepSeek、Qwen等)。
集成方式:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: deepseek-coder:6.7b
七、结语与展望
通过Spring AI,Java开发者可以几乎零成本地切入大模型应用开发。从基础的聊天补全,到高级的RAG、Function Calling、智能体编排,再到面向未来的MCP协议,Spring AI提供了一套完整、熟悉且强大的工具箱。
下一步建议:
-
尝试将RAG与ES结合,打造企业级知识库问答系统。
-
探索多模态应用,如图生文、视频摘要。
-
实践智能体路由模式,构建多专家协同系统。
注意:生产环境请务必做好敏感词过滤、输入长度限制、内容安全审核,以及合理的超时和重试机制。
更多推荐

所有评论(0)