Spring AI + GigaChat — Простой пример

spring ai with gigachat api

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

Для наглядности небольшое видео о том, что сделали

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *