1. Обзор
Современные приложения всё чаще используют большие языковые модели (Large Language Models, LLM) для создания решений, выходящих за рамки традиционных возможностей программирования. Однако интеграция этих моделей в наши приложения часто связана с интеграцией со сложными API, управлением различными AI-провайдерами.
Spring AI — новый модуль в экосистеме Spring, которое решает эти проблемы, предоставляя общий уровень абстракции для работы с различными AI-провайдерами с использованием привычных паттернов разработки Spring приложения.
Он устраняет необходимость явного использования SDK, специфичных для конкретного провайдера, и позволяет переключаться между различными моделями без изменения кода приложения.
2. Настройка проекта
Давайте создадим свой сервис генерации стихов с использованием модели GigaChat от Sber.
Однако Spring AI поддерживает модели от различных провайдеров, таких как OpenAI , Anthropic, DeepSeek и даже локальные LLM через Hugging Face или Ollama для запуска моделей локально.
Мы можем выбрать модель, которая наилучшим образом соответствует нашим требованиям для решения задач.
2. Зависимости, настройки и код
Добавляем зависимость в свой pom.xml
<dependency>
<groupId>chat.giga</groupId>
<artifactId>spring-ai-starter-model-gigachat</artifactId>
<version>1.1.2</version>
</dependency>
Так же мне потребовался webflux, не для использования по назначения, а как некоторые зависимости внутри него, возможно связано с тем, что у меня JDK 25, а в рекомендациях к 21я Java. Разбираться не стал, просто дал, то что он просил 🙂
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Создайте Main-класс:
@SpringBootApplication
public class Main {
static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@Bean
public CommandLineRunner runner(ChatClient.Builder builder) {
return args -> {
ChatClient chatClient = builder.build();
Scanner scanner = new Scanner(System.in);
List<Message> chatHistory = new ArrayList<>();
System.out.println("🤖 Чат с ИИ запущен! (введите 'выход' или 'выйти' для выхода)");
System.out.println("=".repeat(50));
while (true) {
System.out.print("\n👤 Вы: ");
String userInput = scanner.nextLine().trim();
if (userInput.equalsIgnoreCase("выход") || userInput.equalsIgnoreCase("выйти")) {
System.out.println("До свидания! 👋");
scanner.close();
exit(0);
}
if (userInput.isEmpty()) {
continue;
}
try {
System.out.print("🤖 Giga: ");
// Добавляем сообщение пользователя в историю
chatHistory.add(new UserMessage(userInput));
// ВАРИАНТ С историей
String response = chatClient.prompt()
.messages(chatHistory)
.call()
.content();
// ВАРИАНТ Без истории
// String response = chatClient.prompt(userInput).call().content();
// chatHistory.clear(); // Очищаем, чтобы не росла память, но контекст теряется
System.out.println(response);
// Добавляем ответ ИИ в историю
chatHistory.add(new AssistantMessage(response));
} catch (Exception e) {
System.err.println("\n❌ Ошибка: " + e.getMessage());
// e.printStackTrace();
}
}
};
}
}
Сконфигурируем теперь application.yml
spring:
ai:
gigachat:
auth:
bearer:
client-id: ${clientId:123} # Можно посмотреть в личном кабинете GigaChat в разделе "Настройки API" в вашем проекте
api-key: ${clientSecret:123} # Можно посмотреть в личном кабинете GigaChat в разделе "Настройки API" в вашем проекте
scope: GIGACHAT_API_PERS # Можно посмотреть в личном кабинете GigaChat в разделе "Настройки API" в вашем проекте
unsafe-ssl: true # отключает проверку серверных сертификатов, не рекомендуется использовать в production!
chat:
options:
# дефолтные параметры для обращения к API GigaChat.
model: GigaChat # GigaChat по дефолту, список доступных моделей - https://developers.sber.ru/docs/ru/gigachat/models
temperature: 0.5 # null по дефолту
top-p: 0.5 # null по дефолту
max-tokens: 200 # null по дефолту
repetition-penalty: 1 # null по дефолту
update-interval: 0 # null по дефолту
embedding:
options:
model: Embeddings # Embeddings по дефолту
dimensions: 1024 # null по дефолту, вычисляется при первом обращении к Embedding-модели
internal:
connect-timeout: 15s # 15 секунд по дефолту. Таймаут на установление соединения с севрером
read-timeout: 15s # null по дефолту (без таймаута). Таймаут на получение ответа от сервера
make-system-prompt-first-message-in-memory: true # true по дефолту; перемещает сообщение с ситемным промптом в начало
Также существуют различные способы авторизации в api gigachat:
- TLS сертификат
- Authorization Key (api-key)
- Client ID + Client Secret
Для наглядности небольшое видео о том, что сделали
