Зачем 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