本文目录导读:

我来为您提供一个完整的Java调用大模型(LLM)的案例,涵盖主流API调用方式。
OpenAI API调用示例
import okhttp3.*;
import com.google.gson.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OpenAIClient {
private static final String API_KEY = "your-api-key";
private static final String API_URL = "https://api.openai.com/v1/chat/completions";
private final OkHttpClient client;
private final Gson gson;
public OpenAIClient() {
this.client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
this.gson = new GsonBuilder().create();
}
/**
* 调用ChatGPT模型
*/
public String chat(String userMessage) throws IOException {
// 构建请求体
JsonObject requestBody = new JsonObject();
requestBody.addProperty("model", "gpt-3.5-turbo");
requestBody.addProperty("temperature", 0.7);
requestBody.addProperty("max_tokens", 1000);
// 添加消息
JsonArray messages = new JsonArray();
JsonObject systemMessage = new JsonObject();
systemMessage.addProperty("role", "system");
systemMessage.addProperty("content", "You are a helpful assistant.");
messages.add(systemMessage);
JsonObject userMsg = new JsonObject();
userMsg.addProperty("role", "user");
userMsg.addProperty("content", userMessage);
messages.add(userMsg);
requestBody.add("messages", messages);
// 构建HTTP请求
Request request = new Request.Builder()
.url(API_URL)
.addHeader("Authorization", "Bearer " + API_KEY)
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(
MediaType.parse("application/json"),
gson.toJson(requestBody)
))
.build();
// 发送请求
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("API调用失败: " + response.code());
}
String responseBody = response.body().string();
return parseResponse(responseBody);
}
}
/**
* 解析响应
*/
private String parseResponse(String jsonResponse) {
JsonObject jsonObject = gson.fromJson(jsonResponse, JsonObject.class);
JsonArray choices = jsonObject.getAsJsonArray("choices");
if (choices.size() > 0) {
JsonObject firstChoice = choices.get(0).getAsJsonObject();
JsonObject message = firstChoice.getAsJsonObject("message");
return message.get("content").getAsString();
}
return "";
}
}
使用Spring Boot封装完整服务
// pom.xml 依赖配置
/*
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
*/
// 配置类
@Configuration
@ConfigurationProperties(prefix = "llm")
@Data
public class LLMConfig {
private String apiKey;
private String baseUrl;
private String model = "gpt-3.5-turbo";
private int maxTokens = 1000;
private double temperature = 0.7;
private int timeoutSeconds = 60;
}
// 服务类
@Service
@Slf4j
public class LLMService {
@Autowired
private LLMConfig config;
private OkHttpClient client;
private Gson gson;
@PostConstruct
public void init() {
this.client = new OkHttpClient.Builder()
.connectTimeout(config.getTimeoutSeconds(), TimeUnit.SECONDS)
.readTimeout(config.getTimeoutSeconds(), TimeUnit.SECONDS)
.writeTimeout(config.getTimeoutSeconds(), TimeUnit.SECONDS)
.build();
this.gson = new GsonBuilder().create();
}
/**
* 基础对话
*/
public ChatResponse chat(ChatRequest request) throws LLMException {
try {
JsonObject payload = buildPayload(request);
Request httpRequest = buildHttpRequest(payload);
try (Response response = client.newCall(httpRequest).execute()) {
if (!response.isSuccessful()) {
throw new LLMException("API调用失败,状态码: " + response.code());
}
String responseBody = response.body().string();
return parseChatResponse(responseBody);
}
} catch (IOException e) {
log.error("LLM调用异常", e);
throw new LLMException("LLM服务调用失败", e);
}
}
/**
* 流式调用
*/
public void chatStream(ChatRequest request, StreamCallback callback) {
try {
JsonObject payload = buildPayload(request);
Request httpRequest = new Request.Builder()
.url(config.getBaseUrl() + "/chat/completions")
.addHeader("Authorization", "Bearer " + config.getApiKey())
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(
MediaType.parse("application/json"),
gson.toJson(payload)
))
.build();
// 异步流式处理
client.newCall(httpRequest).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onError(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
callback.onError(new IOException("HTTP " + response.code()));
return;
}
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(response.body().byteStream()))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("data: ")) {
String data = line.substring(6);
if (!"[DONE]".equals(data)) {
callback.onToken(parseStreamToken(data));
}
}
}
callback.onComplete();
}
}
});
} catch (Exception e) {
callback.onError(e);
}
}
/**
* 构建请求负载
*/
private JsonObject buildPayload(ChatRequest request) {
JsonObject payload = new JsonObject();
payload.addProperty("model", request.getModel() != null ?
request.getModel() : config.getModel());
payload.addProperty("temperature", config.getTemperature());
payload.addProperty("max_tokens", config.getMaxTokens());
JsonArray messages = new JsonArray();
// 添加系统消息
JsonObject systemMsg = new JsonObject();
systemMsg.addProperty("role", "system");
systemMsg.addProperty("content", request.getSystemPrompt() != null ?
request.getSystemPrompt() : "You are a helpful assistant.");
messages.add(systemMsg);
// 添加用户消息(支持多轮对话)
for (Message msg : request.getMessages()) {
JsonObject message = new JsonObject();
message.addProperty("role", msg.getRole());
message.addProperty("content", msg.getContent());
messages.add(message);
}
payload.add("messages", messages);
// 如果需要流式输出
if (request.isStream()) {
payload.addProperty("stream", true);
}
return payload;
}
/**
* 构建HTTP请求
*/
private Request buildHttpRequest(JsonObject payload) {
return new Request.Builder()
.url(config.getBaseUrl() + "/chat/completions")
.addHeader("Authorization", "Bearer " + config.getApiKey())
.addHeader("Content-Type", "application/json")
.post(RequestBody.create(
MediaType.parse("application/json"),
gson.toJson(payload)
))
.build();
}
/**
* 解析聊天响应
*/
private ChatResponse parseChatResponse(String jsonResponse) {
JsonObject jsonObject = gson.fromJson(jsonResponse, JsonObject.class);
ChatResponse chatResponse = new ChatResponse();
// 解析消息
JsonArray choices = jsonObject.getAsJsonArray("choices");
if (choices.size() > 0) {
JsonObject firstChoice = choices.get(0).getAsJsonObject();
JsonObject message = firstChoice.getAsJsonObject("message");
chatResponse.setContent(message.get("content").getAsString());
chatResponse.setRole(message.get("role").getAsString());
}
// 解析使用情况
if (jsonObject.has("usage")) {
JsonObject usage = jsonObject.getAsJsonObject("usage");
UsageInfo usageInfo = new UsageInfo();
usageInfo.setPromptTokens(usage.get("prompt_tokens").getAsInt());
usageInfo.setCompletionTokens(usage.get("completion_tokens").getAsInt());
usageInfo.setTotalTokens(usage.get("total_tokens").getAsInt());
chatResponse.setUsage(usageInfo);
}
// 解析ID和时间戳
if (jsonObject.has("id")) {
chatResponse.setId(jsonObject.get("id").getAsString());
}
if (jsonObject.has("created")) {
chatResponse.setCreated(jsonObject.get("created").getAsLong());
}
return chatResponse;
}
}
// 请求模型类
@Data
@Builder
public class ChatRequest {
private String systemPrompt;
private List<Message> messages;
private String model;
private boolean stream;
public static ChatRequestBuilder of() {
return ChatRequest.builder();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
private String role; // "user", "assistant", "system"
private String content;
}
// 响应模型类
@Data
public class ChatResponse {
private String id;
private String role;
private String content;
private long created;
private UsageInfo usage;
}
@Data
public class UsageInfo {
private int promptTokens;
private int completionTokens;
private int totalTokens;
}
// 异常类
public class LLMException extends Exception {
public LLMException(String message) {
super(message);
}
public LLMException(String message, Throwable cause) {
super(message, cause);
}
}
// 流式回调接口
public interface StreamCallback {
void onToken(String token);
void onComplete();
void onError(Exception e);
}
控制器使用示例
@RestController
@RequestMapping("/api/llm")
@Slf4j
public class LLMController {
@Autowired
private LLMService llmService;
/**
* 简单对话接口
*/
@PostMapping("/chat")
public ResponseEntity<ChatResponse> chat(@RequestBody ChatRequest request) {
try {
ChatResponse response = llmService.chat(request);
return ResponseEntity.ok(response);
} catch (LLMException e) {
log.error("LLM调用失败", e);
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body(null);
}
}
/**
* 流式对话接口
*/
@PostMapping("/chat/stream")
public ResponseEntity<ChatResponse> chatStream(@RequestBody ChatRequest request) {
try {
// 这里可以改为异步处理和SSE推送
ChatResponse response = llmService.chat(request);
return ResponseEntity.ok(response);
} catch (LLMException e) {
log.error("LLM调用失败", e);
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body(null);
}
}
/**
* 测试接口
*/
@GetMapping("/test")
public String test() {
ChatRequest request = ChatRequest.of()
.messages(Arrays.asList(
new Message("user", "你好,请介绍一下你自己")
))
.build();
try {
ChatResponse response = llmService.chat(request);
return response.getContent();
} catch (LLMException e) {
return "调用失败: " + e.getMessage();
}
}
}
配置文件
# application.yml
llm:
api-key: your-api-key-here
base-url: https://api.openai.com/v1
model: gpt-3.5-turbo
max-tokens: 1000
temperature: 0.7
timeout-seconds: 60
spring:
application:
name: llm-spring-boot-demo
使用示例
// 测试调用
public class LLMTest {
public static void main(String[] args) {
OpenAIClient client = new OpenAIClient();
try {
String response = client.chat("解释一下什么是机器学习?");
System.out.println("响应: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意事项
- API密钥安全:不要在代码中硬编码API密钥,应使用环境变量或配置中心
- 错误处理:实现完善的错误重试机制和降级策略
- 限流控制:注意API调用的频率限制
- 数据安全:敏感数据不要发送到LLM服务
- 成本控制:合理设置max_tokens和缓存策略
- 并发处理:使用线程池管理并发请求
这个案例提供了完整的Java调用大模型的实现,可以根据实际需求调整适配不同的LLM服务提供商(如OpenAI、Anthropic、百度文心等)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播