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