Команда 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 и всего, что с ним связано.