Чат-бот на Python (Deep Learning + TensorFlow). Часть IX: взаимодействие с нашим чат-ботом

Предыдущая статья: Чат-бот на Python (Deep Learning + TensorFlow). Часть VIII: изучаем концепции и параметры нашей модели.

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

В процессе обучения мы устанавливаем контрольные точки (по умолчанию — через каждую тысячу шагов) и сохраняем в них все параметры модели. Если же в какой-то момент времени вам вдруг потребуется прекратить обучение, вы можете это смело сделать и потом вернуться к уже предобученной модели в последней контрольной точке.

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

По умолчанию данные из контрольных точек сохраняются в директории model. В ней должны находиться файлы с названиями translate.ckpt-XXXXX, где числовое значение иксов соответствует номеру шага. Также, вместе с файлом под названием checkpoint, там имеются файлы с расширениями .data.index, и .meta. Если вы откроете файл checkpoint, вы увидите примерно следующее:

model_checkpoint_path: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-225000"
all_model_checkpoint_paths: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-221000"
all_model_checkpoint_paths: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-222000"
all_model_checkpoint_paths: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-223000"
all_model_checkpoint_paths: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-224000"
all_model_checkpoint_paths: "/home/paperspace/Desktop/nmt-chatbot/model/translate.ckpt-225000"

Здесь дана информация о том, какие именно сохраненные данные надо использовать в нашей модели. Если вы вдруг захотите использовать более старые данные, просто отредактируйте этот файл.

[machinelearning_ad_block]

Итак, чтобы загрузить модель, нам нужно всего 4 файла. Допустим, мы выбрали шаг 225000. Тогда, чтобы запустить модель или продолжить ее обучение, нам понадобятся вот эти четыре файла:

checkpoint
translate.ckpt-225000.meta
translate.ckpt-225000.index
translate.ckpt-225000.data-00000-of-00001

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

Помимо сохранения контрольных точек через каждые 1000 шагов, мы также записываем некие примеры работы нашего чат-бота. Они записываются каждые несколько тысяч шагов и попадают в директорию model под именами output_dev и output_test.

Вы можете использовать эти файлы, чтобы увидеть несколько примеров работы модели, которая запускается в консоли каждые 1000 шагов. Эти выходные файлы содержат только ответы на входящие комментарии (output_dev — ответы, которые генерирует наша модель, а output_test — ответы реальных людей).

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

Допустим у нас имеется тестовый файл tst2013.from следующего вида:

Aren ' t they streaming it for free online ... ?
try to get loud please
I ' m trying to eat a fajita here
E
It ' s been 3 innings and Spanton almost hit a dong .
Looks - wise yes , play - wise no
But we ' d both pay $ 9 . 9 9 to see that . newlinechar newlinechar Isn ' t he doing stuff for CZW ? Aren ' t they like extreme stuff , they should do a Punjabi Prison Match with CJ Parker .
' I simply feel as though the game is not for me . ' * Zaffre states , turning back to Ambrose , a frown on his face . *
The fire escape is there . You hear wood splintering , and look to see that a raptor has managed to break a hole in the top of the door , just above the dresser . Its head pokes through , then disappears . There ' s another thud , and the dresser moves forward a few inches .
[ ] ( / fritteehee ) I wonder how I ' ll make the eyes all red ...
3 6 0 , 6 7 8
I like the idea ... have an upvote !
who talks trash about Giannis ?
C
I ' m pretty sure that ' s the peace music .
Did well on my quiz today , am now eating ice cream . Good day .

А выходной файл output_dev выглядит вот так:

Yes they are .
I don ' t think I ' ve ever heard of this . I ' ll have to check it out .
<unk>
R
It ' s been a while since I ' ve seen it , but it ' s been a while since I ' ve seen it .
I don ' t think I ' ve ever played - wise .
I don ' t think he ' s doing anything for <unk> . I ' m sure he ' ll be fine .
' I don ' t feel as though the game is for me . '
That ' s what I was thinking as well .
[ ] ( / <unk> ) I don ' t know .
3 6 0 , 6 7 9
Thank you !
I don ' t think that ' s what he ' s talking about .
K
You ' re right , it ' s the peace music .
Good day .

Мы, конечно, можем вручную переключаться с файла на файл в поисках ответа на комментарий и обратно, однако это несколько утомительно, и поэтому мы написали вот такой вот скрипт:

output_file_location = 'output_dev'
tst_file_location = 'tst2013.from'

if __name__ == '__main__':
    with open(output_file_location,"r") as f:
        content = f.read()
        to_data = content.split('\n')

    with open(tst_file_location,"r") as f:
        content = f.read()
        from_data = content.split('\n')

    for n, _ in enumerate(to_data[:-1]):
        print(30*'_')
        print('>',from_data[n])
        print()
        print('Reply:',to_data[n]) 

Результат его работы будет иметь примерно такой вид:

______________________________
> Aren ' t they streaming it for free online ... ?

Reply: Yes they are .

Далее вы, возможно, захотите пообщаться с вашим ботом вживую. Для этого написан специальный код, находящийся здесь.

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

Если вы хотите получать более 10 правдоподобных ответов в сценарии вывода, вы можете увеличить beam_width и num_translations_per_input с 10 до 30 или даже больше.

Если вы желаете сделать что-то похожее на Чарльза из Твиттера, вы можете немного изменить скрипт взаимодействия. Например, мы берем существующий сценарий, а затем в цикле while True проверяем базу данных на предмет любых новых входных данных в социальных сетях. Если есть какие-либо вопросы, на которые еще не ответили, используем модель для создания ответа и сохранения его в базе данных. Затем, используя API Twitter / Twitch / Reddit, мы фактически создаем ответ.

Вам тоже нужно будет выбрать свой ответ. Вы можете просто брать первый ответ от чат-бота, но благодаря Beam Search можно увидеть довольно много вариантов и с тем же успехом использовать их! Если вы запустите такой код, то увидите, что есть много разных ответов:

chatbot inference output

Все чат-боты, скорее всего, будут отличаться, но, как отмечалось ранее, есть много проблем с ответами, которые мы можем здесь видеть.

Отлично, на этом пока и остановимся. На данный момент вы многие вещи можете настроить самостоятельно и поиграться с полученными результатами. Мы также все еще возимся с размерами моделей и экспериментируем с различными способами токенизации данных, чтобы иметь больший словарный запас для различных ответов. Также можно было бы взять общую модель и прогнать через нее главным образом саркастичные ответы, чтобы получить «Чарльза» с характером, но… посмотрим. До новых встреч!