Блог CosySoft
2025-01-14 11:48 Разработка Технологии

Знакомимся с возможностями Spring AI

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

Возможности Spring AI

Spring AI упрощает разработку и интеграцию приложений с ИИ с помощью удобных абстракций. Благодаря нескольким реализациям этих абстракций, компоненты можно заменять с минимальными изменениями в коде.
Поддержка различных типов моделей
Spring AI предоставляет универсальный API для взаимодействия с разными типами ИИ-моделей.
Работа с векторными базами данных
Spring AI предоставляет API для работы с векторными базами данных, а также механизм фильтрации на языке, похожем на SQL. Это облегчает поиск нужной информации по текстовым запросам и улучшает работу с большими объемами данных.
Автоконфигурация Spring Boot
Spring AI поддерживает автоконфигурацию для ряда популярных моделей. Это особенно полезно при создании микросервисов или приложений, где требуются многомодельные конфигурации.
ETL для данных
Spring AI включает инструменты ETL, которые помогают подготовить данные для работы с ИИ. С их помощью можно загружать документы, структурировать и индексировать их в векторных базах.
Портативность API
Spring AI предлагает портативные API для различных поставщиков ИИ, что упрощает переключение между сервисами без потери функциональности.
Сопоставление данных
Упрощает обработку данных, сопоставляя выходные данные моделей ИИ с объектами Java (POJOs).

Какие задачи может решить Spring AI

  1. Вопрос-ответ и семантический поиск. Используя векторные базы данных и мощные модели обработки естественного языка, Spring AI позволяет разрабатывать системы поиска и извлечения информации.
  2. Генерация изображений. Spring AI поддерживает работу с генеративными моделями, которые создают изображения на основе текстовых запросов.
  3. Модерация контента. Для задач по модерации текстов или изображений Spring AI может подключаться к моделям, способным фильтровать и оценивать контент.
  4. Работа с аудиомоделями. Spring AI позволяет использовать аудиомодели для преобразования текста в речь, создания синтетических голосов или генерации звуков.
Поддерживаемые модели
Anthropic, Azure OpenAl, Amazon Bedrock, Google, HuggingFace, Mistral, Oracle, Stability Al, Watson, Minimax, Moonshot, QianFan, ZhiPu Al, PostgresML, and ONNX Transformers.

Поддерживаемые векторные БД
Apache Cassandra, Azure Vector Search, Chroma, Milvus, MongoDB Atlas, Neo4j, Oracle, PostgreSQL/PGVector, PineCone, Qdrant, Redis, and Weaviate.

Настройка и первый запуск Spring AI

Для запуска Spring AI в проекте потребуется настроить несколько ключевых элементов.

Подключение стартера

Добавьте, например, OpenAI Spring Boot Starter, который предоставляет доступ к моделям OpenAI. Этот стартер подключается так же, как и другие Spring Boot-стартеры, добавляя зависимости для работы с OpenAI.

Конфигурация API-ключа и URL

В application.properties укажите API-ключ, сгенерированный на стороне OpenAI, и URL (если требуется нестандартный) для подключения к модели. Следует учесть, что общение с ИИ не бесплатная опция, поэтому убедитесь, что у вас оплачен тариф для той учетной записи, с помощью которой настраивается взаимодействие. Так как в России напрямую многие модели недоступны, для генерации API Key можно использовать bothub.chat.
spring.ai.api-key=ВАШ_API_КЛЮЧ
spring.ai.api-url=https://ВАШ_КАСТОМНЫЙ_URL # если отличается от стандартного
Spring AI поддерживает широкие возможности конфигурации в application.properties. Эти настройки позволяют управлять поведением моделей, регулировать таймауты, лимиты токенов и даже переключаться между несколькими моделями.

Основные компоненты Spring AI

ChatClient

Основной интерфейс, через который приложение общается с ИИ-моделью для генерации текстовых сообщений. Он позволяет отправлять промпты и получать ответы в формате строки. Простой чат-клиент создается с помощью Builder, куда добавляются промпт и пользовательские данные, после чего клиент вызывает модель и возвращает результат.
Builder отвечает за конфигурацию клиента и позволяет гибко настраивать запросы, передавая необходимые параметры. Также Builder можно отключить через настройки, чтобы подключить кастомную модель.
Первый запуск с помощью Builder. Чтобы начать работу с моделью, создайте клиента через Builder, указав необходимые промпты и пользовательские данные:
java
AiClient client = AiClient.builder()
    .withPrompt("Ваш промпт")
    .withUserInput("Данные пользователя")
    .build();
