Spring AI 快速入门:集成 DeepSeek 大模型实战笔记
今天上手了 Spring AI 的第一课,用 Spring Boot + DeepSeek API 搭了一个最简单的 AI 聊天应用。把整个过程和知识点整理一下,方便后续回顾。
一、什么是 Spring AI
Spring AI 是 Spring 官方推出的 AI 应用开发框架,核心目标是让 Java 开发者像使用 Spring Data 操作数据库一样,用统一的抽象来调用各种大模型。
它的核心特点:
- 统一 API 抽象:不管是 OpenAI、DeepSeek、智谱还是通义千问,接口调用方式基本一致,切换模型只改配置
- 自动装配:Spring Boot Starter 机制,引入依赖 + 写配置就能用
- 高阶能力:支持 RAG、Function Calling、多模态、向量数据库等(入门阶段先从聊天开始)
二、项目配置详解(application.properties)
spring.application.name=SpringAIQuickStart
server.port=8080
# Deepseek API 配置
spring.ai.deepseek.base-url=https://api.deepseek.com
spring.ai.deepseek.api-key=sk-xxxxxxxxxxxxxxxxxxxx
spring.ai.deepseek.chat.options.model=deepseek-chat
spring.ai.deepseek.chat.options.temperature=0.8
逐行拆解知识点
| 配置项 | 作用 | 注意点 |
|---|---|---|
spring.ai.deepseek.base-url |
DeepSeek API 的基础地址 | 国内模型必须手动指定 base-url,默认是 OpenAI 的地址 |
spring.ai.deepseek.api-key |
API 密钥 | 从 DeepSeek 官网控制台获取,生产环境绝对不能硬编码,建议用环境变量或配置中心 |
chat.options.model |
指定使用的模型名称 | DeepSeek 聊天模型一般填 deepseek-chat |
chat.options.temperature |
采样温度,范围 0~2 | 值越高回答越随机、越有创造力;值越低越稳定、越严谨。0.8 属于偏创意的平衡值 |
💡 小知识 :pom.xml 里需要引入
spring-ai-deepseek-spring-boot-starter依赖,Spring Boot 才会自动装配 DeepSeekChatModel 这个 Bean。
三、Controller 层实现(ChatController)
@RestController
@RequestMapping("/ai")
public class ChatController {
@Autowired
private DeepSeekChatModel chatModel;
@GetMapping("/generate")
private String generate(@RequestParam(value="message", defaultValue="你是谁") String message) {
String response = chatModel.call(message);
return response;
}
}
核心知识点
1. DeepSeekChatModel 是什么?
这是 Spring AI 自动装配好的聊天模型客户端,本质上封装了 HTTP 请求、鉴权、序列化等底层逻辑。我们只需要注入直接调用就行,不用手写 RestTemplate/WebClient。
2. chatModel.call(message) 方法
- 最简单的同步调用方式,传入一个 String,返回一个 String
- 内部会自动构建 ChatRequest,调用 DeepSeek 的
/chat/completions接口 - 阻塞式调用:大模型生成需要几秒,这段时间线程会一直等待。生产环境建议用流式(stream)接口提升体验
3. 几个可以优化的点
generate方法权限是private,Spring MVC 其实也能识别,但规范上应该写成public- 没有异常处理,API 调用失败会直接抛 500
- 没有对话历史,每次调用都是全新的上下文(多轮对话需要自己维护 message 列表)
四、前端聊天页面
前端是一个纯 HTML + CSS + JS 的单页,通过 fetch 调用后端 /ai/generate 接口。
关键实现点
1. 消息渲染机制
function addMessage(role, text) {
// 动态创建 DOM 元素,区分 user / ai 两种样式
}
用 role 参数控制气泡方向:用户消息靠右(紫色渐变),AI 消息靠左(白色卡片)。
2. 打字指示器(Typing Indicator)
function addTypingIndicator() { ... }
function removeTypingIndicator() { ... }
请求发出后显示三个跳动的小圆点,AI 回复回来后移除------这是聊天应用的标配交互,解决了等待期间的空白焦虑。
3. XSS 防护
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
AI 返回的内容直接插入 DOM 有 XSS 风险,用 textContent 转义是最简单的处理方式。
4. 跨域问题
这里前端页面和后端接口是同源部署 (都在 8080 端口),所以 fetch 直接写 /ai/generate 就行。如果前后端分离部署,后端需要配置 @CrossOrigin 或全局 CORS 配置。
五、完整调用链路梳理
用户输入文字
→ 前端 fetch 发送 GET 请求 /ai/generate?message=xxx
→ ChatController 接收参数
→ DeepSeekChatModel.call() 内部封装 HTTP 请求
→ 调用 DeepSeek 官方 API (api.deepseek.com)
→ 大模型生成回答并返回
← 拿到响应字符串
← Controller return 字符串
← 前端收到 response
→ 渲染 AI 气泡到页面
六、踩坑与注意事项
- API Key 泄露风险:代码里硬编码 key 只是练习用,实际项目一定要放到环境变量或 Nacos 等配置中心
- 同步调用超时 :
call()是阻塞的,复杂回答可能耗时十几秒,需要调整 Tomcat 超时时间,或者改用 SSE 流式输出 - 没有上下文记忆 :每次调用都是独立的,AI 不记得上一句说了什么。多轮对话需要把历史消息组装成
List<Message>传给chatModel.call() - Temperature 参数调优 :做代码生成、事实问答建议调低(0.20.5);做创意写作、头脑风暴可以调高(0.71.0)
七、下一步可以学什么
- 流式输出(Streaming) :用
stream()方法实现打字机效果,用户体验直接拉满 - 多轮对话 :用
ChatMemory管理对话历史 - Prompt 模板 :
PromptTemplate统一管理提示词 - RAG 检索增强:结合向量数据库,让 AI 回答你的私有文档
- Function Calling:让 AI 调用你写的 Java 方法
总结 :Spring AI 把大模型调用的复杂度封装得非常彻底,一个 Starter + 几行配置 + 一个 call() 方法就能跑通完整的 AI 聊天应用。这节课只是入门,核心价值在于 Spring 生态的统一抽象------后面换模型、加功能,都不用推翻重写。