OpenAI GPT와 API 테스트 java 버전
요즘은 호환을 위해서 만들때 기존에 잘 나가는 회사의 API와 동일하게 만들어서 엔드포인트와 api 키 정도면 변경하면 바로 사용할 수 있게 만들고 있는 추세 입니다.
트위터의 후신인 X 에서 생성형AI를 만들었는데 사용 방법이 그렇습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
public class OpenAIStreamExample {
public static void main(String[] args) {
String apiKey = "본인의 API키";
String gptModel = "gpt-4";
String text = "당신은 누구 인가요? 알바 인가요?";
JSONObject systemContent = new JSONObject();
JSONArray messages = new JSONArray();
messages.put(new JSONObject().put("role", "system").put("content", systemContent.toString()));
messages.put(new JSONObject().put("role", "user").put("content", text));
JSONObject requestBody = new JSONObject();
requestBody.put("model", gptModel);
requestBody.put("max_tokens", 4096);
requestBody.put("temperature", 0.89);
requestBody.put("messages", messages);
requestBody.put("stream", true);
try {
HttpURLConnection connection = (HttpURLConnection) new URL(urlOpenAI).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Authorization", "Bearer " + apiKey);
connection.setDoOutput(true);
byte[] input = requestBody.toString().getBytes(StandardCharsets.UTF_8);
connection.getOutputStream().write(input, 0, input.length);
System.out.println("API 호출 응답 코드: " + connection.getResponseCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.startsWith("data: ")) {
line = line.substring(6);
}
if ("[DONE]".equals(line)) {
break;
}
try {
JSONObject data = new JSONObject(line);
JSONObject delta = data.optJSONArray("choices").optJSONObject(0).optJSONObject("delta");
if (delta != null) {
String content = delta.optString("content", "");
if (!content.isEmpty()) {
System.out.print(content);
}
}
} catch (Exception e) {
System.err.println("JSON 처리 오류: " + line);
}
}
System.out.println("\n스트림이 종료.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
코딩량이 적은 언어에 들어가지는 않습니다. 다 이유가 있기는 한데 뭔가 많다는 것은 봐야 할것이 많다는 것이고 기능이 많고 조절해줄 수 있는게 많다는 것은 세부적인 부분의 조절로 섬세하게 다를 수 있다는 것이 되기도 합니다.