Полное руководство по созданию чат-бота
По мере того, как мир становится умнее, совершенствуются и технологии, которые мы используем. На данный момент фреймворки и алгоритмы искусственного интеллекта и машинного обучения становятся все лучше и лучше с каждой неделей.
Возможно, Tensorflow от Google — лучшая среда машинного обучения. Недавно Tensorflow был обновлен до версии 2.2. Однако этот чат-бот будет использовать TensorFlow 1.14. Эта версия может быть старше, но она по-прежнему очень функциональна.
В этой статье я покажу вам, как создать чат-бота с помощью Python. Предложите лучшие настройки для использования и покажите некоторые из моих результатов. Этот чат-бот использует Nmt-Chatbot от Sentdex и Daniel Kukiela, https://github.com/daniel-kukiela/nmt-chatbot, их работа очень впечатляет, и вам обязательно стоит их проверить.
Код
Этот учебник будет продемонстрирован в Windows 10, однако эти шаги будут работать на большинстве современных платформ; некоторые команды будут отличаться. Я предполагаю, что у вас уже установлены pip и python3. Если вы используете видеокарту Nvidia (рекомендуется), вам потребуется CUDA 10, последние версии драйверов и последняя версия cuDNN. Если вы используете видеокарту AMD, это руководство будет работать, вам понадобится промежуточный слой. В этом вам поможет быстрый гугл.
Для начала я бы порекомендовал запустить этого чат-бота внутри виртуальной среды или на виртуальной машине, это исключает возможность конфликтующих пакетов. В терминале (командная строка) выполните:
pip install tensorflow-gpu==1.14
Это установит версию TensorFlow 1.14 для графического процессора, если у вас нет графического процессора, и вы будете обучать свою модель при запуске ЦП:
pip install tensorflow==1.14
Далее нам понадобится пакет, над которым работали Даниэль и Харрисон. Если вы работаете в Linux, вы можете просто запустить curl, чтобы загрузить пакет. Однако вы также можете скачать ZIP-архив напрямую с GitHub, перейти по адресу https://github.com/daniel-kukiela/nmt-chatbot и скачать архив. Извлеките его в новый каталог, вам будет представлено несколько файлов и папок.
Далее вам нужно установить все необходимые пакеты для этого проекта. Внутри корневого каталога nmt-chatbot откройте терминал или командную строку и выполните:
pip install -r requirements.txt
Примечание. Если вы установили версию Tensorflow для ЦП, то перед выполнением вышеуказанной команды отредактируйте текстовый файл требований и удалите верхнюю строку.
Кроме того, вам потребуются дополнительные файлы. Перейдите по адресу https://github.com/ZotecXIX/NMT-ChatBot-Prep, загрузите дополнительные файлы и распакуйте их в отдельный каталог из вашего nmt -чатбот один. Снова установите требования, как раньше.
Набор данных
Теперь, когда у нас есть весь код, который нам понадобится для создания нашего чат-бота, нам нужны некоторые данные для работы. В этом уроке я буду использовать Reddit в качестве источника данных. Эта ссылка https://files.pushshift.io/reddit/comments/ приведет вас на веб-сайт push-shift, который содержит все комментарии, когда-либо оставленные на Reddit с декабря 2005 года по сентябрь 2019 года. Для моего чат-бота я использую все 9 месяцев 2019 года в качестве моего набора данных, обратите внимание, что вам не нужно столько данных; одного месяца будет достаточно.
Загрузите месяцы, которые вы хотите использовать, и извлеките их, загрузка займет некоторое время. Для извлечения файлов вам понадобится Linux (виртуальная) машина. Вы можете использовать что-то вроде VM ware player 15 для запуска, любой дистрибутив Linux, вероятно, будет работать; однако я использовал Ubuntu 16.04. Вам понадобится пакет под названием «zstd» для извлечения файлов, вы можете установить его с помощью:
apt-get install zstd
Затем откройте терминал в каталоге, содержащем ваши комментарии Reddit, и введите:
zstd -d <name of file>
Обязательно включите расширение .zst.
Теперь у вас есть большой несжатый файл, содержащий комментарии Reddit за месяц. Перенесите его обратно на компьютер, на котором вы работаете, и поместите его в каталог NMT-ChatBot-Prep. Затем вам нужно отредактировать файл «DB-Builder.py», измените временные рамки в строке 6 на имя вашего файла. например, «2017–06». Сохраните и закройте файл.
В следующей части настоятельно рекомендуется запустить следующий код на SSD, это значительно ускорит процесс. Откройте командную строку/терминал в том же каталоге и введите:
python DB-Builder.py
Теперь, по какой-либо причине, если вы остановите запуск программы, убедитесь, что вы записали строку, в которой программа находится в данный момент. В следующий раз, когда вы запустите код, измените «start_row» на строку, на которой вы остановили программу. Это помешает вам начать заново, с чистого листа. Этот код создаст базу данных sqlite (.db), внутри этой базы данных будут все комментарии Reddit, которые имеют более двух голосов, я использую 2, так как это настройка по умолчанию. Однако вы можете изменить это, если хотите использовать больше комментариев «Понравилось».
После этого откройте «File-Creator.py», измените «таймфрейм» на тот, что в DB-Builder. и запустите:
python File-Creator.py
Этот код создаст train.to и train.from вместе с двумя другими файлами. Переместите эти четыре файла в «new_data» внутри nmt-chatbot. Ваш набор данных готов.
Гиперпараметры
Теперь, когда у нас есть набор данных, нам нужно изменить некоторые гиперпараметры. Внутри каталога «setup» откройте settings.py. Основные вещи, которые вы захотите изменить, следующие: «vocab_size», «num_train_steps», «num_layers», «num_units» и «batch_size».
Настройки по умолчанию будут работать примерно с 4 ГБ видеопамяти, если у вас больше видеопамяти на вашем графическом процессоре, соответственно увеличьте некоторые из вышеуказанных параметров.
Примечание. Tensorflow не будет использовать 100 % видеопамяти вашего графического процессора, он будет использовать примерно на 2 ГБ меньше, чем у вас на борту. Это связано с тем, что ваш графический процессор необходим для запуска дисплеев. Tensorflow может использовать ровно 6314 МБ из 8 ГБ видеопамяти на моей RTX 2070.
Первый параметр, который вам нужно увеличить, — это размер словарного запаса. Если у вас есть запасная видеопамять, увеличьте эту цифру примерно до 50 000, что сделает чат-бота намного лучше. Увеличение «num_layers» и «num_units» не так сильно повлияет на чат-бота; как увеличение размера словарного запаса с места в карьер, но будет иметь значение. Например, GPT-2 имеет размер словарного запаса ~ 50 000, имеет 12 слоев и 768 единиц.
Количество слоев и единиц напрямую влияет на время обучения модели, но обычно делает чат-бота лучше. Убедитесь, что вы не делаете модель слишком большой, иначе вы «подгоните» модель. Это происходит, когда вы не даете модели достаточно обучающих данных.
Наконец, размер пакета влияет на скорость обучения модели, но не влияет на производительность самой модели. Однако размер пакета будет использовать больше видеопамяти. «num_train_steps» напрямую связан с размером партии. Чтобы рассчитать количество шагов обучения, вам нужно разделить количество строк в вашем файле «train.to» на размер пакета. Убедитесь, что вы нашли золотую середину, а метод проб и ошибок — ваш лучший друг.
Данные для обучения
Когда вы изменили свой файл «Settings.py», вы можете начать с ваших данных обучения. К счастью, этот процесс очень прост. Откройте командную строку/терминал внутри каталога «setup» и введите:
python prepare_data.py
Для меня, используя комментарии Reddit за 9 месяцев, этот процесс занимает около 7 часов на 2 E5–2450L.
Обучение модели
Когда «prepare_data.py» завершит работу, вы можете приступить к обучению своей модели. Перейдите в корневой каталог и откройте командную строку/терминал. Бегать:
python train.py
Это начнет обучать вашу модель, если вы получите ошибку «исчерпание ресурсов» или «переполнение памяти», ваша модель слишком велика и не помещается в объем имеющейся у вас видеопамяти. Чтобы исправить это, вам придется уменьшить либо «num_units», «num_layers», либо размер партии.
Неизбежно вам захочется выключить машину. Это остановит обучение модели. Если вы захотите перезапустить и продолжить обучение, вам придется изменить один файл. Определите шаг, на котором остановилась ваша модель, чтобы найти его, перейдите в каталог «модель» и найдите файл «контрольная точка», в верхней строке найдите число, оно будет исчисляться тысячами, скопируйте его.
Далее вернитесь в корневой каталог. Перейдите в каталог «nmt», затем снова «nmt», наконец, найдите файл «nmt.py». Откройте его и прокрутите вниз до строки 391, измените «epoch_step» с 0 на число из файла «checkpoint», сохраните и выйдите. Вам придется изменять «epoch_step» каждый раз, когда вы перезапускаете обучение модели. Теперь вы можете снова запустить «train.py».
Во время обучения вы получите множество важных данных, отображаемых для вас. Безусловно, самое важное, на что следует обратить внимание, — это «ppl» или «недоумение». Это мера того, насколько хорошо модель предсказывает выборку. Вы хотите, чтобы недоумение было как можно ниже, около 40 очень хорошо.
Вывод
Когда вы считаете, что ваша модель достаточно обучена, вы можете запустить:
python inference.py
Это позволит вам взаимодействовать с обученной моделью.
Некоторые примеры одной из моделей, которые я обучил, приведены ниже, nmt — это ответ модели на src.
Как видите, модель хорошо отзывается. Модель не идеальна, и ей еще нужно немного потренироваться.