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