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

от автора

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

Поскольку помимо разработки электронных устройств я также занимаюсь разработкой мобильных приложений, сугубо в любительских целях, вся дальнейшая программа будет написана на языке 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 в своих проектах, где всё ограничивается лишь вашей фантазией и желанием. Здесь мы использовали отправку изображения, но ещё не рассматривали отправку звуковых файлов. Если у кого-то есть идеи где ещё можно применить подобную технологию — пишите, будет интересно почитать!!!


ссылка на оригинал статьи https://habr.com/ru/articles/922622/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *