
**摘要:**本文系统介绍了 Java 项目接入大模型的三种主流方案。从最轻量的直接调用 API,到提供打字机体验的流式响应 + SSE,再到功能完整的 Spring AI 框架,详细分析了每种方案的实现方式、适用场景与优缺点,并提供了具体的代码示例。文章旨在帮助开发者根据自身业务需求,选择最合适的接入路径,快速在 Spring Boot 项目中集成 AI 能力。
先交代一下背景
大概从去年开始,不停地有同事跑来问我:「咱项目能不能对接 ChatGPT?我想做个智能客服」「能不能加个 AI 分析功能?用户上传图片自动识别内容」「能不能搞个 AI 写周报的接口?省得手动填」
这些需求总结起来就一句话:Java 项目怎么接入大模型?
我之前也觉得这事挺复杂------大模型 API 调用不是 Python 的天下吗?Java 调 HTTP 接口?自己封装请求参数、处理流式响应、管理 token?感觉工程量不小。
后来真做了才发现,这事比想象的简单。Spring Boot 3.x 的 RestClient + 大模型厂商提供的 SDK,你基本只需要写几十行代码就能调通。
今天把三种最常见的接入姿势全部写出来,从最简单到最复杂,你按自己的需求程度选。
姿势一:直接调 API(最轻量)
如果你的需求只是「在项目里调一次大模型接口」,不需要维护对话上下文,不需要流式响应,最简单的方案:用 RestTemplate / RestClient 直接调大模型 API。
Spring Boot 3.2+ 推荐的 RestClient:
java
@Service
public class AIService {
private final RestClient restClient;
public AIService(RestClient.Builder builder) {
this.restClient = builder
.baseUrl("https://api.deepseek.com/v1")
.defaultHeader("Authorization", "Bearer " + System.getenv("AI_API_KEY"))
.build();
}
public String ask(String prompt) {
// 构建请求体
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "deepseek-chat");
requestBody.put("messages", List.of(
Map.of("role", "user", "content", prompt)
));
requestBody.put("temperature", 0.7);
// 发送请求
var response = restClient.post()
.uri("/chat/completions")
.body(requestBody)
.retrieve()
.toEntity(JsonNode.class);
// 解析响应
JsonNode body = response.getBody();
return body.get("choices").get(0).get("message").get("content").asText();
}
}
就这么简单。一个 Service 类,一个 API key,一个 RestClient,完事。
调用的时候:
java
@RestController
public class AIController {
@Autowired
private AIService aiService;
@PostMapping("/api/ai/ask")
public Result<String> ask(@RequestBody AskRequest request) {
String reply = aiService.ask(request.getPrompt());
return Result.success(reply);
}
}
适用场景:
-
获取 AI 对一段文本的分析结果
-
生成内容摘要
-
翻译/分类/打标签
缺点: 同步阻塞,大模型响应慢时接口会卡住。
姿势二:流式响应 + SSE(Web 端体验最优)
如果你需要类似 ChatGPT 那种「一个字一个字往外蹦」的效果,就得用 SSE(Server-Sent Events) 流式推送。
大模型 API 基本都支持 stream 参数。设置为 true 后,API 返回的不是一个完整的 JSON,而是一段一段的 Server-Sent Events:
data: {"choices":[{"delta":{"content":"你好"}}]}
data: {"choices":[{"delta":{"content":",今"}}]}
data: {"choices":[{"delta":{"content":"天"}}]}
data: [DONE]
Spring Boot 里用 WebClient 处理流式响应:
java
@Service
public class StreamingAIService {
private final WebClient webClient;
public StreamingAIService(WebClient.Builder builder) {
this.webClient = builder
.baseUrl("https://api.deepseek.com/v1")
.defaultHeader("Authorization", "Bearer " + System.getenv("AI_API_KEY"))
.build();
}
public Flux<String> streamAsk(String prompt) {
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("model", "deepseek-chat");
requestBody.put("messages", List.of(
Map.of("role", "user", "content", prompt)
));
requestBody.put("stream", true); // 开启流式
return webClient.post()
.uri("/chat/completions")
.bodyValue(requestBody)
.retrieve()
.bodyToFlux(String.class)
.filter(line -> line.startsWith("data: "))
.map(line -> line.substring(6)) // 去掉 "data: " 前缀
.takeUntil("[DONE]"::equals) // 遇到 [DONE] 结束
.filter(text -> !text.equals("[DONE]"))
.map(this::extractContent); // 提取 content 字段
}
private String extractContent(String json) {
try {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
return node.get("choices").get(0).get("delta").get("content").asText();
} catch (Exception e) {
return "";
}
}
}
前端用 EventSource API 接收:
javascript
const eventSource = new EventSource('/api/ai/ask?prompt=帮我写一首诗');
eventSource.onmessage = (event) => {
document.getElementById('output').textContent += event.data;
};
这种姿势给你的用户带来了打字机效果。体验跟对话式 AI 完全一致。

