
本文详解如何在Java中使用OpenAI官方SDK配合OkHttp实现/chat/completions接口的流式响应(stream=true),支持实时逐字输出、低延迟交互,并提供可运行的完整示例与关键注意事项。
本文详解如何在java中使用openai官方sdk配合okhttp实现`/chat/completions`接口的流式响应(stream=true),支持实时逐字输出、低延迟交互,并提供可运行的完整示例与关键注意事项。
在构建类ChatGPT的终端对话应用时,流式响应(Streaming)是提升用户体验的关键能力:它避免用户长时间等待完整响应,实现“边生成、边显示”的自然交互效果。OpenAI 的 /v1/chat/completions 接口通过设置 stream=true 支持服务端事件流(SSE),而 Java 生态中推荐采用 com.theokanning.openai 官方兼容SDK(底层基于 OkHttp + RxJava)来优雅处理该流式数据。
以下是一个生产就绪的 Java 流式调用示例,已通过 OpenAI Java SDK v0.14.0+ 验证:
import com.theokanning.openai.completion.chat.*;
import com.theokanning.openai.service.OpenAiService;
import io.reactivex.Flowable;
import java.util.*;
public class StreamingChatExample {
private static final OpenAiService service = new OpenAiService("sk-xxx-your-api-key");
public static void main(String[] args) {
System.out.println("? 启动流式对话(输入 'exit' 退出):");
Scanner scanner = new Scanner(System.in);
// 初始化对话历史(角色需严格区分 user / assistant)
List<ChatMessage> messages = new ArrayList<>();
while (true) {
System.out.print("? 你:");
String userInput = scanner.nextLine().trim();
if ("exit".equalsIgnoreCase(userInput)) break;
messages.add(new ChatMessage(ChatMessageRole.USER.value(), userInput));
// 构建流式请求
ChatCompletionRequest request = ChatCompletionRequest.builder()
.model("gpt-3.5-turbo") // 或 "gpt-4-turbo"
.messages(messages)
.stream(true) // ✅ 必须显式启用流式
.maxTokens(1024)
.temperature(0.7)
.build();
// 发起流式调用(返回 Flowable<ChatCompletionChunk>)
Flowable<ChatCompletionChunk> stream = service.streamChatCompletion(request);
System.out.print("? AI:");
StringBuilder responseBuffer = new StringBuilder();
// 订阅流式数据块
stream.subscribe(
chunk -> {
for (ChatChoice choice : chunk.getChoices()) {
String deltaContent = Optional.ofNullable(choice.getDelta())
.map(ChatMessage::getContent)
.orElse("");
if (!deltaContent.isEmpty()) {
System.out.print(deltaContent); // 实时打印
responseBuffer.append(deltaContent);
}
}
},
error -> {
System.err.println("\n❌ 流式请求失败:" + error.getMessage());
error.printStackTrace();
},
() -> {
System.out.println(); // 换行结束
// 将模型最终回复加入对话历史(角色为 assistant)
messages.add(new ChatMessage(ChatMessageRole.ASSISTANT.value(), responseBuffer.toString()));
}
);
// 等待当前流完成后再接收下一轮输入(阻塞式交互)
try {
Thread.sleep(100); // 微小延迟避免竞态,非必需
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
scanner.close();
service.shutdownExecutor(); // ✅ 释放 OkHttp 连接池与线程池
}
}? 关键要点说明:
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
-
依赖配置(Maven):
<dependency> <groupId>com.theokanning.openai</groupId> <artifactId>openai-service</artifactId> <version>0.14.0</version> <!-- 建议使用最新版 --> </dependency> - stream=true 是核心开关:必须在 ChatCompletionRequest 中显式设置,否则返回单次完整 JSON 响应。
- 数据结构差异:流式响应中,每块 ChatCompletionChunk 的 choice.delta.content 是增量文本(非 choice.message.content),需累加拼接才得完整回复。
- 线程安全注意:Flowable 默认在 IO 线程执行回调,System.out.print() 是线程安全的,但若涉及 UI 更新(如 Swing/JavaFX),需切回主线程。
- 错误处理与重试:实际项目中建议封装 onErrorResumeNext 或结合 RetryWithDelay 实现网络容错。
- 内存与超时控制:可通过 OkHttpClient.Builder 自定义连接/读取超时、最大空闲连接数,防止长连接堆积。
✅ 总结:借助 OpenAI Java SDK 的 streamChatCompletion() 方法,开发者无需手动解析 SSE(Server-Sent Events)原始字节流,即可开箱即用地实现高保真流式对话。配合合理的对话状态管理与异常兜底策略,即可快速构建响应迅速、体验流畅的 AI 交互应用。
立即学习“Java免费学习笔记(深入)”;

















