Java Intelligence Spring AI: мощный инструмент для создания интеллектуальной модели чата за 5 минут
Java Intelligence Spring AI: мощный инструмент для создания интеллектуальной модели чата за 5 минут

Предисловие

Хотя Python в последнее время стал предпочтительным языком программирования, позиции Java в области искусственного интеллекта столь же непоколебимы благодаря мощной среде Spring. Благодаря быстрому развитию технологий искусственного интеллекта мы живем в эпоху постоянных инноваций. От умных голосовых помощников до сложных систем обработки естественного языка — искусственный интеллект стал неотъемлемой частью современной жизни и работы. В этом контексте проект Spring AI открыл возможности для развития. Хотя проект черпает вдохновение из таких проектов Python, как LangChain и LlamaIndex, Spring AI — это не простой порт. Первоначальная цель этого проекта — способствовать развитию генеративных приложений искусственного интеллекта, выходя за рамки только разработчиков Python.

Основная концепция Spring AI заключается в предоставлении высокоабстрактных компонентов в качестве основы для разработки приложений ИИ. Эти абстрактные компоненты имеют несколько реализаций, что позволяет разработчикам легко заменять и оптимизировать функциональные модули с минимальными изменениями кода.

В частности, Spring AI предоставляет функциональные возможности для поддержки нескольких основных поставщиков моделей, включая OpenAI, Microsoft, Amazon, Google и Hugging Face. Поддерживаемые типы моделей охватывают множество областей: от чат-ботов до генерации текста, обработки изображений, распознавания речи и т. д. Его переносимый дизайн API для поставщиков моделей не только поддерживает синхронные и потоковые интерфейсы, но также предоставляет гибкие возможности для конкретных функций модели.

Кроме того, Spring AI также поддерживает сопоставление выходных данных модели AI с POJO, а также возможность плавной интеграции с основными поставщиками векторных баз данных (такими как Apache Cassandra, Azure Vector Search, MongoDB Atlas и т. д.). Его функции не ограничиваются самой моделью, но также включают в себя структуру ETL и различные удобные вызовы функций при инженерии данных, что делает разработку приложений ИИ более эффективной и надежной.

Быстрая практика

Этот практический выпуск — наш первый, его цель — быстро продемонстрировать проект Spring AI, чтобы каждый мог понять его преимущества и особенности. Чтобы облегчить всем использование, я также отправил исходный код этой проблемы в хранилище и добавил интерфейс вызова API swagger-ui, чтобы сделать его более удобным в использовании. Если вас это интересует, добро пожаловать на звезду. В то же время я буду продолжать поддерживать этот проект, чтобы гарантировать, что он останется активным.

Адрес склада:https://github.com/StudiousXiaoYu/spring-ai-demo

Генерация проекта

когда мы начали,Для начала необходимо создать структуру проекта。мы можем пойти вОфициальный сайт,Быстро генерироватьSpring Зависимости ИИ и создание проектов.

image
image

модель чата

В больших моделях модель чата играет жизненно важную роль. Итак, как же SpringAI это инкапсулирует? Этот выпуск в основном посвящен демонстрации того, как эффективно использовать Spring. ChatClient для AI, в данном примере с применением Spring. Модель искусственного интеллекта чата。

Уровень журнала

в этом процессе,Если вы хотите просмотреть журнал деталей запроса,Обязательно установите Уровень журнала на DEBUG.,Конкретные операции заключаются в следующем:

image
image

Конфигурация модели

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

image
image

Внедрить модель

Затем модель можно автоматически внедрить, и мы сможем использовать ее напрямую. В этой демонстрации мы покажем три способа внедрения пользовательских моделей:

Язык кода:java
копировать
    private final ChatClient myChatClientWithSystem;

    private final ChatClient myChatClientWithParam;

    /**
     * Вы можете выбрать автоматическое внедрение или настроить его внутри метода. В этом клиенте нет системного текста.
     */
    private final ChatClient chatClient;

    public MyController(ChatClient.Builder chatClientBuilder, MyChatClientWithSystem myChatClient, MyChatClientWithParam myChatClientWithParam) {
        this.chatClient = chatClientBuilder.build();
        this.myChatClientWithSystem = myChatClient.client();
        this.myChatClientWithParam = myChatClientWithParam.client();
    }

