文本是《AI咨询(共32篇)》专题的第 24 篇。阅读本文前,建议先阅读前面的文章:
- 1.Gemini 3.0 要掀桌子了?它到底能不能影响到 GPT 和 Claude——以及**
- 2.🤖到底哪种AI才适合你?
- 3.Claude”全能模型”?我来给你扒一扒他的真实战力
- 4.为什么国内模型这么多,还是有很多人用国外的模型?
- 5.2025编程AI模型终极省钱指南:又便宜又能干的”码农助手”怎么选?
- 6.AI小白选择指南:别慌,我教你
- 7.公司批量跑图片数据?2025年最新模型全景选型指南
- 8.AI模型这么多,我难道要一个一个接入?
- 9.纯小白的大模型API使用指南:从”这是啥”到”我会了”
- 10.AI赋能企业:从”人工智障”到”人工智能”的华丽转身
- 11.AI酒馆玩家必读:API中转站的六大核心优势
- 12.Claude Code写代码的好处:让AI当你的编程助手
- 13.Gemini 3全面评测:比Gemini 2.5强在哪?性能对比+实战测试【2025最新】
- 14.详细教程:国内调用 Google Gemini 3.0 Pro API 接口(附 Python 示例)
- 15.🚀 Claude Opus 4.5:Anthropic 2025年发布的旗舰级AI模型,全面升级!
- 16.🚀 Claude Opus 4.5 横空出世,国内调用教程(附 Python 示例)
- 17.无需翻墙!YibuAPI中转站带你直连Google Gemini 3,多模态AI能力即刻解锁
- 18.Google Gemini 3.0 Pro国内接入指南:API中转破解三重困境
- 19.最全 调用 Gemini 3.0 Pro 完整教程-附完整python代码(2025最新版)
- 20.🚀 Google Gemini 3.0 Pro国内直连:API中转破困境,3步接入教程
- 21.GPT-5:国内开发者零门槛接入指南,低价多模态API实战方案
- 22.Gemini3:国内开发者零门槛接入指南,原生多模态 API 实战方案
- 23.Claude 4合规接入教程:国内支付+250万Token免费领,多模态API实战
在大模型技术席卷各行各业的当下,将大模型能力集成到Java项目中,已成为提升产品智能化水平的重要手段。无论是智能客服、内容生成,还是代码辅助、数据分析,通过调用大模型API都能快速实现核心功能。本文将从实战角度出发,完整拆解Java项目调用大模型API的全流程,涵盖环境准备、核心代码实现、多场景适配、生产级优化等关键环节,同时分享避坑经验,助力开发者快速落地。
一、实战前置:理清核心逻辑与准备工作
在动手编码前,我们需要先明确Java调用大模型API的核心逻辑:本质是通过HTTP请求与大模型服务端建立通信,按照API规范构造请求参数,接收并解析响应结果。不同厂商的大模型API(如一步API,OpenAI)在请求格式、认证方式上存在差异,但核心流程一致。本次实战将以OpenAI GPT-3.5/4为例,同时提供国内大模型的适配方案。

