Николай Пискунов, руководитель направления 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 ИИ требует минимального переключения контекста: те же аннотации, те же паттерны конфигурации, та же модель внедрения зависимостей.

