10 Spring Boot + 大模型:Java 项目接入 AI 的三种姿势

**摘要:**本文系统介绍了 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+ 效率工具包

一份资料包,两个专栏都能用。「唠点键盘之外的」,只讲干货。

相关推荐
NWU_LK18 小时前
【WebFlux】第五篇 —— 两种编程模型与 WebClient
java
增量星球18 小时前
《持续交付2.0系列六》业务需求协作管理
java·运维·自动化·devops·持续部署·持续集成
重生之我是Java开发战士18 小时前
【Java EE】Spring IoC 与 DI
java·spring·java-ee
霸道流氓气质19 小时前
SpringBoot+Vue通过ModbusTCP协议实现PLC 设备连接、重连实时控制
vue.js·spring boot·后端
SimonKing19 小时前
阿里要求全员卸载 Claude Code:事件始末与深层逻辑
java·后端·程序员
云烟成雨TD19 小时前
Agent Scope Java 2.x 系列【42】2.0 GA 正式发布:从透明开发迈向智能体系统工程
java·人工智能·agent
anyup19 小时前
从文本到具身:我给 AI Agent 搭了套实时 3D 交互身体
前端·人工智能·aigc
TrisighT19 小时前
从单个 Skill 到团队私有市场:Plugin 打包分发的最后一公里
aigc·agent·ai编程
猫猫不是喵喵.19 小时前
SpringBoot自动装配原理
java·spring boot·后端