Пошаговое руководство по созданию быстрого чат-бота для вопросов и ответов

Amazon объявила об общедоступности Amazon Kendra несколько недель назад. Kendra - это высокоточная и простая в использовании служба корпоративного поиска, основанная на машинном обучении.

В этом посте я создам решение для чат-бота в формате вопросов и ответов, используя React с Amplify, WebSocket API в AWS API Gateway , AWS Fargate и Amazon Kendra.

Решение предоставляет диалоговый интерфейс для вопросов и ответов. Этот чат-бот позволяет пользователям задавать свои вопросы и быстро получать актуальные ответы.

О чем мы расскажем в этом посте:

  • Создайте индекс Amazon Kendra, извлеките вопросы и ответы из полуструктурированного документа в FAQ Kendra.
  • Разверните API WebSocket в API Gateway для обработки вопросов и ответов на сообщения.
  • Создайте приложение React и используйте AWS Amplify для подключения и взаимодействия с этим чат-ботом через WebSocket.
  • Создайте сервис в AWS Fargate, который позволит нашему боту вызывать API Кендры, чтобы предоставить ответ и отправить его обратно пользователю.

На следующей схеме показана архитектура вышеуказанных шагов:

Почему важен AWS Fargate?

Более простой подход к созданию чат-бота - использовать лямбда-функцию для запроса Amazon Kendra без использования Fargate. Однако с помощью AWS Fargate или EC2 мы можем расширить чат-бота пользовательскими моделями ИИ, чтобы сделать нашего бота более человечным, например. Мы можем создать чат-бота на основе модели Hugging Face State of the Art Conversational AI и запрашивать у Кендры только определенные данные.

Если ваша программа представляет собой длительную вычислительную задачу, которая требует большего объема памяти и более высокой производительности, Fargate, вероятно, будет лучшим вариантом.

Предпосылки

  • Создать учетную запись AWS
  • Установите последнюю версию aws-cli
  • Установите Amplify cli
  • Базовое понимание React
  • Базовое понимание Docker
  • Базовое понимание CloudFormation
  • Установите или обновите Serverless Framework до последней версии.
  • Jq установлен (необязательно)

А теперь приступим!

Создание индекса Amazon Kendra

Давайте создадим индекс Кендры. Amazon Kendra - это высокоточная и простая в использовании служба поиска для предприятий, основанная на машинном обучении. Kendra поддерживает неструктурированные и частично структурированные документы, такие как часто задаваемые вопросы, хранящиеся в S3, в нашем случае мы будем использовать часто задаваемые вопросы.

Сначала давайте загрузим набор данных QnA и загрузим его в S3. Мы можем использовать
Microsoft Research WikiQA Corpus для нашего чат-бота.

После загрузки набора данных давайте преобразуемся в поддерживаемый Kendra формат csv, как показано ниже:

Используйте следующий сценарий для преобразования набора данных и загрузки преобразованного CSV-файла в существующую корзину S3 my-kendra-index:

Теперь мы готовы создать индекс Кендры. Чтобы создать индекс Кендры, выполните следующие действия:

  1. На консоли Amazon Kendra выберите Запустить Amazon Kendra.
  2. Создайте индекс и введите имя индекса, например my-aq-index.
  3. Для роли IAM выберите Create a new role, чтобы создать роль, позволяющую Amazon Kendra получать доступ к журналам CloudWatch.
  4. Создать индекс.

После создания индекса Кендры мы можем добавить наш документ с часто задаваемыми вопросами:

  1. Добавьте FAQ из консоли Amazon Kendra.
  2. Для S3 просмотрите S3, чтобы найти свою корзину, и выберите csv-файл FAQ. Здесь мы используем s3://my-kendra-index/faq/faq.csv.
  3. Для роли IAM выберите Create a new role, чтобы разрешить Amazon Kendra доступ к объекту содержимого FAQ в корзине S3.
  4. Добавьте FAQ.

Теперь, когда у нас есть рабочий индекс Кендры, перейдем к следующему шагу.

Развертывание WebSocket API в API Gateway для обработки сообщений QnA

