Все ведь смотрели терминатор? Помните там говорилось, что скайнет захватит мир? Вот сегодня мы выступим в роли его создателей и создадим свой скайнет на базе Character.AI API. 🙂
Важно! Если вы не читали первые две статьи, то обязательно прочтите начиная с первой. Это важно, т.к. читать данную статью без знаний представленных в первых двух статьях бесполезно. Прочтите и возвращайтесь сюда.
Сегодня мы сделаем так, чтобы боты общались не только с нами, но и между собой. Интересно? Тогда начнем.
Если тебе хочется сохранить вариант, где только ты можешь задавать вопросы боту, то лучше сделай копию файлов.
Оптимизация кода
Первое с чего бы хотелось начать, это с беспокойства того, что наш код не является выразительным, т.е. его тяжело читать. А происходит это потому, что в нем встречается дублирование. Давайте для себя определим одно табу - дублирование кода является злом. Поэтому создадим отдельный файл, который назовем functions.py, где будем хранить все функции используемые в основном файле.
Теперь обратим внимание на проблему в нашем коде:
Вот это место, где наш код дублируется. Было бы прекрасно, чтобы в данном файле эти 10 строчек кода занимали всего две, которые будут вызывать функцию отправки сообщения. Давайте функцию так и назовем, отправка сообщения (send_message), а в её содержимое вставим верхний участок кода.
Теперь определим аргументы функции. На необходимо передать сообщение и устранить три зависимости: объект чата (chat), имя персонажа (tgt) и экземпляр класса (client).
Сообщение, объект чата и экземпляр класса клиента предлагаю передать в аргументе, а вот имя персонажа мы получим путем оптимизации кода в основном файле. Определим этим два аргумента и давай заменим
Осталось устранить проблему с именем персонажа. В коде основного файла у нас есть вот такой некрасивый участок кода.
В первую очередь нам необходимо создать еще одну функцию, куда мы вынесем данный код. Давай назовем её get_character_name.
Думаю, что вы уже догадались, что сюда достаточно лишь передать аргумент в виде объекта чата (chat) и мы сможем получать имя вызывая данную функцию даже из send_message, т.к. там есть объект чата (chat).
Еще хотелось бы сделать код более читаемым и убрать эти непонятные индексы в виде 0 и 1, которые используются в списке участников (participants) предлагаю сделать для них понятные константы. В результате вернем имя персонажа.
Теперь получаем имя персонажа в функции send_message и возвращаем картеж с именем и текстом сообщения персонажа.
Теперь подключим данные функции в основном файле и оптимизируем его убрав лишнее и заменив на данные функции.
Теперь оптимизируем участок с получением имени персонажа.
Далее оптимизируем два участка с отправкой сообщения.
Переходим ко второму участку.
Код основного файла стал более читаемым. Давай проверим, что ничего н сломалось. Запусти и проверь, чтобы убедиться в том, что нет ошибок.
Теперь перейдем к нашей основной задаче.
Создаем общение между персонажами
Теперь переходим к самому главному, к созданию общения между персонажами. У нас есть вот эти строчки, которые определяют чат с нашим персонажем.
Давай их тоже выведем в отдельную функцию по такому же принципу, как две предыдущие.
Оптимизируем основной файл.
Теперь оптимизируем строки получение чата.
Чтобы у нас было два разных чата, создадим вторую строку и назовем её переменную chat2.
Дальше в нашем коде идет просьба представиться первого персонажа, а затем печатается его имя и ответ. Предлагаю добавить туда второй запрос, где второму персонажу будет отправляться ответ первого и в ответ будет напечатано его сообщение. Так они поздороваются и представятся.
Теперь давай запустим.
Ура! Персонажи начали общение. Теперь необходимо его продолжить. Перед тем, как перейдем редактированию беконечного цикла, давай задумаемся о том, что сообщения стоит читать с задержкой, поэтому позаботимся о соответствующей библиотеке time, которую заблаговременно подключим в основном файле.
Отсюда нам понадобится функция временного засыпания кода sleep. Теперь перейдем к редактированию кода. Запоминаем, что от второго персонажа нам пришло последнее сообщение, которое сейчас хранится в переменной character_name, давай его присвоим до цикла переменной под названием второй персонаж (second_character_message).
Далее в цикле просто создаем запросы для каждого персонажа последовательно, в соответствии с их ответами. Главное поставить задержку секунд в 10.
Теперь можем проверять.
Воу, эти ребят похоже знают толк в общении 🙂. Все готово! Теперь при каждом перезапуске начинается новое общение с новыми популярными персонажами.
Подписывайся на канал и ставь лайки. Дальше будет интереснее. Переходи к следующей статье по данной теме.