Java使用HTTP、SSE接收大模型流式响应
获取到大模型返回的逐条流式数据后,可通过Java+SSE单向把数据返回给前端,可直接将分词结果响应到页面或模型对话框里,详情可以看这篇文章。使用Java+SSE实现大模型流式返回前端(完整代码+优化方案)
·
HTTP长连接技术实现方案
HTTP流式传输实现(通用方案)
Java8+ HttpURLConnection实现示例:
public void streamRequest(String apiUrl, String requestBody) throws IOException {
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept", "text/event-stream");
try (OutputStream os = conn.getOutputStream()) {
os.write(requestBody.getBytes());
os.flush();
}
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
String line;
StringBuilder chunk = new StringBuilder();
while ((line = reader.readLine()) != null) {
chunk.append(line);
if (line.equals("")) {
processCompleteChunk(chunk.toString());
chunk.setLength(0);
}
}
}
}
Java11+ HttpClient实现示例:
public void asyncStreamRequest() throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.ai-model.com/stream"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"prompt\":\"Hello\"}"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
.thenAccept(response -> {
try (InputStream is = response.body();
BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
String line;
while ((line = reader.readLine()) != null) {
if (!line.startsWith("data: ")) continue;
String json = line.substring(6).trim();
if ("[DONE]".equals(json)) break;
processChunk(json);
}
} catch (IOException e) {
e.printStackTrace();
}
});
}
SSE客户端实现方案
Maven依赖配置:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>3.1.1</version>
</dependency>
SSE客户端实现代码:
public class SseClient {
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://ai-service/stream");
SseEventSource eventSource = SseEventSource.target(target).build();
eventSource.register(event -> {
if (!event.isEmpty()) {
String data = event.readData(String.class);
System.out.println("Received event: " + data);
}
}, ex -> {
System.err.println("Error: " + ex.getMessage());
});
eventSource.open();
try { Thread.sleep(60_000); }
catch (InterruptedException e) { /* 处理中断 */ }
eventSource.close();
}
}
生产环境优化策略
连接池配置示例:
HttpClient client = HttpClient.newBuilder()
.executor(Executors.newVirtualThreadPerTaskExecutor())
.connectTimeout(Duration.ofSeconds(30))
.version(HttpClient.Version.HTTP_2)
.build();
异常重试策略:
RetryConfig config = RetryConfig.custom()
.maxAttempts(3)
.waitDuration(Duration.ofMillis(500))
.retryOnException(e -> !(e instanceof TimeoutException))
.build();
结尾
获取到大模型返回的逐条流式数据后,可通过Java+SSE单向把数据返回给前端,可直接将分词结果响应到页面或模型对话框里,详情可以看这篇文章使用Java+SSE实现大模型流式返回前端(完整代码+优化方案)
https://blog.csdn.net/weixin_71209411/article/details/148605716?sharetype=blogdetail&sharerId=148605716&sharerefer=PC&sharesource=weixin_71209411&spm=1011.2480.3001.8118
更多推荐
所有评论(0)