Хотя 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 Зависимости ИИ и создание проектов.
В больших моделях модель чата играет жизненно важную роль. Итак, как же SpringAI это инкапсулирует? Этот выпуск в основном посвящен демонстрации того, как эффективно использовать Spring. ChatClient для AI, в данном примере с применением Spring. Модель искусственного интеллекта чата。
в этом процессе,Если вы хотите просмотреть журнал деталей запроса,Обязательно установите Уровень журнала на DEBUG.,Конкретные операции заключаются в следующем:
Когда мы используем модель, мы должны сначала добавить в проект соответствующие зависимости. После добавления зависимостей нам необходимо заполнить соответствующую информацию о конфигурации в файле конфигурации.
Затем модель можно автоматически внедрить, и мы сможем использовать ее напрямую. В этой демонстрации мы покажем три способа внедрения пользовательских моделей:
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();
}
Хорошо, позвольте мне объяснить эти три сценария:
Ладно, с первым случаем разбираться не нужно, нам нужно лишь просто настроить следующие два ChatClients через класс конфигурации.
@Конфигурация
Конфигурация класса {
@Бин
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;
}
}
Сначала давайте обсудим несколько простых вопросов и ответов.
@GetMapping("/ai")
String generationByText(String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
В этом кратком коде реализованы различные инкапсуляции и взаимодействия. Для лучшей демонстрации давайте покажем это:
Всем известно, что Java — это объектно-ориентированный язык программирования, поэтому при добавлении технологии искусственного интеллекта для удовлетворения потребностей бизнеса необходимо включать объекты. Итак, как ответы искусственного интеллекта могут автоматически инкапсулироваться в объекты с помощью среды Spring? Давайте изучим это:
Определите класс записи объекта: определение класса записи (класс записи) с именем ActorFilms. Класс записи, используемый для инкапсуляции связанных полей, автоматически реализует методы toString(), Equals(), hashCode() и методы получения, что упрощает строковое представление, сравнение на равенство и вычисление хеш-функции объектов. Вы можете использовать actorFilms.toString(), actorFilms.equals(anotherActorFilms) и actorFilms.hashCode() напрямую.
public record ActorFilms(String actor, List<String> movies) {
}
@GetMapping("/ai-Entity")
ActorFilms generationByEntity() {
ActorFilms actorFilms = chatClient.prompt()
.user("Generate the filmography for a random actor.")
.call()
.entity(ActorFilms.class);
return actorFilms;
}
Как видите, просто установите сущность ActorFilms. Далее нам нужно проверить, соответствует ли возвращаемый объект ожидаемому.
Когда пользователь вводит информацию, система возвращает ответ типа сущности. Причина, по которой этот тип ответа типа сущности может быть инкапсулирован, заключается в том, что при отправке информации система не только отправляет текст, введенный пользователем, но и добавляет после него дополнительную информацию.
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. Давайте посмотрим, как:
@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 автоматически инкапсулировать возвращаемые результаты, информация о формате возврата также включается в качестве подсказки при отправке информации. Теперь посмотрим на результаты демо.
В примере, показанном ранее,Большие модели заполняют свои ответы за один раз и выводят их все пользователю. Однако,Передняя часть не может достичь эффекта пишущей машинки,Поэтому мы решили использовать Postock ответы способ продемонстрировать.
@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. если не нужно,Это можно удалить.Также,Поскольку мне нужно инкапсулировать объект списка,Итак, была проведена операция блокировки. на самом деле,Это то же самое, что упоминалось выше,То есть формат, возвращаемый большой моделью, напрямую определяется в вопросе и ответе. ХОРОШО,Давайте посмотрим на полученные результаты.
На этот раз мы продемонстрируем конфигурацию клиента. В разговоре мы знаем, что есть три личности: система, пользователь и помощник. До сих пор мы не показывали идентичность системы, но предварительно определили клиентов в виде системы. Итак, на этот раз мы будем использовать его напрямую:
@GetMapping("/ai-withSystemClient")
Map<String, String> generationByTextWithSystemClient(String message) {
return Map.of("completion", myChatClientWithSystem.prompt().user(message).call().content());
}
Этот код очень прост: просто используйте ChatClient. После ввода пользователем будет возвращен ответ типа карты, где ключ — «завершение», а соответствующее значение — содержание ответа. Давайте посмотрим на результаты.
Видно, что он действительно включил мою системную информацию.
Когда вам нужно продемонстрировать ситуацию с параметрами, вы можете рассмотреть следующий метод: после ввода пользователя вернуть ответ типа Map, который содержит пары ключ-значение, ключ — «завершение», а значение — соответствующий ответ. В реальных бизнес-сценариях параметры неизбежны, поэтому этот демонстрационный метод может лучше продемонстрировать применимость искусственного интеллекта. Давайте продолжим изучение этого:
@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());
}
Это также очень простое предложение, поэтому давайте посмотрим на эффект:
Если вы не уверены в ответе, мы можем проверить журнал фоновой передачи, чтобы понять детали параметров передачи.
Можно заметить, что мы действительно успешно установили параметры.
В последнем крупном бизнес-сценарии у каждого будет своя история чата. Мы не можем продолжать вести разговоры без гражданства, это было бы неразумно. Поэтому функция записи чата необходима. Хотя Spring AI еще не полностью определил, как инкапсулировать эту часть функциональности, он предоставил нам простой класс объекта для вызова. Давайте посмотрим:
@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;
}
на самом деле,в этом случае,Нам нужно самим создать и поддерживать объект История чата. поэтому,До и после каждого чата,Нам всем следует добавить необходимую информацию в этот объект.,Затем используйте его напрямую. Давайте посмотрим на эффект такого подхода:
Как видите, исторические записи здесь действительно представлены.
Благодаря введению этой статьи мы получили более глубокое понимание Spring. Преимущества и характеристики проектов ИИ, а также их практическое применение практический пример. Весна Являясь высокоабстрактной средой разработки приложений искусственного интеллекта, ИИ предоставляет разработчикам удобную поддержку моделей, гибкий обмен функциональными модулями и возможности оптимизации. Он может не только отображать выходные данные модели ИИ в POJO, но также легко интегрироваться с основными поставщиками векторных баз данных, тем самым значительно повышая эффективность и надежность разработки приложений ИИ.
По сравнению с Python Java имеет значительные преимущества в приложениях корпоративного уровня и больших системах. Статическая типизация и строгая проверка языка Java во время компиляции делают код более надежным и простым в обслуживании, что особенно подходит для проектов, требующих высокой надежности и долгосрочной поддержки. В то же время зрелость и широкое применение экосистемы Java гарантируют, что разработчики могут легко найти богатую поддержку библиотек и инструментов, что ускоряет цикл разработки и снижает риски проекта.
Я надеюсь, что эта статья поможет вам понять и применить проект Spring AI. Вы также можете следить за этим проектом и использовать его, а также продолжать уделять внимание обновлениям и обслуживанию. Давайте станем свидетелями непрерывного прогресса и применения технологий искусственного интеллекта!
Я Сяоюй, трудолюбивый программист Java-сервера, который посвятил себя изучению тайн технологии искусственного интеллекта. Я люблю техническое общение и обмен информацией, и я увлечен сообществом открытого исходного кода. Он превосходный автор Nuggets, соавтор контента Tencent Cloud, эксперт-блогер Alibaba Cloud и эксперт Huawei Cloud Sharing.
🚀 В настоящее время мое исследование сосредоточено на приложениях AI Agent. Мне это очень интересно, и я продолжаю изучать его потенциал и возможности. Если вы также увлечены этой областью, добро пожаловать, чтобы общаться и делиться со мной, и давайте вместе исследовать неизведанные области!
💡 Я без колебаний поделюсь своими личными исследованиями и опытом на техническом пути, надеясь вдохновить вас и помочь вам в обучении и росте.
🌟 Добро пожаловать, обратите внимание на трудолюбивого Сяоюй! 🌟