Pull to refresh

Интеграция ChatGPT в Java: распознаём автомобиль по фото

Reading time5 min
Views934

Искусственный интеллект активно внедряется в повседневную жизнь — от обработки текста до генерации изображений и звука. Однако потенциал ИИ особенно интересен в сфере разработки, где он может существенно упростить реализацию сложных задач и расширить функциональные возможности приложений.

Поскольку помимо разработки электронных устройств я также занимаюсь разработкой мобильных приложений, сугубо в любительских целях, вся дальнейшая программа будет написана на языке Java.

В этой статье я поделюсь опытом интеграции ChatGPT Vision API в программу Java, которую потенциально можно использовать для Android приложения. В рамках проекта реализован функционал, позволяющий определить параметры автомобиля по его изображению: марку, модель, стоимость, год выпуска и т. д.

Зачем использовать ChatGPT в собственных разработках

С выходом моделей GPT-4 и GPT-4o OpenAI предоставила разработчикам доступ не только к текстовым, но и мультимодальным возможностям — распознаванию изображений, аудио и видео. Это открыло небывалые возможности для реализации персональных идей и упрощения уже имеющихся проектов.

Стек и инструменты

  • Язык: Java

  • Среда разработки: IntelliJ IDEA

  • Библиотеки:
    okhttp3 — для HTTP-запросов
    Gson — для парсинга JSON
    JSONObject — для базовой работы с JSON

Получаем API-ключ OpenAI

Чтобы наше приложение работало и общение с искусственным интеллектом проходило исправно - необходимо получить свой персональный API ключ с официального сайта OpenAI. Для этого переходим на сайте и проходим регистрацию. Следующие шаги соответствуют пунктам:

  • Переходим на https://platform.openai.com/, регистрируемся.

  • В личном кабинете открываем API Keys.

  • Нажимаем Create new secret key, задаём имя и сохраняем ключ (он отображается один раз).

Отправка запроса

  1. Открываем исходное изображение автомобиля (лучше, чтобы оно было в формате .jpg). Затем преобразуем его в объект Bitmap - представление привычного нам формата графического изображения в текстовом виде. Это необходимо, чтобы передать изображение в ChatGPT.

  2. Для преобразования создадим отдельную функцию, которая будет возвращать Bitmap.

public static String convertIMG() {    

byte[] imgBytes = null;    

try{        

imgBytes = Files.readAllBytes(Path.of("mers.jpg"));    

} catch (IOException e){        

System.out.println("Its impossible to convert IMG");    

}
    return Base64.getEncoder().encodeToString(imgBytes);
}

В моём случае файл изображения находится в одной папке, но если у вас не так, то вам необходимо указать полный путь к файлу.

Теперь переходим в основную функцию, где будем писать дальнейшую программу

Поскольку отправка запроса и получение ответа может занять несколько секунд, поместим всю процедуру в отдельный поток.

Создаём две переменные типа String: одна будет хранить URL-адрес сервера, другая — API-ключ.

String url = "https://api.openai.com/v1/chat/completions";

String api_key = "Your key";
Создание нового потока и вспомогательных переменных
Создание нового потока и вспомогательных переменных

Оборачиваем следующий код в обработчик исключений на случай проблем с соединением или некорректного ответа от ChatGPT.

Внутри создаём переменную String с результатом преобразования изображения (наш Bitmap) и ещё одну переменную String с текстом запроса. В запрос включаем параметры и изображение, преобразованное в текстовый вид.