Хорошо, позвольте мне объяснить эти три сценария:

  1. ChatClient: это автоматически внедряемый ChatClient по умолчанию, который не требует каких-либо условий.
  2. myChatClientWithParam: это ChatClient, который вводит в системный текст параметры.
  3. myChatClientWithSystem: это ChatClient, в который добавлен системный текст.

Ладно, с первым случаем разбираться не нужно, нам нужно лишь просто настроить следующие два ChatClients через класс конфигурации.

Язык кода:java
копировать
@Конфигурация
Конфигурация класса {

    @Бин
    MyChatClientWithSystem myChatClientWithSystem(построитель ChatClient.Builder) {
        MyChatClientWithSystem build = MyChatClientWithSystem.builder()
                .client(builder.defaultSystem("Кто ты Трудолюбивый Сяоюй, один человек Java Серверный кодер, посвященный исследованиям AI Секрет технологии. Я люблю техническое общение и обмен информацией, и я увлечен сообществом открытого исходного кода. Он превосходный автор Nuggets, соавтор контента Tencent Cloud, эксперт-блогер Alibaba Cloud и эксперт Huawei Cloud Sharing.")
                .build()).build();
        return build;
    }

    @Bean
    MyChatClientWithParam myChatClientWithParam(ChatClient.Builder builder) {
        MyChatClientWithParam build = MyChatClientWithParam.builder()
                .client(builder.defaultSystem("Вы {пользователь}.")
                        .build()).build();
        return build;
    }
}

простой текстовый ответ

Сначала давайте обсудим несколько простых вопросов и ответов.

Язык кода:java
копировать
    @GetMapping("/ai")
    String generationByText(String userInput) {
        return this.chatClient.prompt()
            .user(userInput)
            .call()
            .content();
    }

В этом кратком коде реализованы различные инкапсуляции и взаимодействия. Для лучшей демонстрации давайте покажем это:

image
image

Инкапсулировать объект сущности ответа

Всем известно, что Java — это объектно-ориентированный язык программирования, поэтому при добавлении технологии искусственного интеллекта для удовлетворения потребностей бизнеса необходимо включать объекты. Итак, как ответы искусственного интеллекта могут автоматически инкапсулироваться в объекты с помощью среды Spring? Давайте изучим это:

Определите класс записи объекта: определение класса записи (класс записи) с именем ActorFilms. Класс записи, используемый для инкапсуляции связанных полей, автоматически реализует методы toString(), Equals(), hashCode() и методы получения, что упрощает строковое представление, сравнение на равенство и вычисление хеш-функции объектов. Вы можете использовать actorFilms.toString(), actorFilms.equals(anotherActorFilms) и actorFilms.hashCode() напрямую.

Язык кода:java
копировать
public record ActorFilms(String actor, List<String> movies) {
}
Язык кода:java
копировать
    @GetMapping("/ai-Entity")
    ActorFilms generationByEntity() {
        ActorFilms actorFilms = chatClient.prompt()
                .user("Generate the filmography for a random actor.")
                .call()
                .entity(ActorFilms.class);
        return actorFilms;
    }

Как видите, просто установите сущность ActorFilms. Далее нам нужно проверить, соответствует ли возвращаемый объект ожидаемому.

image
image

Когда пользователь вводит информацию, система возвращает ответ типа сущности. Причина, по которой этот тип ответа типа сущности может быть инкапсулирован, заключается в том, что при отправке информации система не только отправляет текст, введенный пользователем, но и добавляет после него дополнительную информацию.

