
Искусственный интеллект активно внедряется в повседневную жизнь — от обработки текста до генерации изображений и звука. Однако потенциал ИИ особенно интересен в сфере разработки, где он может существенно упростить реализацию сложных задач и расширить функциональные возможности приложений.
Поскольку помимо разработки электронных устройств я также занимаюсь разработкой мобильных приложений, сугубо в любительских целях, вся дальнейшая программа будет написана на языке 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, задаём имя и сохраняем ключ (он отображается один раз).
Отправка запроса
-
Открываем исходное изображение автомобиля (лучше, чтобы оно было в формате .jpg). Затем преобразуем его в объект Bitmap — представление привычного нам формата графического изображения в текстовом виде. Это необходимо, чтобы передать изображение в ChatGPT.
-
Для преобразования создадим отдельную функцию, которая будет возвращать 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. Фото классов приведены ниже.

Класс 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/
Добавить комментарий