姿势三:Spring AI 框架(最完整)
如果前两种姿势是"搭积木",那 Spring AI 就是乐高套装------你想要的组件它基本都准备好了。
Spring AI 是 Spring 官方推出的 AI 集成框架(对标 LangChain for Java)。它封装了:
-
统一的 ChatClient API(不管底层是 OpenAI、DeepSeek、通义千问还是本地 Ollama)
-
向量数据库集成(Pgvector、Redis、Chroma)
-
RAG(检索增强生成)模式支持
-
工具调用(Function Calling)
-
对话记忆管理
加依赖:
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
配配置:
yaml
spring:
ai:
openai:
api-key: ${AI_API_KEY}
chat:
options:
model: gpt-4o-mini
temperature: 0.7
然后直接注入 ChatClient:
java
@Service
public class SpringAIService {
private final ChatClient chatClient;
public SpringAIService(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是一个 Java 开发助手,回答问题简洁明了")
.build();
}
public String chat(String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
没有 RestClient 的手动封装、没有 JSON 解析、没有 SSE 处理------Spring AI 全帮你做了。
更强大的是 RAG 模式:
java
String answer = chatClient.prompt()
.user("我们这个项目最近有什么 bug 需要修复?")
.advisors(new QuestionAdviceAdvisor(vectorStore)) // 自动检索相关文档
.call()
.content();
它会自动把你的文档向量化存储,每次用户提问时先检索最相关的文档片段,然后带着这些上下文去问大模型。这就是 RAG 的核心------不用重新训练模型,就能让 AI 理解你的私有文档。
三个姿势怎么选
| 姿势 | 复杂度 | 能力 | 适合场景 |
|---|---|---|---|
| 直接调 API | ⭐ | 调用大模型 | 简单问答、数据分析 |
| 流式+SSE | ⭐⭐ | 打字机效果 | 对话机器人、AI 助手 |
| Spring AI | ⭐⭐⭐ | RAG、Function Calling | 企业级 AI 应用 |
建议:从姿势一开始,够用就行。需要流式了就升级到姿势二。需要知识库检索了就用姿势三。
不要为了用框架而用框架。你的业务需求决定了接入深度。
总结
Java 项目接入大模型没有你想象的那么复杂。
-
最简单的方案:RestClient 发个 POST 请求,五行代码调通
-
体验最好的方案:WebClient + SSE 流式输出
-
最完整的方案:Spring AI 框架,RAG 和 Function Calling 都准备好了
以上三种,你都只需要会写 Spring Boot 就能上手。不需要懂 Python,不需要 ML 知识。
下次产品经理再提 AI 需求,你自己心里就有底了。
下一篇预告:Copilot Chat vs Copilot Edit------什么时候用哪个
私信回复「666」,一次性领走:
面试宝典:Java 高频考点速查表、HashMap/ConcurrentHashMap 源码笔记、JVM 调优案例、Spring Boot 面试 50 问
AI 编程工具箱:Cursor/Copilot/Codex 六工具对比表、10 个 Prompt 模板、Debug 万能公式、Cursor 速查手册、AI 图片生成入门、30+ 效率工具包
一份资料包,两个专栏都能用。「唠点键盘之外的」,只讲干货。