Generate the filmography for a random actor.\r\nYour response should be in JSON format.\r\nDo not include any explanations, only provide a RFC8259 compliant JSON response following this format without deviation.\r\nDo not include markdown code blocks in your response.\r\nRemove the ```json markdown from the output.\r\nHere is the JSON Schema instance your output must adhere to:\r\n```{\r\n \"$schema\" : \"https://json-schema.org/draft/2020-12/schema\",\r\n \"type\" : \"object\",\r\n \"properties\" : {\r\n \"actor\" : {\r\n \"type\" : \"string\"\r\n },\r\n \"movies\" : {\r\n \"type\" : \"array\",\r\n \"items\" : {\r\n \"type\" : \"string\"\r\n }\r\n }\r\n }\r\n}```\r\n

Поэтому, когда впоследствии возвращаются данные, это большая модель, такая как {"актер": "Эмили Блант", "фильмы": "Грань завтрашнего дня", "Тихое место", "Дьявол носит Prada", "Сикарио". , «Мэри Поппинс возвращается»}, чтобы Spring мог автоматически инкапсулировать его для меня.

Инкапсулирует объект сущности списка ответов.

Когда нам нужно вернуть список вместо объекта, мы можем легко использовать для этого функцию инкапсуляции Spring AI. Давайте посмотрим, как:

Язык кода:java
копировать
    @GetMapping("/ai-EntityList")
    List<ActorFilms> generationByEntityList() {
        List<ActorFilms> actorFilms = chatClient.prompt()
                .user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.")
                .call()
                .entity(new ParameterizedTypeReference<List<ActorFilms>>() {
                });
        return actorFilms;
    }

Просто используйте объект ParameterizedTypeReference напрямую. Чтобы позволить Spring автоматически инкапсулировать возвращаемые результаты, информация о формате возврата также включается в качестве подсказки при отправке информации. Теперь посмотрим на результаты демо.

image
image

Потоковое ответы

В примере, показанном ранее,Большие модели заполняют свои ответы за один раз и выводят их все пользователю. Однако,Передняя часть не может достичь эффекта пишущей машинки,Поэтому мы решили использовать Postock ответы способ продемонстрировать.

Язык кода:java
копировать
   @GetMapping("/ai-streamWithParam")
    Flux<String> generationByStreamWithParam() {
        var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<List<ActorFilms>>() {
        });

        Flux<String> flux = this.chatClient.prompt()
                .user(u -> u.text("""
                            Generate the filmography for a random actor.
                            {format}
                          """)
                        .param("format", converter.getFormat()))
                .stream()
                .content();

        String content = flux.collectList().block().stream().collect(Collectors.joining());

        List<ActorFilms> actorFilms = converter.convert(content);
        log.info("actorFilms: {}", actorFilms);
        return flux;
    }

Чтобы продемонстрировать передачу параметров в информации о пользователе,Я выполнил операцию блокировки на ответах Stock Stock. если не нужно,Это можно удалить.Также,Поскольку мне нужно инкапсулировать объект списка,Итак, была проведена операция блокировки. на самом деле,Это то же самое, что упоминалось выше,То есть формат, возвращаемый большой моделью, напрямую определяется в вопросе и ответе. ХОРОШО,Давайте посмотрим на полученные результаты.

image
image

клиент с системной информацией

На этот раз мы продемонстрируем конфигурацию клиента. В разговоре мы знаем, что есть три личности: система, пользователь и помощник. До сих пор мы не показывали идентичность системы, но предварительно определили клиентов в виде системы. Итак, на этот раз мы будем использовать его напрямую:

Язык кода:java
копировать
    @GetMapping("/ai-withSystemClient")
    Map<String, String> generationByTextWithSystemClient(String message) {
        return Map.of("completion", myChatClientWithSystem.prompt().user(message).call().content());
    }

Этот код очень прост: просто используйте ChatClient. После ввода пользователем будет возвращен ответ типа карты, где ключ — «завершение», а соответствующее значение — содержание ответа. Давайте посмотрим на результаты.

image
image

Видно, что он действительно включил мою системную информацию.

клиент с информацией о параметрах

Когда вам нужно продемонстрировать ситуацию с параметрами, вы можете рассмотреть следующий метод: после ввода пользователя вернуть ответ типа Map, который содержит пары ключ-значение, ключ — «завершение», а значение — соответствующий ответ. В реальных бизнес-сценариях параметры неизбежны, поэтому этот демонстрационный метод может лучше продемонстрировать применимость искусственного интеллекта. Давайте продолжим изучение этого:

