Spring AI

Java中大模型调用的多种方式

我们要讲的是基于Java的大模型应用开发,那么就需要介绍下在java中怎么和大模型交互。 坐稳扶好,正式开始进入代码部分了。(注意, 我们的项目JDK要求最低是JDK17,建议用JDK 21) 在前面介绍百炼的时候,我们讲过,可以通…

TL;DR

我们要讲的是基于Java的大模型应用开发,那么就需要介绍下在java中怎么和大模型交互。 坐稳扶好,正式开始进入代码部分了。(注意, 我们的项目JDK要求最低是JDK17,建议用JDK 21) 在前面介绍百炼的时候,我们讲过,可以通…

我们要讲的是基于Java的大模型应用开发,那么就需要介绍下在java中怎么和大模型交互。 坐稳扶好,正式开始进入代码部分了。(注意, 我们的项目JDK要求最低是JDK17,建议用JDK 21) 在前面介绍百炼的时候,我们讲过,可以通过curl来调用模型的:

curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen-plus",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "程序员Hollis是谁?"
        }
    ]
}'

HttpClient 调用大模型

那么也就意味着,想要在Java中调用大模型,最简单的方式,那就是使用一些HTTP的客户端发送一个http请求。比如用HttpClient。 我们先创建一个空的SpringBoot应用,通过https://start.spring.io/ 创建。 点击generate就会创建并下载一个空项目了。把他解压并导入到你的idea中。 接着,我们常使用HttpClient实现一个大模型的调用

package cn.hollis.llm.llmentor;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpClientCaller {

    private static final String API_KEY = "sk-8ef405c4686e456e91f6698272253126";
    private static final String API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";

    public static void main(String[] args) throws IOException, InterruptedException {
        String requestBody = """
                {
                    "model": "qwen-plus",
                    "messages": [
                        {
                            "role": "system",
                            "content": "You are a helpful assistant."
                        },
                        {
                            "role": "user",
                            "content": "你好,介绍下JAVA?"
                        }
                    ],
                    "stream": true
                }
                """;

        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(API_URL))
                .header("Content-Type", "application/json")
                .header("Authorization", "Bearer " + API_KEY)
                .header("X-DashScope-SSE", "enable")
                .POST(HttpRequest.BodyPublishers.ofString(requestBody))
                .build();

        HttpResponse<String> response = client.send(
                request, HttpResponse.BodyHandlers.ofString());


        System.out.println(response.body());
    }
}

这里面有个问题,就是模型返回的比较慢,那是因为我们没用流式输出。我们知道现在很多模型的对话的返回都是流式输出的,就是一个字一个字吐出的。这块后面我们会讲。别急,慢慢来。 前面讲完了用最普通的HTTP Client的方式对接大模型,当然,除了我们讲的这种,你还可以用任意一个http的客户端框架发起请求,都可以。 那么,这种方式,有没有缺点,有,那就是代码太复杂了,不是结构化的,完全是组装http请求的方式实现的,没啥复用性。这还是一个简单的对话功能,如果要做更多的东西,比如rag、工具调用,mcp啥的,那代码就爆炸了。 所以,在Java中,也提供了框架,可以帮我们简化大模型应用开发中的模型调用,比较常用的就是: - Spring AI (Alibaba) - Langchain4j

Spring AI

Spring Ai,是Spring为了降低Java人员开发AI应用的成本而推出的一套组件。(这里不得不说,在Java支持AI这方面的努力,Spring比Oracle要靠谱!!!) Spring AI,截止我写这个文档的时候,他是1.0.3版本,其实他的时间并不长,1.0.0的正式版也就25年5月份才发布而已。 通过下面这个spring ai的官方文档的目录基本上就能看出来,spring ai目前有的功能: 1、对话客户端的API 2、提示词相关 3、结构化输出 4、模型相关 5、对话记忆 6、工具调用 7、MCP 8、RAG 9、向量数据库 这里面的所有内容,我们的课程都会讲到!!! 很多人认为,Spring AI 是对模型调用做了简单封装,但其实这么想的话就太简单了。 虽然它确实封装了底层模型 API,但它的价值远不止于此: - 它提供了面向 Spring 开发者的编程模型,让 AI 功能像使用 JDBC 或 REST Client 一样自然。 - 它解决了多模型适配、提示工程、结构化输出、RAG 架构、对话记忆、可观测性等实际工程问题。 - 它鼓励最佳实践,比如将提示词外置、使用 POJO 映射输出、支持单元测试等。 所以,总结来说,Spring AI 是一个面向生产级 AI 应用的全栈式开发框架,目标是让 Java 开发者在熟悉的 Spring 生态中高效、可靠地构建 AI 原生应用。它不只是“调用模型的封装”,而是提供了一整套从提示管理、输出解析、向量存储到可观测性的解决方案。 (关于Spring AI的应用,是我们本课程的重点,后面会有单独章节介绍)

