Java 调用大模型 API 实战:从 OpenAI 协议到 SiliconFlow 流式响应解析
SiliconFlow 平台兼容 OpenAI 的 Chat Completions API 协议这意味着在 Java 中调用 SiliconFlow 的大模型如 Qwen、Llama 等与调用 OpenAI GPT 模型的代码逻辑高度相似。核心区别仅在于 baseURL接口地址、apiKey密钥以及 model模型名称。以下是使用 Java 原生 HTTP 客户端Java 11 内置 java.net.http和 Gson 库实现的完整实战示例包含非流式同步和流式SSE两种调用方式。核心实现要点协议兼容请求体结构遵循 OpenAI 标准包含 model, messages, stream 等字段。流式解析流式响应基于 Server-Sent Events (SSE) 协议数据以 data: {…} 格式逐行推送需解析 delta.content 并拼接直到遇到 [DONE] 标记。**依赖管理**仅需引入 Gson 用于 JSON 序列化/反序列化HTTP 请求使用 JDK 内置库无需额外引入 OkHttp 或 Apache HttpClient降低项目依赖复杂度。pom文件引入依赖?xml version1.0encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.example/groupIdartifactIdsiliconflow-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencies!--GsonforJSONprocessing--dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.10.1/version/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.1/versionconfigurationsource17/sourcetarget17/target/configuration/pluginplugingroupIdorg.codehaus.mojo/groupIdartifactIdexec-maven-plugin/artifactIdversion3.1.0/versionconfigurationmainClasscom.example.SiliconFlowClient/mainClass/configuration/plugin/plugins/build/project代码实现packagecom.example;importcom.google.gson.Gson;importcom.google.gson.JsonObject;importcom.google.gson.JsonArray;importcom.google.gson.JsonElement;importcom.google.gson.JsonParser;importjava.io.BufferedReader;importjava.io.IOException;importjava.net.URI;importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.nio.charset.StandardCharsets;importjava.util.HashMap;importjava.util.Map;/** * SiliconFlow API 调用示例 * 兼容 OpenAI 协议支持非流式和流式输出 */publicclassSiliconFlowClient{// 请替换为你的 SiliconFlow API KeyprivatestaticfinalStringAPI_KEYYOUR_SILICONFLOW_API_KEY;// SiliconFlow 兼容 OpenAI 的接口地址privatestaticfinalStringBASE_URLhttps://api.siliconflow.cn/v1/chat/completions;// 使用的模型例如 Qwen/Qwen2.5-7B-InstructprivatestaticfinalStringMODELQwen/Qwen2.5-7B-Instruct;privatestaticfinalGsongsonnewGson();privatestaticfinalHttpClienthttpClientHttpClient.newBuilder().build();publicstaticvoidmain(String[]args){System.out.println( 开始测试 SiliconFlow API );// 1. 测试非流式调用System.out.println(\n--- 1. 非流式调用 (Sync) ---);StringnonStreamResponsecallNonStream(你好请介绍一下你自己。);System.out.println(完整回答: nonStreamResponse);// 2. 测试流式调用System.out.println(\n--- 2. 流式调用 (Stream) ---);callStream(请用Python写一个快速排序算法。);}/** * 非流式调用一次性获取完整响应 */publicstaticStringcallNonStream(StringuserMessage){try{// 构建请求体MapString,ObjectrequestBodynewHashMap();requestBody.put(model,MODEL);requestBody.put(stream,false);// 构建 messagesJsonArraymessagesnewJsonArray();JsonObjectsystemMsgnewJsonObject();systemMsg.addProperty(role,system);systemMsg.addProperty(content,你是一个有用的AI助手。);messages.add(systemMsg);JsonObjectuserMsgnewJsonObject();userMsg.addProperty(role,user);userMsg.addProperty(content,userMessage);messages.add(userMsg);requestBody.put(messages,messages);StringjsonBodygson.toJson(requestBody);// 创建 HTTP 请求HttpRequestrequestHttpRequest.newBuilder().uri(URI.create(BASE_URL)).header(Content-Type,application/json).header(Authorization,Bearer API_KEY).POST(HttpRequest.BodyPublishers.ofString(jsonBody,StandardCharsets.UTF_8)).build();// 发送请求并获取响应HttpResponseStringresponsehttpClient.send(request,HttpResponse.BodyHandlers.ofString());if(response.statusCode()!200){thrownewRuntimeException(API 请求失败: response.statusCode() - response.body());}// 解析响应JsonObjectjsonResponseJsonParser.parseString(response.body()).getAsJsonObject();JsonArraychoicesjsonResponse.getAsJsonArray(choices);if(choices!null!choices.isEmpty()){JsonObjectmessagechoices.get(0).getAsJsonObject().getAsJsonObject(message);returnmessage.get(content).getAsString();}return无返回内容;}catch(Exceptione){e.printStackTrace();return发生错误: e.getMessage();}}/** * 流式调用实时逐字输出响应 */publicstaticvoidcallStream(StringuserMessage){try{// 构建请求体MapString,ObjectrequestBodynewHashMap();requestBody.put(model,MODEL);requestBody.put(stream,true);// 开启流式JsonArraymessagesnewJsonArray();JsonObjectuserMsgnewJsonObject();userMsg.addProperty(role,user);userMsg.addProperty(content,userMessage);messages.add(userMsg);requestBody.put(messages,messages);StringjsonBodygson.toJson(requestBody);// 创建 HTTP 请求HttpRequestrequestHttpRequest.newBuilder().uri(URI.create(BASE_URL)).header(Content-Type,application/json).header(Authorization,Bearer API_KEY).POST(HttpRequest.BodyPublishers.ofString(jsonBody,StandardCharsets.UTF_8)).build();// 发送异步流式请求httpClient.sendAsync(request,HttpResponse.BodyHandlers.ofLines()).thenAccept(response-{if(response.statusCode()!200){System.err.println(API 请求失败: response.statusCode());return;}// 处理每一行 SSE 数据response.body().forEach(line-{if(line.startsWith(data: )){Stringdataline.substring(6);if([DONE].equals(data)){System.out.println(\n[流式传输结束]);return;}try{JsonObjectjsonJsonParser.parseString(data).getAsJsonObject();JsonArraychoicesjson.getAsJsonArray(choices);if(choices!null!choices.isEmpty()){JsonObjectdeltachoices.get(0).getAsJsonObject().getAsJsonObject(delta);if(delta.has(content)){Stringcontentdelta.get(content).getAsString();// 实时打印内容模拟打字机效果System.out.print(content);}}}catch(Exceptione){// 忽略解析错误有时空行或格式异常}}});}).join();// 等待完成}catch(Exceptione){e.printStackTrace();}}}代码功能与特点说明零额外 HTTP 依赖利用 Java 11 引入的 java.net.http.HttpClient无需引入 OkHttp 或 Apache HttpClient简化了 Maven 依赖结构适合轻量级集成。标准 OpenAI 协议适配请求体构造完全符合 OpenAI Chat Completions 规范只需修改 BASE_URL 和 API_KEY 即可无缝切换至 SiliconFlow 或其他兼容平台如 DeepSeek、阿里云百炼等。双模式支持非流式 (callNonStream)适用于后台批量处理、日志分析等不需要实时交互的场景代码逻辑简单直接解析完整 JSON。流式 (callStream)适用于聊天机器人、实时问答等前端交互场景。通过 HttpResponse.BodyHandlers.ofLines() 处理 SSE 流逐行解析 data: 前缀的内容提取 delta.content 实现低延迟的“打字机”输出效果。健壮的错误处理包含 HTTP 状态码检查针对流式解析中的异常如空行、格式错误进行了捕获处理确保程序不会因为单个数据片段的解析失败而崩溃。可扩展性messages 数组支持多轮对话上下文维护只需在调用前将历史对话记录加入 JsonArray 即可实现记忆功能。