编写java版本的http流式返回访问GPT
- 既然测试python可以实现http流式返回,那么java也可以实现。
- 使用okHttp3库,实现。
gradle依赖
// okhttp3implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.9.1'// org.jsonimplementation group: 'org.json', name: 'json', version: '20210307'
代码
package org.jow.http.stream;import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class OKStream {public static void main(String[] args) throws IOException {// 循环聊天,直到输入“再见”while (true) {// 控制台输入BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));System.out.println("输入问题:");String str = reader.readLine();if ("bye".equals(str)) {break;}OKStream okStream = new OKStream();okStream.chatWithGPT(str);}}private void chatWithGPT(String message) throws IOException {OkHttpClient client = new OkHttpClient();MediaType mediaType = MediaType.parse("application/json");JSONObject data = new JSONObject();data.put("messages", new JSONArray().put(new JSONObject().put("role", "system").put("content", "You are an AI assistant that helps people find information.")).put(new JSONObject().put("role", "user").put("content", message)));data.put("temperature", 0.5);data.put("top_p", 0.95);data.put("frequency_penalty", 0);data.put("presence_penalty", 0);data.put("max_tokens", 800);data.put("stop", "null");data.put("stream", true);RequestBody body = RequestBody.create(mediaType, data.toString());Request request = new Request.Builder().url("https://xxxx.openai.azure.com/openai/deployments/gpt-35-turbo-xxx/chat/completions?api-version=2023-03-15-preview").post(body).addHeader("Content-Type", "application/json").addHeader("api-key", "************************").build();Response response = client.newCall(request).execute();String line;while ((line = response.body().source().readUtf8Line()) != null) {if (line.equals("data: [DONE]")) {System.out.println("\n[DONE]");break;} else if (line.startsWith("data: ")) {line = line.substring(6);JSONObject responseJson = new JSONObject(line);if (responseJson.getJSONArray("choices").getJSONObject(0).getJSONObject("delta").has("content")) {System.out.print(responseJson.getJSONArray("choices").getJSONObject(0).getJSONObject("delta").getString("content"));}}}}
}