В этом разделе мы создадим 1) API WebSockets в AWS API Gateway, 2) создадим лямбда-функции для управления маршрутами WebSockets ($ connect, $ disconnect, sendMessage ) и 3) создайте DynamoDb для хранения идентификаторов подключения WebSockets и имен пользователей.

Мы будем использовать Serverless Framework для создания и развертывания всех необходимых ресурсов. давайте создадим новый бессерверный проект и добавим в serverless.yml следующую конфигурацию:

Обратите внимание, что идентификатор клиента приложения Cognito (/chatbot/dev/app_client_id) и идентификатор пула пользователей Cognito (/chatbot/dev/user_pool_id) в serverless.yml еще не созданы. Здесь мы ссылаемся только на сведения о Cognito как SSM Parameters, на следующем шаге мы создадим пул пользователей Cognito, используя Amplify Cli, а затем мы может изменять связанные параметры SSM из консолиSystem Storage Manager.

После изменения serviceless.yml обновите handler.js , чтобы создать лямбда-функции для маршрутов WebSockets: $connect with _16 _, _ 17_, sendMessage:

Выполните следующие команды, чтобы развернуть WebSocket API:

$sls deploy --stage dev --region YOUR_REGION

Создание приложения React с помощью AWS Amplify

В этом разделе мы создадим веб-приложение с использованием React и AWS Amplify с функцией аутентификации.

Полный проект находится в моем репозитории Github, в каталоге проекта вы можете найти следующие папки:

  1. amplify/.config/ и amplify/backend/.
  2. project-config.json в .config/ папке.
  3. backend-config.json в backend/ папке.
  4. Файлы CloudFormation в папке backend/.

Давайте загрузим исходный код и повторно инициализируем существующий проект Amplify, запустив:

$amplify init

затем нажмите изменения:

$amplify push 

и развернуть:

$amplify publish

Мы получим URL-адрес веб-приложения после развертывания проекта:

Теперь войдите в сервисную консоль AWS Cognito, и вы увидите, что пул пользователей AWS Cognito создан. Скопируйте идентификатор пула пользователей и идентификатор клиента приложения и используйте их в качестве параметров SSM, которые мы уже создали на предыдущем шаге.

Создание сервиса чат-бота в AWS Fargate

В этом разделе мы создадим задачу бота для запуска нашего сервиса чат-бота в AWS Fargate. Сначала задача чат-бота подключается к API веб-сокета. Затем, когда пользователь задает вопрос, бот может запросить индекс Кендры, и Кендра отобразит соответствующий ответ и отправит его обратно пользователю, задавшему вопросы.

Чтобы развернуть сервис Fargate, выполните следующие действия:

  1. Загрузите скрипт чат-бота и Dockerfile здесь.
  2. Создайте Docker, отметьте репозиторий Amazon ECR и отправьте образ в ECR. Дополнительные сведения см. В официальном руководстве AWS.
  3. Загрузите шаблоны CloudFormation и сценарии bash здесь.
  4. При использовании типа запуска Fargate требуется режим awsvpc network. Нам нужно развернуть VPC и Security Groups:
$bash create-infra.sh -d dev

5. Создайте определение задачи.

$bash create-task.sh -d dev

6. Разверните сервис чат-бота в AWS Fargate.

$bash deploy-service.sh -d dev

Основная логика находится здесь:

(Необязательно) Расширение чат-бота с помощью модели ConvAI

Чтобы расширить чат-бота с помощью модели ConvAI, вы можете попробовать приведенный ниже пример сценария, обратите внимание, что вам нужно будет приложить больше усилий, чтобы обучить модель и поместить ее в докер или Amazon EFS.

После того, как служба будет развернута, мы сможем задавать вопросы боту. Давайте зайдем в приложение React и попробуем его вживую!

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

Если вы хотите узнать больше о Amazon Kendra, есть официальное руководство по созданию чат-бота с помощью Лекса и Кендры здесь.

Я надеюсь, что вы нашли эту статью полезной. Исходный код этой публикации можно найти в моем репозитории GitHub.