1.1 环境与工具准备
工欲善其事,必先利其器。本次实战所需环境与工具如下:
-
JDK版本:推荐JDK 8及以上(兼容性更广,适配多数企业级项目);
-
构建工具:Maven 3.6+(用于依赖管理,简化项目配置);
-
HTTP客户端:OkHttp(高效稳定,支持异步请求,适合生产环境);
-
JSON处理:Jackson(Java生态主流JSON解析工具,支持对象与JSON快速转换);
-
API密钥:需提前在对应大模型厂商官网申请(如OpenAI官网、一步AI开放平台);
-
开发工具:IntelliJ IDEA(或Eclipse),搭配Postman辅助接口调试。
1.2 核心依赖配置
在Maven项目的pom.xml文件中,引入所需核心依赖。需注意依赖版本的兼容性,避免出现冲突。具体配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.llm.demo</groupId>
<artifactId>java-llm-api-practice</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<okhttp.version>4.12.0</okhttp.version>
<jackson.version>2.15.2</jackson.version>
<spring-boot.version>2.7.15</spring-boot.version>
</properties>
<dependencies>
<!-- OkHttp HTTP客户端 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
<!-- Jackson JSON处理 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- Spring Boot 核心(简化配置读取与项目启动) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 日志框架(便于调试与问题排查) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.8</version>
</dependency>
</dependencies>
</project>
二、核心实现:从数据模型到API调用工具类
核心实现环节需遵循“先定义数据模型,再封装调用工具”的逻辑。数据模型需严格对应大模型API的请求/响应格式,调用工具类则负责封装HTTP请求、认证、异常处理等通用逻辑,提升代码复用性。
2.1 数据模型定义
以OpenAI Chat Completions API为例,其请求体包含模型名称、消息列表、温度等参数,响应体包含对话ID、生成内容、Token用量等信息。我们使用Lombok的@Data注解简化getter/setter方法编写,通过@JsonProperty注解指定JSON字段名,确保序列化/反序列化正常。
2.1.1 消息体模型(Message.java)
消息体是对话的核心单元,包含角色(system/user/assistant)和内容两个关键字段。system角色用于设定大模型的行为,user角色为用户输入,assistant角色为大模型响应。
package com.llm.demo.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 对话消息体模型
* 角色说明:
* - system:系统指令,用于定义大模型的行为
* - user:用户输入的问题/指令
* - assistant:大模型生成的响应内容
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
@JsonProperty("role")
private String role;
@JsonProperty("content")
private String content;
}
2.1.2 请求体模型(ChatRequest.java)
请求体封装调用大模型所需的全部参数,核心参数包括模型名称、消息列表、温度(控制生成内容的随机性,0~2之间)、最大Token数(控制响应长度)。
package com.llm.demo.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 大模型API请求体模型
*/
@Data
public class ChatRequest {
/**
* 大模型名称(如gpt-3.5-turbo、gpt-4)
*/
@JsonProperty("model")
private String model;
/**
* 对话消息列表(包含历史对话上下文)
*/
@JsonProperty("messages")
private List<Message> messages;
/**
* 温度:值越高,生成内容越随机;值越低,生成内容越严谨
*/
@JsonProperty("temperature")
private Double temperature;
/**
* 最大生成Token数:控制响应内容的长度,避免超出额度
*/
@JsonProperty("max_tokens")
private Integer maxTokens;
}
2.1.3 响应体模型(ChatResponse.java)
响应体对应大模型返回的结果,包含对话ID、生成时间、响应内容列表、Token用量等信息。其中choices字段为响应内容列表,通常取第一个元素即为核心响应结果。
package com.llm.demo.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* 大模型API响应体模型
*/
@Data
public class ChatResponse {
@JsonProperty("id")
private String id;
@JsonProperty("object")
private String object;
@JsonProperty("created")
private Long created;
@JsonProperty("model")
private String model;
@JsonProperty("choices")
private List<Choice> choices;
@JsonProperty("usage")
private Usage usage;
/**
* 响应内容详情
*/
@Data
public static class Choice {
@JsonProperty("index")
private Integer index;
@JsonProperty("message")
private Message message;
@JsonProperty("finish_reason")
private String finishReason;
}
}
2.1.4 Token用量模型(Usage.java)
用量模型用于统计本次调用的Token消耗,包括请求Token数、响应Token数、总Token数,便于成本控制和额度管理。
package com.llm.demo.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* Token用量统计模型
*/
@Data
public class Usage {
@JsonProperty("prompt_tokens")
private Integer promptTokens;
@JsonProperty("completion_tokens")
private Integer completionTokens;
@JsonProperty("total_tokens")
private Integer totalTokens;
}
2.2 核心调用工具类封装
工具类(OpenAIClient.java)是调用逻辑的核心,负责封装OkHttp客户端配置、请求构造、认证处理、响应解析、异常处理等功能。为适配不同场景,我们提供单轮对话和多轮对话两种方法,其中多轮对话支持上下文关联。
package com.llm.demo.client;
import com.llm.demo.model.ChatRequest;
import com.llm.demo.model.ChatResponse;
import com.llm.demo.model.Message;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* OpenAI大模型API调用工具类
* 封装通用调用逻辑,支持单轮/多轮对话
*/
@Component
public class OpenAIClient {
private static final Logger log = LoggerFactory.getLogger(OpenAIClient.class);
// JSON序列化/反序列化工具
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
// OkHttp客户端配置:设置超时时间,避免请求阻塞
private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS) // 连接超时
.readTimeout(60, TimeUnit.SECONDS) // 读取超时
.writeTimeout(30, TimeUnit.SECONDS) // 写入超时
.retryOnConnectionFailure(true) // 连接失败自动重试
.build();
// 从配置文件读取API密钥(避免硬编码,提升安全性)
@Value("${llm.openai.api.key}")
private String apiKey;
// 从配置文件读取API地址
@Value("${llm.openai.api.url}")
private String apiUrl;
// 从配置文件读取模型名称
@Value("${llm.openai.model}")
private String model;
// 从配置文件读取温度参数
@Value("${llm.openai.temperature}")
private Double temperature;
// 从配置文件读取最大Token数
@Value("${llm.openai.max-tokens}")
private Integer maxTokens;
/**
* 单轮对话调用(无上下文关联)
* @param userMessage 用户输入内容
* @return 大模型响应内容
* @throws IOException 网络异常或解析异常
*/
public String singleChat(String userMessage) throws IOException {
// 1. 构造请求体
ChatRequest request = new ChatRequest();
request.setModel(model);
request.setTemperature(temperature);
request.setMaxTokens(maxTokens);
// 构建消息列表:仅包含用户输入
request.setMessages(Collections.singletonList(
new Message("user", userMessage)
));
// 2. 构造HTTP请求
String requestJson = OBJECT_MAPPER.writeValueAsString(request);
Request httpRequest = new Request.Builder()
.url(apiUrl)
.post(RequestBody.create(MediaType.parse("application/json"), requestJson))
.addHeader("Authorization", "Bearer " + apiKey) // 认证方式:Bearer Token
.addHeader("Content-Type", "application/json")
.build();
// 3. 发送请求并处理响应
try (Response response = OK_HTTP_CLIENT.newCall(httpRequest).execute()) {
return handleResponse(response);
}
}
/**
* 多轮对话调用(支持上下文关联)
* @param historyMessages 历史对话消息列表(包含system/user/assistant角色消息)
* @return 大模型响应内容
* @throws IOException 网络异常或解析异常
*/
public String multiChat(List<Message> historyMessages) throws IOException {
// 1. 构造请求体
ChatRequest request = new ChatRequest();
request.setModel(model);
request.setTemperature(temperature);
request.setMaxTokens(maxTokens);
request.setMessages(historyMessages); // 传入历史对话上下文
// 2. 构造HTTP请求
String requestJson = OBJECT_MAPPER.writeValueAsString(request);
Request httpRequest = new Request.Builder()
.url(apiUrl)
.post(RequestBody.create(MediaType.parse("application/json"), requestJson))
.addHeader("Authorization", "Bearer " + apiKey)
.addHeader("Content-Type", "application/json")
.build();
// 3. 发送请求并处理响应
try (Response response = OK_HTTP_CLIENT.newCall(httpRequest).execute()) {
return handleResponse(response);
}
}
/**
* 响应统一处理:解析响应结果,处理异常状态码
* @param response OkHttp响应对象
* @return 大模型响应内容
* @throws IOException 异常信息
*/
private String handleResponse(Response response) throws IOException {
if (!response.isSuccessful()) {
// 处理异常状态码(如401未授权、429频率超限、500服务端错误)
String errorMsg = response.body() != null ? response.body().string() : "未知错误";
log.error("调用大模型API失败,状态码:{},错误信息:{}", response.code(), errorMsg);
throw new IOException("API调用失败,状态码:" + response.code() + ",错误信息:" + errorMsg);
}
// 解析响应JSON,提取核心内容
String responseJson = response.body().string();
ChatResponse chatResponse = OBJECT_MAPPER.readValue(responseJson, ChatResponse.class);
// 校验响应内容有效性
if (chatResponse.getChoices() == null || chatResponse.getChoices().isEmpty()) {
log.error("大模型响应无有效内容,响应JSON:{}", responseJson);
throw new IOException("大模型响应无有效内容");
}
// 打印Token用量,便于成本控制
Usage usage = chatResponse.getUsage();
log.info("本次调用Token用量:请求{}个,响应{}个,总计{}个",
usage.getPromptTokens(), usage.getCompletionTokens(), usage.getTotalTokens());
// 返回大模型生成的核心内容
return chatResponse.getChoices().get(0).getMessage().getContent();
}
}
2.3 配置文件与启动类
为提升配置灵活性,我们将API密钥、模型名称等参数存入application.properties配置文件,避免硬编码。启动类采用Spring Boot方式,简化项目启动流程。
2.3.1 配置文件(application.properties)
# OpenAI大模型配置
llm.openai.api.key=your-openai-api-key # 替换为你的API密钥
llm.openai.api.url=https://yibuapi.com/v1/chat/completions
llm.openai.model=gpt-3.5-turbo
llm.openai.temperature=0.7 # 适中的随机性,兼顾准确性与灵活性
llm.openai.max-tokens=2048 # 最大响应长度,根据需求调整
2.3.2 启动类(LlmApiDemoApplication.java)
package com.llm.demo;
import com.llm.demo.client.OpenAIClient;
import com.llm.demo.model.Message;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 大模型API调用实战Demo启动类
*/
@SpringBootApplication
public class LlmApiDemoApplication {
public static void main(String[] args) throws IOException {
// 启动Spring上下文,获取Bean
ConfigurableApplicationContext context = SpringApplication.run(LlmApiDemoApplication.class, args);
OpenAIClient openAIClient = context.getBean(OpenAIClient.class);
// 测试1:单轮对话(无上下文)
System.out.println("===== 单轮对话测试 =====");
String singleResponse = openAIClient.singleChat("请用Java实现单例模式的懒汉式写法,并说明线程安全问题");
System.out.println("大模型响应:\n" + singleResponse + "\n");
// 测试2:多轮对话(带上下文)
System.out.println("===== 多轮对话测试 =====");
List<Message> historyMessages = new ArrayList<>();
// 1. 添加系统指令:定义大模型行为
historyMessages.add(new Message("system", "你是一名资深Java开发工程师,回答简洁准确,重点突出技术细节"));
// 2. 第一轮用户提问
historyMessages.add(new Message("user", "请用Java实现多线程下载文件的功能"));
String firstResponse = openAIClient.multiChat(historyMessages);
System.out.println("第一轮响应:\n" + firstResponse + "\n");
// 3. 第二轮追问(基于上下文):优化第一轮代码
historyMessages.add(new Message("assistant", firstResponse)); // 将大模型响应加入上下文
historyMessages.add(new Message("user", "如何优化这个代码,提升下载效率并保证线程安全?"));
String secondResponse = openAIClient.multiChat(historyMessages);
System.out.println("第二轮响应:\n" + secondResponse + "\n");
// 关闭Spring上下文
context.close();
}
}
三、场景适配:国内大模型对接方案
由于网络环境或业务需求,很多开发者需要对接国内大模型(如一步AI、百度文心一言、阿里云通义千问)。多数国内大模型API采用与OpenAI兼容的设计,只需少量修改即可适配。以下以一步AI GLM-4为例,说明适配步骤。
3.1 适配核心步骤
-
修改配置文件:替换API密钥、API地址、模型名称;
-
验证认证方式:国内大模型多采用Bearer Token认证,与OpenAI一致,无需修改代码;
-
检查请求/响应格式:若格式完全兼容,无需修改数据模型;若存在差异,微调模型字段即可。
3.2 一步AI适配示例(application.properties)
# 一步AI GLM-4配置
llm.openai.api.key=your-glm-api-key # 替换为你的一步AI API密钥
llm.openai.api.url=https://yibuapi.com/api/paas/v4/chat/completions
llm.openai.model=glm-4 # 一步AI模型名称
llm.openai.temperature=0.7
llm.openai.max-tokens=2048
由于一步AI的请求/响应格式与OpenAI完全兼容,上述配置修改完成后,无需改动核心代码即可直接调用。
四、生产级优化:避坑指南与性能提升
上述Demo可满足开发测试需求,但在生产环境中,需针对稳定性、安全性、性能等方面进行优化。以下是关键优化点与避坑经验。
4.1 安全性优化
-
密钥安全:绝对避免将API密钥硬编码到代码中,推荐使用环境变量、配置中心(如Nacos、Apollo)或加密存储,防止密钥泄露;
-
请求校验:对用户输入的内容进行校验和过滤,避免恶意输入(如注入攻击),同时限制请求频率和单次请求长度,防止滥用。
4.2 稳定性优化
-
重试机制:针对网络波动、服务端临时错误(如503),添加重试机制,可使用OkHttp的重试配置或结合Spring Retry实现,注意设置重试次数和间隔,避免雪崩;
-
熔断降级:使用Sentinel、Resilience4j等框架实现熔断降级,当大模型API出现持续异常时,及时熔断,避免影响整个系统;
-
超时控制:根据实际网络情况调整超时时间,避免请求长时间阻塞,同时设置合理的连接池大小,提升并发处理能力。
4.3 性能与成本优化
-
上下文管理:多轮对话中,合理裁剪历史消息,只保留关键上下文,避免Token用量过多导致成本上升和响应变慢;
-
批量调用:若存在大量小请求,可尝试批量调用(需大模型API支持),减少HTTP请求次数,提升效率;
-
模型选择:根据业务需求选择合适的模型,非核心场景可使用轻量模型(如gpt-3.5-turbo),降低成本,提升响应速度。
4.4 常见坑与解决方案
-
401未授权:检查API密钥是否正确,是否存在空格或特殊字符,部分国内大模型需在密钥前添加特定前缀,需仔细阅读官方文档;
-
429频率超限:大模型API通常有调用频率限制,需添加限流机制,或联系厂商提升额度;
-
响应解析失败:检查数据模型与API响应格式是否一致,重点关注字段名、数据类型,部分API返回的字段可能存在大小写差异;
-
国内网络访问问题:对接OpenAI等国外大模型时,需配置合法代理,或选择国内代理服务,避免网络不通。
五、总结与扩展
本文从实战角度出发,完整实现了Java项目调用大模型API的全流程,涵盖环境准备、数据模型定义、核心工具类封装、场景测试、国内大模型适配及生产级优化等关键环节。通过本文的方案,开发者可快速将大模型能力集成到Java项目中,同时规避常见问题,保障系统稳定运行。
后续可根据业务需求进行扩展,例如:实现流式响应(实时获取大模型生成的内容,提升用户体验)、集成向量数据库实现知识库问答、开发可视化界面简化调用流程等。随着大模型技术的不断发展,未来还可探索本地部署轻量模型、模型微调等更深入的应用场景,进一步提升系统的智能化水平。
您已阅读完《AI咨询(共32篇)》专题的第 24 篇。请继续阅读该专题下面的文章:
