Николай Пискунов, руководитель направления Big Data в Beeline Cloud, опубликовал на Habr подробный разбор Spring ИИ — фреймворка, который интегрирует языковые модели в Java-приложения. Материал вырос из более ранней статьи автора про клиент для Ollama: чем глубже он разбирался в конкретной реализации, тем очевиднее становилось, что интереснее сам инструмент, делающий такие клиенты возможными.

Spring ИИ — это слой абстракций между экосистемой Spring и языковыми моделями разных провайдеров. Исторически разработчики, которые хотели добавить в Java-приложение обращение к GPT-4 или Claude, писали HTTP-клиенты вручную, парсили JSON-ответы, отдельно обрабатывали ошибки и токены авторизации для каждого провайдера. Spring ИИ решает эту проблему так же, как JPA решила работу с реляционными базами данных в своё время: детали реализации уходят под капот, разработчик работает с единым интерфейсом.

МодельТипКлиент Spring AIСценарий по роутеру
GPT-4Облако (OpenAI)OpenAiChatClientТворческие задачи, кодинг
ClaudeОблако (Anthropic)AnthropicChatClient
Llama 2 7BЛокально (Ollama)OllamaChatClientПростые факты, математика
TinyLlama 1.1BЛокально (Ollama, Raspberry Pi)OllamaChatClient

Ключевой элемент архитектуры — интерфейс ChatClient. Клиент для OpenAI, клиент для Anthropic и клиент для локального Ollama реализуют один и тот же контракт. Это означает, что код, который вызывает модель, не знает и не должен знать, куда именно уходит запрос — в дата-центр OpenAI, к Anthropic или на локальный сервер в соседней комнате. Переключение между провайдерами сводится к замене одной строки в конфигурации Bean.

Один интерфейс ChatClient объединяет OpenAI, Anthropic Claude и локальный Ollama: код вызова модели не меняется при смене провайдера.

Отдельного внимания заслуживает поддержка локальных моделей через Ollama. Ollama — это инструмент, позволяющий запускать открытые языковые модели на собственном железе одной командой в терминале. Spring ИИ интегрируется с ним через указание локального эндпоинта (по умолчанию http://localhost:11434) и имени модели. Автор проверил работу TinyLlama с 1,1 млрд параметров на Raspberry Pi — модель запускается и отвечает, пусть и медленно. Это открывает сценарии офлайн-работы и ситуации, когда отправка промптов во внешние сервисы нежелательна по соображениям конфиденциальности.

Фреймворк поддерживает одновременную работу с несколькими моделями в одном приложении. Пискунов демонстрирует сервис ModelEnsembleService, который принимает в конструктор клиенты GPT-4, локальной Llama 2 и Claude, хранит их в списке и итерируется по нему при каждом запросе. Асинхронный вариант через CompletableFuture отправляет запрос всем трём моделям параллельно — ответы собираются по мере готовности. Стриминговый режим через Flux позволяет получать токены от всех моделей одновременно и наблюдать разницу в стиле генерации в реальном времени: GPT-4 пишет гладко, Llama выдаёт неожиданные идеи, Claude склонен к осторожным формулировкам.

Наиболее сложный пример в материале — роутер на основе эмбеддингов. Эмбеддинг входящего вопроса вычисляется через EmbeddingClient, затем классификатор определяет тип задачи и выбирает подходящую модель: творческие и кодинг-задачи направляются к GPT-4, простые фактические запросы и математика — к локальной Llama, потенциально опасные запросы — к заглушке. Такой подход позволяет оптимизировать расходы на API, не жертвуя качеством там, где оно критично.

Spring ИИ развивается как часть экосистемы Spring Framework и ориентирован прежде всего на корпоративную Java-разработку. Аналогичные по идее инструменты существуют для других языков — LangChain для Python, Semantic Kernel от Microsoft для.NET и Python. Однако для Java-команд, уже работающих со Spring Boot, интеграция Spring ИИ требует минимального переключения контекста: те же аннотации, те же паттерны конфигурации, та же модель внедрения зависимостей.