Połączenie z API OpenAI (ChatGPT) w języku Java

W tym wpisie przedstawie Ci prosty sposób na wysyłanie zapytań do API serwisu OpenAI, czyli wykorzystanie sztucznej inteligencji we własnym programie.

Jeśli wolisz materiały wideo to zapraszam do mojego filmu o tej tematyce:

Tu przedstawię skrócony opis i kluczowe fragmenty kodu, zaczynajmy.

API OpenAI udostępnia endpoint (czyli adres URL) na którym oczekuje na przesłanie obiektu w formacie JSON zawierającego określone pola. W tym celu stworzyłem klasę Completion

public class Completion {
	private String model;
	private String prompt;
	private float temperature;
	private int max_tokens;
	public Completion(String model, String prompt, float temperature, int max_tokens) {
		this.model = model;
		this.prompt = prompt;
		this.temperature = temperature;
		this.max_tokens = max_tokens;
	}
	
	...

}
  • model – określa który model AI chcemy wykorzystać
  • prompt – jest to nasze pytanie do AI
  • temperature – wskazuje jak dokładnej odpowiedzi oczekujemy, jest to wartość zmiennoprzecinkowa od 0 do 1 gdzie 0 oznacza najdokładniejszą odpowiedź
  • max-tokens – ogranicza długość pytania oraz odpowiedzi, jednocześnie tokeny są jednostką za którą płacimy.

Ponieważ potrzebujemy obiektu tej klasy w formacie JSON wykorzystałem zewnętrzna bibliotekę „https://github.com/douglascrockford/JSON-java” która pozwoliła mi na dodanie następującej metody w klasie Completion:

public String getJson() {
		JSONObject json = new JSONObject();
		json.put("model", this.model);
		json.put("prompt", this.prompt);
		json.put("temperature", this.temperature);
		json.put("max_tokens", this.max_tokens);
		return json.toString();
	}

Mając już nasze dane, możemy zająć się ich wysłaniem, poniżej zamieszczam pełną funkcję realizującą komunikację i zwracającą odpowiedź.

Wykorzystałem klasę HttpURLConnection, jej obiekt został skonfigurowany aby korzystał z metody POST. Ustawiłem niezbędne nagłówki zwłaszcza z nagłówkiem Authorization gdzie musisz podać swój token dostępowy który generujesz na koncie serwisu OpenAI.

Następnie korzystając ze strumieni wyjściowego i wejściowego przeprowadziłem transmisję danych.

public String askAi(Completion completion) {
try {
	URL url = new URL("https://api.openai.com/v1/completions");
	HttpURLConnection con = (HttpURLConnection) url.openConnection();
	con.setDoOutput(true);
	con.setRequestMethod("POST");
	con.setRequestProperty("Content-Type", "application/json");
	con.setRequestProperty("Accept", "application/json");
	con.setRequestProperty("Authorization", "Bearer " + 
"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");		
	
        OutputStream outputStream = con.getOutputStream();
	byte[] data = completion.getJson().getBytes("utf-8");
	outputStream.write(data);
			
	BufferedReader br = new BufferedReader(
		new InputStreamReader(con.getInputStream(), "utf-8"));
	StringBuilder response = new StringBuilder();
	String responseLine = null;
	while ((responseLine = br.readLine()) != null ) {
		response.append(responseLine);
	}
	String fullReponse = response.toString(); 
			
	return fullReponse;		
}catch(Exception e) {
	e.printStackTrace();
}
return "";
}

I to nam wystarczy aby wykonać nasze zadanie, zatem możemy przetestować nasze klasy:

private void sendQuery() {
	Completion c = new Completion("text-davinci-003",
		"Czy warto być fullstack developerem?", 0.0f,200);
	System.out.println("query: " + c.getJson());
		
	String res = new Chat().askAi(c);	
	System.out.println("response: " + res); 
}

Jeśli wszystko poszło zgodnie z planem to w konsoli powinniśmy zobaczyć obiekt (w formacie JSON) który zwrócił nam serwis OpenAI, pośród wielu otrzymanych parametrów będzie również odpowiedź na nasze pytanie.

Zachęcam do prób i eksperymentów.

Pozdrawiam