ChatResponse
Spring AI предоставляет гибкие варианты ответов от модели, адаптированные под разные задачи и нужды разработчиков.
Это основной интерфейс, через который модель возвращает текстовые ответы. Помимо самого ответа, ChatResponse включает:
  • Метаданные: например, информацию о том, какая модель использовалась для генерации ответа.
  • Историю ответов (поколения): если запрос требует последовательной истории сообщений, ChatResponse может сохранить несколько поколений ответов.
  • Кол-во токенов: учет токенов, использованных в запросе, что важно для контроля затрат.

Ответ в пользовательском формате

Очень часто в ответ от модели мы хотим получить не текст, а стандартный POJO класс, с которым дальше сможем работать. К счастью, Spring AI позволяет нам это сделать. Для этого можно использовать метод entity().
MyResponseClass response = client.entity(MyResponseClass.class);
При этом, если требуется коллекция, используется ParameterizedTypeReference для корректной передачи, например, типа списка.

Асинхронные ответы

Spring AI поддерживает асинхронный режим работы. Вместо метода call используется stream, который позволяет обрабатывать ответ по мере его получения в реальном времени, что особенно полезно для обработки больших данных или сложных запросов.

Advisors в Spring AI

В Spring AI концепция «советников» добавляет гибкость при работе с моделью, позволяя дополнять запросы и ответы дополнительным контекстом.
Адвизоры — это компоненты, которые можно использовать для настройки запроса перед его отправкой или обработки ответа от модели. Они могут добавлять контекстные данные, тем самым обеспечивая более релевантные ответы. В адвизоры можно добавлять дополнительную логику при обработке ответов или запросов к модели, дополнительные валидации и т.д.
Адвизоры применяются в строгом порядке, причем каждый следующий получает результат от предыдущего. Это позволяет контролировать, как изменяется запрос или ответ.
Spring предоставляет некоторые готовые наборы «советников».

MessageChatMemoryAdvisor

Этот компонент добавляет историю чата как набор сообщений в промпт. С его помощью можно сохранять структуру диалога, поддерживая динамичность разговора. Однако не все модели поддерживают такой формат передачи истории.

PromptChatMemoryAdvisor

Включает всю историю взаимодействия в системный текст промпта. Этот компонент часто используется, когда требуется передать сразу всю историю в компактной форме.

VectoreStoreChatMemoryAdvisor

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

QuestionAnswerAdvisor

С помощью этого компонента запрос к модели подготавливается на основе подготовленного контекста, хранящегося в векторном хранилище. Потом ответ от модели также валидируется на предмет соответствия этому контексту.

SafeGuardAdvisor

Это компонент позволяет указать список запрещенных фраз или слов для использования в запросах к модели.

Logging Advisor (или Simple Logger Advisor)

Это специальный компонент Spring AI, позволяющий логировать запросы к модели и ответы на них. Он предоставляет полезные инструменты для отслеживания взаимодействий с моделью, что особенно важно при отладке и мониторинге работы системы.
Для активации логирования достаточно добавить Logger Advisor в список используемых адвизоров и задать уровень логирования в проперти-файле. Это позволяет выбрать, например, вывод только ошибок или более подробное логирование, включая успешные запросы и ответы модели.
logging.level.org.springframework.ai.chat.client.advisor=DEBUG

ModelAdvisor

Этот advisor управляет взаимодействием с моделями машинного обучения. Он может выбирать, какую модель использовать для обработки запроса, в зависимости от контекста и требований.

DataPreprocessingAdvisor

Компонент отвечает за обработку данных перед отправкой в модель.

PostProcessingAdvisor

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

ErrorHandlingAdvisor

Компонент позволяет обрабатывать ошибки, возникающие в результате работы с моделью или при обработке данных. Он может перехватывать исключения или добавить логики для обработки исключений (например, повторная попытка запроса).

SecurityAdvisor

