ИИ на Java Создание клонированного чата ChatGPT с помощью Spring Boot и LangChain

Создание клонированного чата ChatGPT с использованием Spring Boot и LangChain на платформе Java и искусственного интеллекта

Многие библиотеки для разработки приложений искусственного интеллекта в основном написаны на Python или JavaScript. Хорошая новость заключается в том, что у некоторых из этих библиотек также есть Java API. В этом руководстве я покажу вам, как создать клон ChatGPT с использованием Spring Boot, LangChain и Hilla.

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

Законченный исходный код

Вы можете найти исходный код для примера в моем репозитории на GitHub.

Требования

  • Java 17+
  • Node 18+
  • Ключ API OpenAI в переменной окружения OPENAI_API_KEY

Создание проекта Spring Boot и React, добавление LangChain

Сначала создайте новый проект Hilla, используя Hilla CLI. Это создаст проект Spring Boot с фронтендом React.

Откройте сгенерированный проект в вашей IDE. Затем добавьте зависимость LangChain4j в файл pom.xml:

Простые завершения чата OpenAI с использованием LangChain

Мы начнем изучение LangChain4j с простого синхронного завершения чата. В этом случае нам нужно вызвать API завершения чата OpenAI и получить один ответ. Мы также хотим отслеживать до 1000 токенов истории чата.

В пакете com.example.application.service создайте класс ChatService.java со следующим содержимым:

  • Аннотация @BrowserCallable делает класс доступным для фронтенда.
  • Аннотация @AnonymousAllowed позволяет анонимным пользователям вызывать методы.
  • Аннотация @Value внедряет ключ API OpenAI из переменной окружения OPENAI_API_KEY.
  • Assistant – это интерфейс, который мы будем использовать для вызова API чата.
  • init() инициализирует ассистента с памятью из 1000 токенов и моделью gpt-3.5-turbo.
  • chat() – это метод, который мы будем вызывать с фронтенда.

Запустите приложение, запустив Application.java в вашей IDE или с помощью цели по умолчанию Maven:

Это сгенерирует типы TypeScript и сервисные методы для фронтенда.

Затем откройте файл App.tsx в папке frontend и обновите его следующим содержимым:

  • Мы используем компоненты MessageList и MessageInput из библиотеки компонентов Hilla UI.
  • sendMessage() добавляет сообщение в список сообщений и вызывает метод chat() в классе ChatService. Когда ответ получен, он добавляется в список сообщений.

Теперь у вас есть работающее приложение чата, которое использует API чата OpenAI и отслеживает историю чата. Оно отлично работает для коротких сообщений, но медленно отвечает на длинные ответы. Чтобы улучшить пользовательский опыт, мы можем использовать потоковое завершение, отображая ответ в процессе получения.

Потоковое завершение чата OpenAI с использованием LangChain

Давайте обновим класс ChatService, чтобы использовать потоковое завершение:

Код в основном аналогичен предыдущему, но есть несколько важных отличий:

  • Assistant теперь возвращает TokenStream вместо String.
  • init() использует streamingChatLanguageModel() вместо chatLanguageModel().
  • chatStream() возвращает Flux<String> вместо String.

Обновите App.tsx следующим содержимым:

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

Запустите приложение снова и вы увидите, что ответ отображается по мере его получения.

Заключение

Как вы видите, с помощью LangChain легко создавать AI-приложения на Java и Spring Boot, работающие на основе LLM.

Имея базовую настройку, вы можете расширить функциональность, объединяя операции, добавляя внешние инструменты и т. д., следуя примерам на странице проекта LangChain4j на GitHub, которая была упомянута ранее в этой статье. Узнайте больше о Hilla в документации по Hilla.