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

Комментарии (0)