В преддверии Нового Года, начинаем осваивать генеративные сети с помощью привычного всем Java разработчикам фреймворка Spring. Несколько месяцев назад в Spring добавили модуль AI, который упрощает работу с нейронками от OpenAI и Azure.

Spring AI предлагает абстракции в виде функциональных интерфейсов, благодаря которым можно быстро и с разными параметрами вызывать нейронки. Основа - это ChatClient с имплементациями для OpenAI и Azure. В этом мини-гайде мы поговорим о том, как внедрить AI в ваше новое или существующее приложение.

Давайте сначала кратко определим некоторые термины в LLM. Если вам это не нужно, пролистайте до раздела “Как использовать Spring AI в вашем приложении”.

LLM - это большая языковая модель, более подробно здесь, простым языком, обучается на больших объемах текста и угадывает наиболее вероятное и подходящее следующее слово за предыдущим. Как показал Андрей Карпатый (один из главных ИИ ученых) в своем видео, алгоритм LLM может содержать всего 500 строк кода, основная сложность обучения в использовании дорогостоящих видеокарт и дообучении после. Например, из Википедии “Обучение БЯМ требует больших вычислительных ресурсов. Исследование 2020 года оценило стоимость обучения модели с 1,5 миллиардами параметров (на 1-2 порядка меньше, чем уровень техники в то время) в 1,6 миллиона долларов”.

Промпт - это вопрос, утверждение или просто текст, которое предоставляется генеративной языковой модели для генерации ответа. Промпт может быть простым или сложным, но он должен быть достаточно ясным, чтобы модель могла понять, что вы от нее хотите. Есть уже много курсов и статей о том, как правильно писать промпты, чтобы искусственный интеллект давал вам релевантный ответ, например, советы по промптам для Java разработчиков.

Что такое Prompt Templates?

Prompt Templates - это заготовленные промпты для пользователей. Например, пришел к нам пользователь, который впервые видит нейронки, и мы ему сразу предоставляем шаблон промпта, который максимально эффективно работает для специфичной задачи пользователя. Пользователь вводит то, что ему нужно, и мы выдаем красивый и понятный ответ.

Например, у нас есть сайт по обучению Java и Spring. Пользователь приходит с вопросом, что такое транзакция. Если обратиться в ChatGPT с таким промптом, он выдаст большой текст с лишней информацией. Однако, если мы используем, например, промпт “‘Что такое транзакция’ в контексте разработки Spring приложений”, ChatGPT выдаст текст с примерами, как реализовать транзакцию в Spring, и что это такое. Это только вершина айсберга. Некоторые пользователи, например, обещают нейронке чаевые или угрожают причинением вреда другим людям, если не решит какую-либо задачу. ChatGPT становится более эффективным в таких случаях. Поэтому шаблоны промптов - это важная штука при взаимодействии с LLM.

Еще пример: создаем сайт "Переводим быстро и четко с русского на китайский". И делаем окно для ввода пользователей, а сами отправляем в нейронку такой промпт: “Переведи этот текст с русского на китайский "{text}"”. Подключаем подписку на перевод и зарабатываем денюжки (скорее нет). В общем, сами придумаете, как получать профит, а мы идем дальше.

Что такое ChatClient?

ChatClient - это функциональный интерфейс, который упрощает работу с AI-моделями. С этим интерфейсом можно работать с разными моделями. На данный момент он может только отправлять и принимать только текст, но в будущем ожидаются и другие формы взаимодействия с нейронками.

Вот структура ChatClient:

@FunctionalInterface
public interface ChatClient {

    default String generate(String message) { 
        Prompt prompt = new Prompt(new UserMessage(message));
        return this.generate(prompt).getGeneration().getContent();
    }

    ChatResponse generate(Prompt prompt);

}

Как использовать Spring AI в вашем приложении?

Мы будем использовать привычный всем IntelliJ IDEA и Spring Initializr

Все стандартно с другими приложениями, добавляю зависимости Spring Web и Lombok, устанавливаю Java 17, Spring Boot 3+, Maven и скачиваю проект.

Дальше нам нужно сделать некоторые действия:

  1. Добавить зависимость Spring AI. Зависимость актуальна на момент написания статьи, проверяйте обновления в документации.

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>0.8.0-SNAPSHOT</version>
</dependency>
  1. Добавить дополнительный репозиторий для скачивания вышеупомянутой зависимости

<repositories>
   <repository>
      <id>spring-snapshots</id>
      <name>Spring Snapshots</name>
      <url>https://repo.spring.io/snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
   </repository>
</repositories>
  1. Получить секретный ключ от OpenAI. Идем на сайт и регистрируемся, если еще этого не сделали, также подтверждаем номер телефона (инструкцию, как зарегистрироваться пользователям из России, можете найти в интернете), идем на эту страничку и создаем ключи, копируем ключ и сохраняем где нибудь. При регистрации вам дается 5$ и некоторые ограничения в виде: не больше 3 запросов в минуту и 200 в день. Этих 5 долларов вам хватит для первоначального изучения и тестирования.  

  2. В проекте, в файле application.properties вставить свой ключ: spring.ai.openai.api-key=ключ

Создание контроллера 

Подходим к кульминации, создаем свой первый код для общения с ИИ, очень простой код который генерирует промпт и выдает ответ в виде строки

package com.example.demo.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.prompt.PromptTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/ai")
@RequiredArgsConstructor
public class PromptController {

   private final ChatClient chatClient;

   @GetMapping("/hello")
    public String sayHello() {
        String prompt = "Привет, как на китайском будет Hello World?";
        return chatClient.generate(prompt);
    }	

Еще пару примеров:

Используем наше приложение вместо интерфейса ChatGPT:

@GetMapping("/{prompt}")
    public String sendPrompt(@PathVariable String prompt) {
        return chatClient.generate(prompt);
    }

Реализуем PromptTemplate с нашим промптом:

@GetMapping("/learn/{message}")
    public String getMessage(@PathVariable("message") String message) {

        PromptTemplate promptTemplate = new PromptTemplate("""
        Пожалуйста, расскажи кратко и доступным языком
        что такое {message}.
        """);
        promptTemplate.add("message", message);
        return this.chatClient.generate(promptTemplate.create()).getGeneration().getContent();
    }

На этом мини-гайд в мир ИИ от Spring подошел к концу, дальше ждем новых функций от разработчиков Spring AI, делаем свои приложения и меняем мир :).

Ссылка на мой репозиторий в гите с этим проектом, скачивайте, пользуйтесь, если нравится, жмите на звездочку там.

Комментарии (5)


  1. KalininArtemVal
    30.12.2023 15:48

    Спасибо) интересная статья


  1. djamali
    30.12.2023 15:48
    +1

    Нихуахуа


  1. vadim991
    30.12.2023 15:48
    +2

    У тебя в репозитории остался ключ от опенапи в папке с ресурсами


  1. Dmitry2019
    30.12.2023 15:48

    В большинстве случаев необходимо получить ответ в специфическом формате, например в JSON.


  1. OldNileCrocodile
    30.12.2023 15:48

    А этот API делает запрос к модели GPT 3.5? Или к GPT 4?