Подключение Spring AI к локальным AI-моделям с помощью Foundry Local

от автора

Команда Spring АйО перевела статью, которая покажет, как интегрировать Spring AI с Foundry Local — десктопным приложением от Microsoft, совместимым с OpenAI API. Вы узнаете, как настроить локальную AI-модель, подключить её к Spring Boot и создать REST-эндпоинты для чат-бота и суммаризации текста. Всё это — с акцентом на производительность, безопасность и автономность.


Что такое Azure AI Foundry и Foundry Local?

Azure AI Foundry — это комплексная платформа Microsoft для корпоративной разработки и внедрения решений на основе искусственного интеллекта. Она позволяет организациям создавать, настраивать и масштабировать AI-решения, обеспечивая инструменты, сервисы и инфраструктуру для разработки, тонкой настройки и развертывания моделей AI в производственных средах с соблюдением требований корпоративной безопасности и соответствия стандартам.

Foundry Local — это десктопное приложение-компаньон Azure AI Foundry, которое предоставляет возможности высокопроизводительного выполнения AI-моделей непосредственно на Вашей локальной машине. Это инструмент с открытым исходным кодом, предлагающий API, совместимый с OpenAI, что позволяет разработчикам запускать, тестировать и интегрировать большие языковые модели (LLM) прямо на собственном компьютере, без передачи данных в облако. Такой подход идеально подходит для разработки, тестирования и сценариев, требующих конфиденциальности данных или работы в автономном режиме.

Зачем использовать Foundry Local с Spring AI?

Запуск AI-моделей локально становится всё более ценным для Java-разработчиков, стремящихся снизить задержки, избавиться от зависимости от сетевого соединения и сократить расходы на использование API крупных моделей. Foundry Local обеспечивает простую интеграцию благодаря предоставлению API, совместимого с OpenAI, что позволяет Spring AI взаимодействовать с локальными моделями так, как если бы они были размещены в облаке.

В этом руководстве мы пошагово рассмотрим процесс настройки Foundry Local, его интеграции с проектом Spring Boot с использованием Spring AI, а также создание простого REST API для взаимодействия с AI-моделью в задачах чат-общения и суммирования. Это позволит вам выполнять высокопроизводительные локальные вычисления с моделями, такими как Phi-3.5, Qwen или DeepSeek, используя привычные подходы и структуры Spring.

Быстрая настройка

Шаг 1: Установите Foundry Local

Пользователи macOS могут установить Foundry Local с помощью Homebrew:

$ brew tap microsoft/foundrylocal $ brew install foundrylocal $ foundry --help

Это установит необходимые инструменты командной строки (CLI) для локального запуска и управления языковыми моделями.

Шаг 2: Загрузите и запустите модель

Прежде чем начать работу с моделью, необходимо просмотреть список доступных моделей, скачать нужную и загрузить её в память:

# Discover available models $ foundry model list  # Download the Phi-3.5 mini model $ foundry model download phi-3.5-mini  # Load it into memory for serving $ foundry model load phi-3.5-mini  # Check model and service status $ foundry service status

После загрузки модель будет доступна через локальный HTTP-эндпоинт с интерфейсом, совместимым с OpenAI.

Создание проекта Spring Boot

Вы можете воспользоваться Spring Initializr для быстрого создания проекта с необходимыми зависимостями.

Выполните следующую команду cURL, чтобы скачать стартовый Spring-проект с нужными зависимостями:

curl -G https://start.spring.io/starter.zip \     -d javaVersion=21 \     -d baseDir=demo \     -d language=java \     -d bootVersion=3.5.0 \     -d type=maven-project \     -d dependencies=web,spring-ai-openai \     -o demo.zip

Теперь распакуйте проект и откройте его в Visual Studio Code.

unzip demo.zip code demo/
Комментарий от команды Spring АйО

Поскольку пост написан Microsoft, конечно, они используют в качестве редактора VSCode. На самом деле никакой прямой связи с конкретным редактором кода тут нет. Поэтому, при желании, можете просто использовать ту IDE, которая Вам больше по душе.

Если вы добавляете Spring AI в уже существующий проект, используйте следующие зависимости Maven:

<dependencies>     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-web</artifactId>     </dependency>     <dependency>         <groupId>org.springframework.ai</groupId>         <artifactId>spring-ai-starter-model-openai</artifactId>         <version>1.0.0</version>     </dependency> </dependencies>

Эти зависимости подключают REST-интерфейс и обеспечивают интеграцию Spring AI с OpenAI.

Подключение Spring AI к Foundry Local

Шаг 1: Настройка параметров

Обновите файл application.properties, чтобы указать Spring AI на ваш локально запущенный экземпляр Foundry:

# Azure AI Foundry Local Configuration spring.ai.openai.api-key=not-used spring.ai.openai.base-url=http://localhost:8081 spring.ai.openai.chat.options.model=Phi-3.5-mini-instruct-generic-gpu # Server Configuration server.port=8080

Хотя в конфигурации требуется указать API-ключ, для локальных моделей он фактически использоваться не будет.

Шаг 2: Класс конфигурации

