前言

随着大模型在业务系统落地普及,Java 后端开发者经常面临一个经典问题:接入大模型,到底原生 HTTP 调用、厂商 SDK、Spring AI 还是 LangChain4j 该怎么选?

很多项目初期图省事直接写 HTTP 接口调用,等到需要接入知识库 RAG、Agent 工具调用、切换多家大模型厂商时,大量代码重构,重复造轮子;也有不少开发者盲目引入重型 AI 框架,增加项目依赖复杂度,造成资源浪费。

本文从底层原理出发,梳理四类接入方案的层级关系、优缺点,清晰对比 Spring AI 与 LangChain4j 核心差异,给出落地选型标准,并附上可直接运行的 Java 实战代码示例,覆盖四种接入方式,助力大家在项目中做出合理技术决策。

一、核心本质:四层调用层级关系

先理清底层架构层级,理解所有方案的从属关系:

HTTP 原生调用 → 官方SDK(DashScope/OpenAI Java SDK) → Spring AI / LangChain4j

  1. HTTP 原生调用、厂商官方 SDK:属于模型调用层。只解决一件事:构造请求、发送给大模型服务、解析响应。只负责通信,不提供上层 AI 业务能力。
  2. Spring AI、LangChain4j:属于AI 应用开发框架,构建在调用层之上。在统一封装模型请求的基础上,内置 RAG、对话记忆、Agent 工具调用、文档分片、向量库集成等 AI 应用通用能力,目标是快速搭建完整 AI 业务系统。

关键结论:所有上层 AI 框架底层最终依旧是 HTTP 或者厂商 SDK 发起网络请求,框架只是封装、标准化、扩展能力。

二、四大方案多维度详细对比

表格

对比维度HTTP 原生调用官方 SDK(dashscope-sdk-java)Spring AILangChain4j
核心定位最基础的网络请求接入单厂商模型调用封装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 应用开发成本

  1. 统一抽象:一套业务代码兼容通义千问、OpenAI、文心一言、智谱 AI 等模型,切换厂商只改配置;
  2. 开箱即用 AI 能力:内置对话历史管理、文档切片、向量数据库、检索增强 RAG、工具函数调用,不用手写大量胶水代码;
  3. 标准化工程能力:统一异常、流式响应封装、重试策略、序列化,避免团队重复造轮子;
  4. 快速对接现有 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 工作流。

五、落地选型建议

  1. 仅简单调用单一模型,无知识库、Agent 需求 → 厂商官方 SDK
  2. 极致底层定制、依赖包大小严格限制 → HTTP 原生调用
  3. 项目技术栈为 Spring Boot,常规 AI 场景(内容生成、基础知识库问答、智能客服) → Spring AI
  4. 复杂 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("我叫什么?"));
    }
}

七、总结与落地提醒

  1. 小型简单需求:优先官方 SDK,轻量化;
  2. Spring 常规业务系统:优先 Spring AI,生态融合度最高;
  3. 复杂智能体、知识库系统、多模型混合场景:LangChain4j 能力上限更高;
  4. 避免误区:不要一上来直接引入重型 AI 框架,如果只是简单问答,SDK 完全够用;同时不要长期裸写 HTTP 调用,业务扩张后维护成本极高。
  5. 生产规范:API 密钥统一配置中心管理、增加超时、限流、重试、流式响应处理、输入输出内容安全校验。

更多推荐