Компонент, обеспечивающий безопасность при работе с моделями. Может валидировать доступ пользователя к работе с моделью или данными.
Для адвизоров в цепочке можно указать порядок выполнения. Чем ниже порядковый номер, тем выше приоритет на обработку запроса и тем ниже приоритет на обработку ответа от модели. При равных значениях параметра order порядок применения не гарантируется. Например, если MemoryAdvisor добавляет историю разговора, а QuestionAnswerAdvisor выполняет поиск, то сначала отработает MemoryAdvisor, добавляя историю, а затем QuestionAnswerAdvisor, который обрабатывает вопрос с учетом истории.

Retriever Augmented Generation (RAG) в Spring AI

RAG — это подход, позволяющий улучшить ответы модели за счет использования внешнего контекста, хранящегося во векторной базе данных. Это особенно полезно, когда модель должна ответить на вопросы по узкоспециализированной теме или учесть большой объем знаний, которые трудно встроить напрямую.
Принцип работы:
  • Запрос (например, вопрос или промпт) передается в модель векторизации, которая преобразует его в числовой вектор.
  • Этот вектор запроса затем используется для поиска в векторной базе данных, где хранятся заранее вычисленные векторы с релевантным контекстом.
  • База данных находит и возвращает контексты, которые максимально близки по смыслу к исходному запросу. Например, это могут быть документы с информацией, которая точно отражает вопросы по продукту или предметной области.

Обогащенный запрос:
  • Найденные контексты объединяются с исходным запросом и передаются модели для генерации окончательного ответа. Это позволяет получить более точный и детализированный ответ, основанный на обширной информации, но без необходимости напрямую обучать модель на этих данных.
С приходом Spring AI возможности RAG становятся еще более доступными и мощными. Spring AI предлагает интеграцию с различными системами хранения и управления данными, что позволяет разработчикам легко настраивать и оптимизировать процесс извлечения информации. Благодаря поддержке гибких архитектур и модульного подхода, Spring AI упрощает внедрение RAG в приложения, обеспечивая высокую производительность и масштабируемость.

Реализация в Spring AI

Для реализации RAG можно использовать QuestionAnswerAdvisor с подключенной векторной базой данных. В этом примере SearchRequest.defaults() выполнит поиск по сходству по всем документам в базе данных Vector. Чтобы ограничить типы документов, по которым производится поиск, в SearchRequest используется SQL-выражение фильтра, переносимое во все VectorStores.

Structured Output Converter в Spring AI

StructuredOutputConverter — это интерфейс в Spring AI, позволяющий получать структурированный вывод от модели и отображать его в конкретный Java-класс, массив значений или коллекцию. Этот подход особенно удобен, когда от модели требуется структурированный ответ в определенном формате.
Принцип работы следующий:
  1. Форматирование шаблона: создается шаблон промпта, в котором указывается формат желаемого ответа. Spring AI автоматически добавляет в этот промпт описательные предложения, чтобы модель генерировала ответ в заданном формате.
  2. Преобразование ответа: конвертер переводит текстовый ответ в соответствующую структуру — класс, коллекцию, мапу и т.д. Это особенно полезно при работе с предсказуемым форматом данных.
  3. Эти указания, как правило, добавляются в конец пользовательского ввода с использованием PromptTemplate. Converter<String, T> отвечает за преобразование текстового ответа от модели в требуемый формат T.
FormatProvider предоставляет модели определенные указания по желаемому форматированию ответа, позволяя ей создавать текстовые результаты, которые могут быть преобразованы в целевой тип T с помощью конвертера.
Доступные конвертеры:
  • Bean Output Converter — преобразует текст модели в единичный объект класса.
  • List Output Converter — формирует коллекцию объектов.
  • Map Output Converter — выводит ответ в формате Map (ключи типа String, значения типа Object).

Заключение

Spring AI определенно выглядит как перспективная технология, за развитием которой интересно следить. Spring AI упрощает интеграцию ИИ в приложения, скрывая сложность за удобными абстракциями. Разработчики получают возможность создавать интеллектуальные функции и приложения без глубоких знаний в области машинного обучения. Особенно удобно, что Spring AI легко встраивается в существующую кодовую базу: достаточно добавить несколько классов, без необходимости переписывать код или изучать новые языки программирования.
В работе с платформой особенно привлекает гибкость интеграции и поддержка нескольких провайдеров LLM, а также подробная документация, которая делает внедрение еще проще. Однако стоит учитывать и небольшой недостаток — накладные расходы на производительность при работе с моделями.