Этот конфигурационный класс настраивает клиент для взаимодействия с API, совместимым с OpenAI, и инициализирует чат-модель с локальными параметрами:

@Configuration  public class FoundryLocalConfig {      @Value("${spring.ai.openai.base-url}") private String baseUrl;     @Value("${spring.ai.openai.api-key}")  private String apiKey;     @Value("${spring.ai.openai.chat.options.model}") private String modelName;  @Bean public OpenAiApi openAiApi() { return OpenAiApi.builder().baseUrl(baseUrl).apiKey(apiKey).build(); }  @Bean public OpenAiChatModel chatModel(OpenAiApi openAiApi) {  OpenAiChatOptions options = OpenAiChatOptions.builder() .model(modelName) .temperature(0.7) .build(); return OpenAiChatModel.builder().openAiApi(openAiApi).defaultOptions(options).build(); } }

Это связующее звено, которое подключает абстракцию Spring AI к локальной модели, запущенной через Foundry.

Шаг 3: Реализация сервисного слоя

Создайте сервисный класс для взаимодействия с чат-моделью. В этом классе будет сосредоточена логика вызова модели:

@Service public class AIService {      private final OpenAiChatModel chatModel;      public AIService(OpenAiChatModel chatModel) { chatModel = chatModel;}      public String chat(String message) {         try {             return chatModel.call(message);         } catch (Exception e) {             throw new RuntimeException("Error calling AI model: " + e.getMessage(), e);         }     }      public String summarizeText(String text) {         String prompt = "Please provide a concise summary of the following text:\n\n" + text;         return chatModel.call(prompt);     } }

Методы chat() и summarizeText() инкапсулируют всю логику работы с моделью, благодаря чему контроллер остаётся чистым и лаконичным.

Шаг 4: Создание REST-эндпоинтов

Теперь откройте доступ к этим методам через HTTP-эндпоинты:

@RestController @RequestMapping("/api/ai") public class AIController {      private final AIService aiService;      public AIController(AIService aiService) { aiService = aiService; }      @PostMapping("/chat")     public ResponseEntity<Map<String, String>> chat(@RequestBody Map<String, String> request) {         String message = request.get("message");         if (message == null || message.trim().isEmpty()) {             return ResponseEntity.badRequest().body(Map.of("error", "Message is required"));         }          String response = aiService.chat(message);         return ResponseEntity.ok(Map.of("response", response));     }      @PostMapping("/summarize")     public ResponseEntity<Map<String, String>> summarize(@RequestBody Map<String, String> request) {          String text = request.get("text");          if (text == null || text.trim().isEmpty()) {             return ResponseEntity.badRequest().body(Map.of("error", "Text is required"));         }          String summary = aiService.summarizeText(text);         return ResponseEntity.ok(Map.of("summary", summary));      }      @GetMapping("/health")     public ResponseEntity<Map<String, String>> health() {          try {             aiService.chat("Hello");             return ResponseEntity.ok(Map.of("status", "healthy"));         } catch (Exception e) {             return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)                 .body(Map.of("status", "unhealthy", "error", e.getMessage()));         }     } }
Комментарий от команды Spring АйО

Авторы — люди, который пишут на C#. Там подход наименования некоторых элементов с «underscore» – это распространённая coding convention. В Java так не делайте.

С помощью этих эндпоинтов ваше приложение превращается в простой шлюз для локальных AI-инференций.

Запуск приложения

Шаг 1: Запустите Foundry Local

Настройте Foundry для обслуживания модели на порту 8081:

foundry service set --port 8081 foundry service start foundry model load phi-3.5-mini

Убедитесь, что сервис запущен и работает корректно, прежде чем запускать Spring Boot приложение.

Шаг 2: Запуск Spring Boot

Используйте Maven для сборки и запуска приложения:

mvn clean compile mvn spring-boot:run

Шаг 3: Проверьте работу эндпоинтов

Выполните запрос для проверки состояния сервиса:

curl http://localhost:8080/api/ai/health

Отправьте сообщение в чат:

curl -X POST http://localhost:8080/api/ai/chat \   -H "Content-Type: application/json" \   -d '{"message": "What is Spring AI?"}'

Суммируйте содержание блока текста:

curl -X POST http://localhost:8080/api/ai/summarize \   -H "Content-Type: application/json" \   -d '{"text": "Your long text here..."}'

Заключение

В этой статье мы узнали, как создать полностью локальное приложение с поддержкой AI, используя Spring AI и Foundry Local.

Благодаря совместимости Foundry с API OpenAI, для интеграции со Spring AI не потребовались дополнительные настройки — мы просто изменили базовый URL на localhost. Этот подход с приоритетом локального исполнения даёт ряд преимуществ:

  • Конфиденциальность и контроль: данные не покидают ваше устройство

  • Производительность: более низкие задержки по сравнению с облачными API

  • Экономия: отсутствие затрат на использование API и ограничений по количеству токенов

  • Простота: привычные конфигурации и подходы Spring

Такой сценарий позволяет быстро и эффективно разрабатывать локальные AI-решения с минимальными затратами и максимальной гибкостью.


Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм — Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.


ссылка на оригинал статьи https://habr.com/ru/articles/925074/