前言
随着大模型在业务系统落地普及,Java 后端开发者经常面临一个经典问题:接入大模型,到底原生 HTTP 调用、厂商 SDK、Spring AI 还是 LangChain4j 该怎么选?
很多项目初期图省事直接写 HTTP 接口调用,等到需要接入知识库 RAG、Agent 工具调用、切换多家大模型厂商时,大量代码重构,重复造轮子;也有不少开发者盲目引入重型 AI 框架,增加项目依赖复杂度,造成资源浪费。
本文从底层原理出发,梳理四类接入方案的层级关系、优缺点,清晰对比 Spring AI 与 LangChain4j 核心差异,给出落地选型标准,并附上可直接运行的 Java 实战代码示例,覆盖四种接入方式,助力大家在项目中做出合理技术决策。
一、核心本质:四层调用层级关系
先理清底层架构层级,理解所有方案的从属关系:
HTTP 原生调用→官方SDK(DashScope/OpenAI Java SDK)→Spring AI / LangChain4j
- HTTP 原生调用、厂商官方 SDK:属于模型调用层。只解决一件事:构造请求、发送给大模型服务、解析响应。只负责通信,不提供上层 AI 业务能力。
- Spring AI、LangChain4j:属于AI 应用开发框架,构建在调用层之上。在统一封装模型请求的基础上,内置 RAG、对话记忆、Agent 工具调用、文档分片、向量库集成等 AI 应用通用能力,目标是快速搭建完整 AI 业务系统。
关键结论:所有上层 AI 框架底层最终依旧是 HTTP 或者厂商 SDK 发起网络请求,框架只是封装、标准化、扩展能力。
二、四大方案多维度详细对比
表格
| 对比维度 | HTTP 原生调用 | 官方 SDK(dashscope-sdk-java) | Spring AI | LangChain4j |
|---|---|---|---|---|
| 核心定位 | 最基础的网络请求接入 | 单厂商模型调用封装 | Spring 生态 AI 集成框架 | 通用 AI 应用编排框架 |
| 模型支持 | 需手动适配所有模型 | 仅支持对应厂商模型 | 一套 API 适配多家主流模型 | 一套 API 适配多家主流模型 |
| AI 高级能力 | 全部手动编码实现 | 仅支持模型原生 API 能力 | 内置 RAG、基础工具调用、向量库集成 | 完整 RAG、Agent、记忆管理、复杂多工具编排 |
| 框架生态整合 | 无绑定,自行整合 | 无绑定,自行整合 | 深度整合 Spring Boot/Cloud/Security 全家桶 | 独立运行,可选适配 Spring,无强绑定 |
| 开发效率 | 代码量大,开发最慢 | 单模型场景较快,切换厂商成本极高 | Spring 项目开箱即用,配置极简 | 组件化编排,复杂 AI 应用效率最高 |
| 灵活性与可控性 | 最高,完全自定义请求细节 | 中等,受 SDK 封装限制 | 较低,遵循 Spring 抽象规范 | 中等,支持自定义扩展组件 |
| 学习成本 | 最低,看懂接口文档即可 | 较低,仅学习厂商 SDK 文档 | 中等,Spring 基础 + AI 基础概念 | 较高,完整 AI 组件体系需要学习 |
| 依赖复杂度 | 极低,仅通用 HTTP 客户端 | 较低,单一厂商 SDK 依赖 | 中等,附带 Spring 生态依赖 | 较高,组件丰富,依赖体系更多 |
| 可维护性 | 最差,切换模型需要大规模改代码 | 较差,更换厂商需要重写调用逻辑 | 良好,切换模型仅修改配置 | 优秀,业务代码几乎不用改动 |
三、两类方案价值拆解
3.1 底层调用方案:HTTP 原生 / 厂商官方 SDK
✅优势轻量无冗余、请求链路完全可控、无额外框架学习成本,适合简单场景。
❌劣势所有工程化能力(重试、超时、流式解析、异常处理)、AI 上层能力(对话记忆、知识库 RAG、函数调用)全部自行开发;当业务需要切换多家大模型厂商时,调用代码几乎全部重写。
🎯适用场景仅简单调用单一模型、无 RAG/Agent 复杂需求;对 Jar 包体积极度敏感;需要深度自定义请求签名、代理、链路监控等底层逻辑。
3.2 上层 AI 框架:Spring AI / LangChain4j
框架核心价值:屏蔽各大模型厂商接口差异、沉淀通用 AI 能力、降低 AI 应用开发成本
- 统一抽象:一套业务代码兼容通义千问、OpenAI、文心一言、智谱 AI 等模型,切换厂商只改配置;
- 开箱即用 AI 能力:内置对话历史管理、文档切片、向量数据库、检索增强 RAG、工具函数调用,不用手写大量胶水代码;
- 标准化工程能力:统一异常、流式响应封装、重试策略、序列化,避免团队重复造轮子;
- 快速对接现有 Java 业务系统。
四、Spring AI vs LangChain4j 核心区别
很多 Spring 后端开发者最容易混淆这两个框架,这里明确区分:
4.1 生态定位
- Spring AI:Spring 官方出品。目标是让 Spring Boot 项目无缝接入 AI。遵循 Spring 编程思想,提供 starter、自动配置、IOC Bean 管理,天然兼容 Spring Cloud、Spring Data、Spring Security。
- LangChain4j:独立开源框架,Java 版 LangChain。不绑定任何 Web 框架,专注 AI 业务逻辑编排,普通 Java 项目、Quarkus、Spring 项目都能使用。
4.2 能力深度
- Spring AI:能力偏向通用基础场景,满足 80% 常规业务:文本生成、基础 RAG、简单工具调用。复杂 Agent、多步骤推理工作流支持偏弱。
- LangChain4j:AI 组件更加完善,ReAct 智能体、多级记忆策略、多样化文档加载器、更多向量数据库适配,适合构建复杂智能体应用。
4.3 编程风格
- Spring AI:配置驱动、声明式开发,Spring 开发者几乎零上手成本;
- LangChain4j:流式链式调用,组件自由拼装,灵活搭建复杂 AI 工作流。
五、落地选型建议
- 仅简单调用单一模型,无知识库、Agent 需求→厂商官方 SDK
- 极致底层定制、依赖包大小严格限制→HTTP 原生调用
- 项目技术栈为 Spring Boot,常规 AI 场景(内容生成、基础知识库问答、智能客服)→Spring AI
- 复杂 AI 应用(多工具 Agent、多级 RAG、复杂推理流程),或者非 Spring 项目→LangChain4j
六、Java 项目实战代码示例
示例统一使用阿里云通义千问(DashScope)作为模型服务,方便直接测试; 注意:自行替换 API_KEY,生产环境密钥配置到配置中心,禁止硬编码。
6.1 方式 1:HTTP 原生调用(OkHttp)
Maven 依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.48</version> </dependency>调用代码
import okhttp3.*; import com.alibaba.fastjson2.JSON; import java.util.HashMap; import java.util.List; import java.util.Map; public class HttpRawDemo { private static final String API_KEY = "sk-xxx"; private static final String URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"; public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); Map<String, Object> input = new HashMap<>(); input.put("model", "qwen-turbo"); Map<String, Object> inputParam = new HashMap<>(); inputParam.put("messages", List.of( Map.of("role", "user", "content", "简单介绍Spring AI") )); input.put("input", inputParam); RequestBody body = RequestBody.create(JSON.toJSONString(input), MediaType.get("application/json")); Request request = new Request.Builder() .url(URL) .header("Authorization", "Bearer " + API_KEY) .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (response.body() != null) { System.out.println(response.body().string()); } } } }缺点:流式返回、异常处理、重试、消息封装全部需要自己扩展;切换其他大模型,请求体结构全部重写。
6.2 方式 2:厂商官方 SDK DashScope
Maven 依赖
<dependency> <groupId>com.aliyun.dashscope</groupId> <artifactId>dashscope-sdk-java</artifactId> <version>2.16.0</version> </dependency>调用示例
import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationParam; import com.alibaba.dashscope.aigc.generation.GenerationResult; import com.alibaba.dashscope.common.Message; import com.alibaba.dashscope.common.Role; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.InputRequiredException; import com.alibaba.dashscope.exception.NoApiKeyException; public class DashScopeSdkDemo { private static final String API_KEY = "sk-xxx"; public static void main(String[] args) throws NoApiKeyException, ApiException, InputRequiredException { Generation gen = new Generation(); Message userMsg = Message.builder().role(Role.USER.getValue()).content("简单介绍LangChain4j").build(); GenerationParam param = GenerationParam.builder() .apiKey(API_KEY) .model("qwen-turbo") .messages(List.of(userMsg)) .resultFormat(GenerationParam.ResultFormat.MESSAGE) .build(); GenerationResult result = gen.call(param); System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent()); } }优点:封装好请求、序列化、异常;缺点:只能使用阿里云通义系列,切换 OpenAI、文心一言必须更换整套代码。
6.3 方式 3:Spring AI(Spring Boot 项目)
Maven 依赖
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-dashscope-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>application.yml 配置
spring: ai: dashscope: api-key: sk-xxx chat: options: model: qwen-turbo业务代码
import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/ai") public class SpringAiController { private final ChatClient chatClient; public SpringAiController(ChatClient.Builder chatClientBuilder) { this.chatClient = chatClientBuilder.build(); } @GetMapping("/chat") public String chat(@RequestParam String prompt) { return chatClient.prompt() .user(prompt) .call() .content(); } }拓展:基础 RAG 伪代码(Spring AI 内置能力)
// 文档加载、切片、存入向量库、检索后送入大模型,无需自己实现基础链路 // EmbeddingModel、VectorStore统一接口,切换向量库只改配置6.4 方式 4:LangChain4j 通用示例
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-dashscope</artifactId> <version>0.34.0</version> </dependency>调用代码
import dev.langchain4j.model.dashscope.DashScopeChatModel; import dev.langchain4j.model.chat.ChatLanguageModel; public class LangChain4jDemo { public static void main(String[] args) { ChatLanguageModel model = DashScopeChatModel.builder() .apiKey("sk-xxx") .modelName("qwen-turbo") .build(); String answer = model.generate("对比Spring AI和LangChain4j"); System.out.println(answer); } }进阶:带对话记忆(LangChain4j 特色能力)
import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.ChatLanguageModel; import dev.langchain4j.model.dashscope.DashScopeChatModel; import dev.langchain4j.service.AiServices; interface ChatBot { String chat(String msg); } public class LangChain4jMemoryDemo { public static void main(String[] args) { ChatLanguageModel model = DashScopeChatModel.builder() .apiKey("sk-xxx") .modelName("qwen-turbo") .build(); ChatMemory memory = MessageWindowChatMemory.withMaxMessages(10); ChatBot bot = AiServices.builder(ChatBot.class) .chatLanguageModel(model) .chatMemory(memory) .build(); System.out.println(bot.chat("我的名字是小明")); System.out.println(bot.chat("我叫什么?")); } }七、总结与落地提醒
- 小型简单需求:优先官方 SDK,轻量化;
- Spring 常规业务系统:优先 Spring AI,生态融合度最高;
- 复杂智能体、知识库系统、多模型混合场景:LangChain4j 能力上限更高;
- 避免误区:不要一上来直接引入重型 AI 框架,如果只是简单问答,SDK 完全够用;同时不要长期裸写 HTTP 调用,业务扩张后维护成本极高。
- 生产规范:API 密钥统一配置中心管理、增加超时、限流、重试、流式响应处理、输入输出内容安全校验。