ChatGPT API на Java: как добавить ИИ в проект

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Зачем Java-разработчику ChatGPT? Или как перестать бояться и полюбить нейросети

Привет, коллега! Если ты читаешь это, значит, тебе, как и мне, надоело писать однотипные ответы для техподдержки, генерировать скучные описания товаров или вручную анализировать отзывы. А что, если я скажу, что всего за вечер можно вдохнуть жизнь в своё Java-приложение, подключив к нему настоящий искусственный интеллект? Да-да, я про тот самый ChatGPT, который умеет шутить, писать код и даже объяснять теорему Пифагора коту.

В этой статье мы не будем разбирать теорию вероятностей или учить трансформеры. Мы просто возьмём Java, добавим щепотку HTTP-запросов и заставим GPT-4 (или 3.5, если бюджет поджимает) работать на нас. Звучит как магия? На самом деле это чистая инженерия. Поехали!

Что нам понадобится? Минимальный джентльменский набор

Прежде чем писать код, убедись, что у тебя есть:

  • JDK 11 или выше (мы будем использовать новый HttpClient, который появился именно в 11-й версии);
  • API-ключ OpenAI — его можно получить на платформе OpenAI. Не забудь пополнить баланс (буквально на пару долларов, для тестов хватит);
  • Любая IDE — IntelliJ IDEA, Eclipse или даже блокнот, если ты хардкорщик;
  • Maven или Gradle — для удобного подключения зависимостей (но мы обойдёмся минимумом).

Кстати, если ты думаешь, что интеграция ChatGPT на Java — это что-то сложное и требующее машинного обучения, то спешу обрадовать: всё решается обычным HTTP-запросом. Никаких нейросетей в рантайме, только REST API.

Подготовка проекта: Maven и зависимости

Создай новый проект Maven и добавь в pom.xml всего одну библиотеку — Jackson для работы с JSON. Без неё никуда, потому что ChatGPT общается с миром исключительно на этом языке.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Всё! Никаких SDK, никаких обёрток — только чистый Java и наша смекалка. Если ты используешь Gradle, просто добавь implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'.

Структура запроса к OpenAI API

Прежде чем писать код, давай разберёмся, что хочет от нас сервер. ChatGPT API принимает POST-запрос на эндпоинт https://api.openai.com/v1/chat/completions. Тело запроса — это JSON с такой структурой:

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {"role": "system", "content": "Ты — полезный ассистент."},
    {"role": "user", "content": "Расскажи шутку про Java-разработчиков."}
  ],
  "temperature": 0.7
}

Разберём поля:

  • model — какая модель отвечает. Для экономии бери gpt-3.5-turbo, для крутых ответов — gpt-4;
  • messages — массив сообщений. Системное сообщение задаёт тон, а user — это наш запрос;
  • temperature — от 0 до 2. Чем выше, тем креативнее ответ (и тем больше шансов, что нейросеть начнёт галлюцинировать).

Ответ приходит тоже в JSON, и нас интересует поле choices[0].message.content. Именно там спрятан текст, который мы будем выводить пользователю.

Пишем код: Java-клиент для ChatGPT

Создадим класс ChatGPTClient. Он будет отвечать за отправку запросов и обработку ответов. Весь код — в одном файле, чтобы не плодить сущности.

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class ChatGPTClient {

    private static final String API_URL = "https://api.openai.com/v1/chat/completions";
    private final String apiKey;
    private final HttpClient httpClient;
    private final ObjectMapper objectMapper;

    public ChatGPTClient(String apiKey) {
        this.apiKey = apiKey;
        this.httpClient = HttpClient.newHttpClient();
        this.objectMapper = new ObjectMapper();
    }

    public String ask(String userMessage) throws Exception {
        // Собираем тело запроса
        ObjectNode requestBody = objectMapper.createObjectNode();
        requestBody.put("model", "gpt-3.5-turbo");
        requestBody.put("temperature", 0.7);

        ArrayNode messages = requestBody.putArray("messages");
        ObjectNode systemMessage = messages.addObject();
        systemMessage.put("role", "system");
        systemMessage.put("content", "Ты — полезный ассистент, отвечающий на русском языке.");

        ObjectNode userMessageNode = messages.addObject();
        userMessageNode.put("role", "user");
        userMessageNode.put("content", userMessage);

        // Формируем HTTP-запрос
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(API_URL))
                .header("Content-Type", "application/json")
                .header("Authorization", "Bearer " + apiKey)
                .POST(HttpRequest.BodyPublishers.ofString(requestBody.toString()))
                .build();

        // Отправляем и получаем ответ
        HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("Ошибка API: " + response.statusCode() + " — " + response.body());
        }

        // Парсим ответ
        var root = objectMapper.readTree(response.body());
        var choice = root.get("choices").get(0);
        var content = choice.get("message").get("content").asText();

        return content;
    }

    public static void main(String[] args) throws Exception {
        // Вставь сюда свой API-ключ из OpenAI
        String apiKey = "sk-...ваш_ключ...";
        ChatGPTClient client = new ChatGPTClient(apiKey);

        String answer = client.ask("Привет! Напиши короткое стихотворение про Java.");
        System.out.println("ChatGPT говорит: " + answer);
    }
}

Запусти main — и, если ключ рабочий, ты увидишь ответ от нейросети. Поздравляю, ты только что сделал интеграцию ChatGPT API на Java!

Обработка ошибок и лимитов

Жизнь — боль, и API тоже может ошибаться. Самые частые коды ответов:

  • 401 — неверный ключ. Проверь, не забыл ли ты Bearer в заголовке;
  • 429

Блоги

Рекомендаций по книгам