Строка запроса
Строка запроса
try{    

String base64Img = convertIMG();    

String requestBody =            

"{\n" +                    

"  \"model\": \"gpt-4o\",\n" +                    

"  \"messages\": [\n" +                    

"    {\n" +                    

"      \"role\": \"user\",\n" +                    

"      \"content\": [\n" +                   

"        {\n" +                    

"          \"type\": \"text\",\n" +                    

"          \"text\": \"Напиши марку, модель, год выпуска, примерную стоимость в евро, класс корпуса, среднюю оценку пользователей по 10 бальной шкале(float), и отправь в виде json объекта. И подпиши каждое поле(mark(String), model(String), year(String), price(String), class_auto(String), raiting(float)). Если на фото нету автомобиля, или ты не можешь определить - напиши в полях типа String nothing, в полях типа int 0, а float 0.0\"\n" +                    

"        },\n" +                    

"        {\n" +                    

"          \"type\": \"image_url\",\n" +                    

"          \"image_url\": {\n" +                    

"            \"url\": \"data:image/jpeg;base64," + base64Img + "\"\n" +                    

"          }\n" +                    

"        }\n" +                    

"      ]\n" +                    

"    }\n" +                    

"  ],\n" +                    

"  \"max_tokens\": 1000\n" +                    

"}";

Важно: в запросе указываем, что ожидаем ответ в формате JSON с нужными параметрами автомобиля.

Создаём объект OkHttpClient из библиотеки okhttp3 для формирования и отправки HTTP-запроса на сервер OpenAI.

Задаём параметры запроса и отправляем его.

Настройка и отправка запроса
Настройка и отправка запроса
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url(url)        

.addHeader("Authorization", "Bearer " + api_key)        

.addHeader("Content-Type", "application/json")        

.post(RequestBody.create(requestBody, MediaType.parse("application/json")))        

.build();

Получение и парсинг ответа

Инициализируем переменную типа Response и присваиваем ей результат выполнения запроса.

Затем создаём переменную String и присваиваем ей тело ответа, преобразованное в читаемый текст.

Получение и преобразование ответа
Получение и преобразование ответа
Response response = client.newCall(request).execute();

String answer = response.body().string();

Для корректного отображения параметров автомобиля проводим парсинг JSON-объекта.

Используем библиотеку Gson и класс JSONObject. Для этого создаём два дополнительных класса: Car и ResponseClass. Gson автоматически сопоставляет поля JSON с полями этих классов, если названия совпадают, это особенность библиотеки и формата JSON. Фото классов приведены ниже.

Класс Car
Класс Car
Класс ResponceClass  

public class Car {    

String mark;    

String model;    

int year;    

int price;    

String class_auto;   

 float raiting;

}

public class ResponceClass {    

String role;    

String content;   

 String refusal;    

String annotations[];

}

Далее — несколько операций по преобразованию строки и методам библиотеки для получения нужных данных.

Создаём новый поток, в котором производим ещё один парсинг, и выводим параметры через System.out.println.

Парсинг полученного ответа с выводом искомых данных
Парсинг полученного ответа с выводом искомых данных
for (int i = 0; i < arr.length(); i++){    

JSONObject field = arr.getJSONObject(i);    

JSONObject message = field.getJSONObject("message");    

Gson gson = new Gson();    

ResponceClass responceClass = gson.fromJson(message.toString(), ResponceClass.class);    

String buffer = responceClass.content;   

String result = buffer.substring(8, buffer.length()-4);    

System.out.println(result);    

new Thread(new Runnable() {        

@Override        

public void run() {            

Gson carJson = new Gson();            

Car car = carJson.fromJson(result, Car.class);            

System.out.println(car.mark);            

System.out.println(car.model);            

System.out.println(car.year);           

 System.out.println(car.price);            

System.out.println(car.class_auto);            

System.out.println(car.raiting);       

 }    

}).start();

}

Поздравляю, у вас получилось!!!

Результат
Результат

Заключение

Конечно, это лишь малая часть того как можно использовать настолько мощный инструмент, как chatGPT в своих проектах, где всё ограничивается лишь вашей фантазией и желанием. Здесь мы использовали отправку изображения, но ещё не рассматривали отправку звуковых файлов. Если у кого-то есть идеи где ещё можно применить подобную технологию - пишите, будет интересно почитать!!!

Tags:
Hubs:
+1
Comments0

Articles