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

我们要讲的是基于Java的大模型应用开发,那么就需要介绍下在java中怎么和大模型交互。



坐稳扶好,正式开始进入代码部分了。**(注意, 我们的项目JDK要求最低是JDK17,建议用JDK 21)**



在前面介绍百炼的时候,我们讲过,可以通过curl来调用模型的:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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实现一个大模型的调用



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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:

Column 1 Column 2 Column 3
层级 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



Column 1 Column 2 Column 3 Column 4
能力 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 是最佳选择