Spring AI Alibaba

Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。 在Spring AI Alibaba的1.0 GA版本推出之前,Spring AI Alibaba可以理解为在Spring AI上面又做了一层封装,可以让我们更加方便的做各种模型的接入(尤其是alibaba自家的百炼的接入更方便),以及基于模型做的各种东西,比如MCP、RAG等等的。 但是,自从Spring AI Alibaba 的1.0 GA之后,在Spring AI的基础上,面向企业级智能体(Agent)应用开发场景,进行了深度增强和架构升级。它保留了 Spring AI 的所有能力,并在此之上构建了一套完整的 AI 原生应用开发平台,尤其适合需要复杂流程编排、多智能体协作、高可靠性和阿里云生态集成的生产环境。 Spring AI Alibaba 最大的创新点,是受 Python 社区 LangGraph 启发,提供了 基于有向图(DAG + 循环)的工作流编排能力(Graph)。基于 Spring AI Alibaba Graph,开发者可快速构建工作流、多智能体应用,无需关心流程编排、上下文记忆管理等底层实现。通过 Graph 与低代码、自规划智能体结合,为开发者提供从低代码、高代码到零代码构建智能体的更灵活选择。 Spring AI Alibaba 支持与百炼平台深度集成,提供模型接入、RAG 知识库解决方案;支持 ARMS、Langfuse 等可观测产品无缝接入;支持企业级的 MCP 集成,包括 Nacos MCP Registry 分布式注册与发现、自动 Router 路由等。 并且提供了一些开箱即用的智能体产品,如JManus、DeepResearch等。总之,Spring AI Alibaba个人认为是在Java 的大模型应用开发领域提供了一个非常强有力的框架。 对比下Spring AI和Spring AI Alibaba: | 层级 | Spring AI | Spring AI Alibaba | | --- | --- | --- | | 基础层 | ✔️ 模型抽象、Prompt、Embedding、RAG | ✔️ 完全继承 | | 编排层 | ❌ 无 | ✔️ Graph 工作流引擎 | | 智能体层 | ❌ 需手动实现 | ✔️ 内置 Agent/Multi-Agent 框架 | | 生态层 | ✔️ 国际模型 | ✔️ + 阿里云全栈集成 | | 企业层 | ❌ 弱 | ✔️ 可观测、治理、稳定、安全 |

(关于Spring AI Alibaba的应用,是我们本课程的重点,后面会有更多介绍)

LangChain4j

之前我们介绍过Spring AI,其实LangChain4J的作用和Spring AI差不多,就是让我们在Java代码中可以更方便的做大模型应用开发,更好的用上我们之前讲过的提示词工程、提示词模板、对话记忆、结构化输出,以及实现RAG、Agent、MCP等功能的。所以Spring AI中有的东西,LangChain4J也几乎都有的。 与其说他是对标Spring AI的, 不如说他其实是对标Langchain的,他其实是langchain的java版,毕竟他出现的时间其实是比spring还要早的。 LangChain4j整体为开发者提供了两种层次的抽象接口: 1.低层次:提供了如下Basics(大模型、提示词模版、模型记忆等)和RAG(向量模型、向量数据库、文本载入分割工具)两类低层次接口,开发者从而能够灵活的实现这些接口并根据自己的需求进行组合,定制化自己的大模型应用。 2.高层次:为了让Java开发者可以更加关注业务逻辑而不是这些底层实现,LangChain4J提供了两个高层次的API: - Chains:包括Chains和AI Services两种类别,Chains源于Langchain,相当于将低层次模块组合起来,形成一些固定的处理流程,并协调它们之间的交互。 - AI Service:AI Services是LangChain4J为 Java 量身定制的解决方案,和Spring Data JPA类似,只需要显示的定义接口,并且可以自定义的加入Memory、Tools或者RAG,具体调用逻辑实现由LangChain4j代理完成。 (关于Langchain4j的更多应用,以及API的使用,后面会有单独章节介绍)

Spring AI & Spring AI Alibaba & Langchain4j

能力 LangChain4j Spring AI Spring AI Alibaba
是否依赖 Spring ❌ 可独立使用 ✔️ 深度集成 ✔️ 深度集成
Prompt 模板 ✔️ Mustache 风格 ✔️ 类似 Thymeleaf ✔️ 继承 Spring AI
结构化输出 ✔️ 强(JSON Schema) ✔️ 基础支持 ✔️ 增强版
RAG 支持 ✔️ 全链路 ✔️ 基础 ✔️ 企业级增强
智能体(Agent) ✔️ 内置 ReAct 等 ❌ 需手动实现 ✔️ Graph + Multi-Agent
工作流编排 ⚠️ 简单 Chain ❌ 无 ✔️ Graph 引擎(核心优势)
阿里云集成 ✔️ Qwen/DashScope ❌ 无官方支持 ✔️ 深度集成(百炼、OSS、Nacos)
生产可观测性 ⚠️ 需自行集成 ✔️ Micrometer ✔️ ARMS/SLS 原生

非 Spring 的纯Java项目项目→ 选 LangChain4j 需要快速原型验证,且熟悉 LangChain 概念 → 选 LangChain4j 已有 Spring Boot 项目,只需简单 LLM 调用或 RAG → 选 Spring AI 构建企业级、多步骤、多角色协作的 AI 应用 → 选 Spring AI Alibaba 想用 Java 但又想要接近 Python LangChain 的体验 → LangChain4j 是最佳选择

版本提示

模型、框架与接口会持续变化。涉及版本号、参数与生产配置时,请在实践前对照对应官方文档。

LLMentor系统化学习大模型应用工程

内容来自个人课程知识库备份,并经过结构化整理。技术版本持续演进,生产使用前请结合官方文档验证。