Язык кода:java
копировать
    @GetMapping("/ai-withParamClient")
    Map<String, String> generationByTextWithParamClient(String message, String user) {
        return Map.of("completion", myChatClientWithParam.prompt().system(sp ->sp.param("user",user)).user(message).call().content());
    }

Это также очень простое предложение, поэтому давайте посмотрим на эффект:

image
image

Если вы не уверены в ответе, мы можем проверить журнал фоновой передачи, чтобы понять детали параметров передачи.

image
image

Можно заметить, что мы действительно успешно установили параметры.

История чата

В последнем крупном бизнес-сценарии у каждого будет своя история чата. Мы не можем продолжать вести разговоры без гражданства, это было бы неразумно. Поэтому функция записи чата необходима. Хотя Spring AI еще не полностью определил, как инкапсулировать эту часть функциональности, он предоставил нам простой класс объекта для вызова. Давайте посмотрим:

Язык кода:java
копировать
    @GetMapping("/ai-chatMemory")
    String generationByChatMemory(HttpServletRequest request, String userInput) {
        String sessionId = request.getSession().getId();
        chatMemory.add(sessionId, new UserMessage(userInput));
        String content = this.chatClient.prompt()
                .advisors(new MessageChatMemoryAdvisor(chatMemory))
                .user(userInput)
                .call()
                .content();
        chatMemory.add(sessionId, new AssistantMessage(content));
        return content;
    }

на самом деле,в этом случае,Нам нужно самим создать и поддерживать объект История чата. поэтому,До и после каждого чата,Нам всем следует добавить необходимую информацию в этот объект.,Затем используйте его напрямую. Давайте посмотрим на эффект такого подхода:

image
image
image
image

Как видите, исторические записи здесь действительно представлены.

Подвести итог

Благодаря введению этой статьи мы получили более глубокое понимание Spring. Преимущества и характеристики проектов ИИ, а также их практическое применение практический пример. Весна Являясь высокоабстрактной средой разработки приложений искусственного интеллекта, ИИ предоставляет разработчикам удобную поддержку моделей, гибкий обмен функциональными модулями и возможности оптимизации. Он может не только отображать выходные данные модели ИИ в POJO, но также легко интегрироваться с основными поставщиками векторных баз данных, тем самым значительно повышая эффективность и надежность разработки приложений ИИ.

По сравнению с Python Java имеет значительные преимущества в приложениях корпоративного уровня и больших системах. Статическая типизация и строгая проверка языка Java во время компиляции делают код более надежным и простым в обслуживании, что особенно подходит для проектов, требующих высокой надежности и долгосрочной поддержки. В то же время зрелость и широкое применение экосистемы Java гарантируют, что разработчики могут легко найти богатую поддержку библиотек и инструментов, что ускоряет цикл разработки и снижает риски проекта.

Я надеюсь, что эта статья поможет вам понять и применить проект Spring AI. Вы также можете следить за этим проектом и использовать его, а также продолжать уделять внимание обновлениям и обслуживанию. Давайте станем свидетелями непрерывного прогресса и применения технологий искусственного интеллекта!


Я Сяоюй, трудолюбивый программист Java-сервера, который посвятил себя изучению тайн технологии искусственного интеллекта. Я люблю техническое общение и обмен информацией, и я увлечен сообществом открытого исходного кода. Он превосходный автор Nuggets, соавтор контента Tencent Cloud, эксперт-блогер Alibaba Cloud и эксперт Huawei Cloud Sharing.

🚀 В настоящее время мое исследование сосредоточено на приложениях AI Agent. Мне это очень интересно, и я продолжаю изучать его потенциал и возможности. Если вы также увлечены этой областью, добро пожаловать, чтобы общаться и делиться со мной, и давайте вместе исследовать неизведанные области!

💡 Я без колебаний поделюсь своими личными исследованиями и опытом на техническом пути, надеясь вдохновить вас и помочь вам в обучении и росте.

🌟 Добро пожаловать, обратите внимание на трудолюбивого Сяоюй! 🌟

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose