Создайте своего собственного бота Рика, используя API Hugging face, и разверните его на сервере Replit.

Введение

Если вы когда-нибудь задавались вопросом, как работает бот Discord и как вы можете создать своего собственного бота, который говорит как определенная знаменитость или определенный персонаж из ваших любимых мультсериалов, вы находитесь в лучшем месте для начала. Мы будем учиться использовать HuggingFace API и использовать его в качестве бота Discord. Мы также узнаем о Replit, Kaggle CLI и uptimerobot, чтобы ваш бот работал. Мы не будем углубляться в тонкую настройку нашей модели DailoGPT, чтобы вы могли ознакомиться с этим блогом.

Набор данных

мы будем использовать Kaggle CLI, чтобы загрузить Сценарии Рика и Морти | Kaggle, который находится в открытом доступе. Если вы хотите узнать, как получить свой Kaggle API и как использовать Kaggle CLI, пожалуйста, проверьте эту ссылку.

!kaggle datasets download andradaolteanu/rickmorty-scripts -f RickAndMortyScripts.csv

Как видите, у нас есть столбцы: индекс, номер сезона, номер эпизода, название эпизода, имя персонажа и линия. Мы сосредоточимся на столбце имени и строки.

Мы преобразуем этот набор данных, чтобы каждая строка ответа содержала n предыдущих ответов в качестве контекста.

CHARACTER_NAME = 'Rick'
contexted = []

# context window of size 7
n = 7

for i in data[data.name == CHARACTER_NAME].index:
  if i < n:
    continue
  row = []
  prev = i - 1 - n # we additionally substract 1, so row will contain current responce and 7 previous responces  
  for j in range(i, prev, -1):
    row.append(data.line[j])
  contexted.append(row)

columns = ['response', 'context'] 
columns = columns + ['context/' + str(i) for i in range(n - 1)]

df = pd.DataFrame.from_records(contexted, columns=columns)

Как вы можете видеть ниже, у нас есть столбцы ответа и 6 столбцов контекста. Это поможет нам точно настроить нашу генеративную модель. После этого мы загрузим модель из Hugging face и начнем обучать нашу модель. Вы можете проверить полный код здесь.

Разверните, чтобы обнять лицо

После точной настройки модели вы можете просто развернуть свою модель в облаке с обнимающим лицом, но перед этим вам необходимо создать учетную запись HF (Обнимающее лицо) и создать модель, как показано ниже.

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

  • Установите git-lfs: расширение git для загрузки больших файлов
  • Настройте электронную почту git и почту пользователя
  • Используйте свой ключ API HF и названную модель, чтобы загрузить и токенизатор, и модель.
!sudo apt-get install git-lfs
Reading package lists... Done
Building dependency tree       
Reading state information... Done
git-lfs is already the newest version (2.3.4-1).
The following package was automatically installed and is no longer required:
  libnvidia-common-460
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 40 not upgraded.
!git config --global user.email "[email protected]"
# Tip: using the same email as your huggingface.co account will link your commits to your profile
!git config --global user.name "kingabzpro"
MY_MODEL_NAME = 'DialoGPT-small-Rick-Bot'
with open('/content/HuggingFace_API.txt', 'rt') as f:
  HUGGINGFACE_API_KEY = f.read().strip()
model.push_to_hub(MY_MODEL_NAME, use_auth_token=HUGGINGFACE_API_KEY)
tokenizer.push_to_hub(MY_MODEL_NAME, use_auth_token=HUGGINGFACE_API_KEY)

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

Тестирование вашей модели

После развертывания давайте проверим его в скрипте Python с помощью трансформаторов.

  • загрузите и токенизатор, и модель с помощью трансформатора.
  • рабочий цикл на 4 входа
  • пользовательский ввод используется для генерации текста
tokenizer = AutoTokenizer.from_pretrained('kingabzpro/DialoGPT-small-Rick-Bot')
model = AutoModelWithLMHead.from_pretrained('kingabzpro/DialoGPT-small-Rick-Bot')
# Let's chat for 4 lines
for step in range(4):
    # encode the new user input, add the eos_token and return a tensor in Pytorch
    new_user_input_ids = tokenizer.encode(input(">> User:") + tokenizer.eos_token, return_tensors='pt')
    # print(new_user_input_ids)

    # append the new user input tokens to the chat history
    bot_input_ids = torch.cat([chat_history_ids, new_user_input_ids], dim=-1) if step > 0 else new_user_input_ids

    # generated a response while limiting the total chat history to 1000 tokens, 
    chat_history_ids = model.generate(
        bot_input_ids, max_length=200,
        pad_token_id=tokenizer.eos_token_id,  
        no_repeat_ngram_size=3,       
        do_sample=True, 
        top_k=100, 
        top_p=0.7,
        temperature=0.8
    )
    
    # pretty print last ouput tokens from bot
    print("RickBot: {}".format(tokenizer.decode(chat_history_ids[:, bot_input_ids.shape[-1]:][0], skip_special_tokens=True)))

Как видите, наша модель работает отлично. На каждый пользовательский ввод есть ответ Рика.

дискорд бот

Для того, чтобы создать бота Discord, сначала вам нужно попасть на портал Discord Developer Portal. Нажмите Новое приложение и начните.

Напишите название приложения.

Теперь нажмите на вкладку «Бот», а затем «Добавить бота». Это переместит вас в новое окно, в котором вам будет предложено написать имя бота и добавить изображение к боту.

Перейдите на вкладку OAuth2 и отметьте бот и разрешение бота: Отправить сообщение. Позже скопируйте ссылку и вставьте ее в новую вкладку.

После вставки ссылки в новой вкладке вам будет предложено выбрать сервер, и все.

Повторить

Вы можете создать свой аккаунт на https://replit.com/. Мы будем использовать эту платформу в качестве бот-сервера для нашего бота Discord. После создания учетной записи просто создайте новый репозиторий Python или импортируйте мой репозиторий GitHub. Эта платформа удобна для начинающих, и вам потребуется не более 5 минут, чтобы понять, как использовать редактор.

Тестирование API

Прежде чем нам нужно использовать секретную функцию повторения, чтобы добавить наш HF API и Discord API, как показано ниже. Ваш ключ API Discord находится на портале разработчика: вкладка «Бот».

  • создать тестовый файл Python для тестирования HF API
  • создайте функцию, которая использует requests для отправки и получения информации с использованием идентификатора модели и токена HF API.
  • Распечатать сгенерированный ответ.

Функция работает отлично, теперь нам нужно добавить эту функцию в bot.py.

import requests
def query(payload, model_id, api_token):
 headers = {"Authorization": f"Bearer {api_token}"}
 API_URL = f"https://api-inference.huggingface.co/models/{model_id}"
 response = requests.post(API_URL, headers=headers, json=payload)
 return response.json()

model_id = "kingabzpro/DialoGPT-small-Rick-Bot"
api_token = "api_XXXXXXXXXXXXXXXXXXXXXX" # get yours at hf.co/settings/token
data = query('What you think about mom', model_id, api_token)
print(data['generated_text'])

Время работы для повторения

Мы будем использовать https://uptimerobot.com, чтобы наш бот работал вечно. Как вы можете видеть ниже, мы можем добавить монитор и добавить URL-адрес, который мы будем создавать с помощью flask. Он пропингует наше бот-приложение через 5 минут, что заставит сервер Replit работать вечно.

Фласк веб-приложение

Код ниже представляет собой простое веб-приложение Flash, которое будет отображать Я жив во время работы. Веб-приложение сгенерирует ссылку в Replit, примерно такую: https://DailoGPT-RickBot.kingabzpro.repl.co. Вы собираетесь вставить эту ссылку в uptimerobot, который запустит это приложение через 5 минут.

from flask import Flask
from threading import Thread
app = Flask('')

@app.route('/')
def home():
 return "I am Alive"

def run():
 app.run(host='0.0.0.0',port=8080)
def keep_alive():
 t=Thread(target=run)
 t.start()

Код бота

Этот код содержит основу нашего бота Discord и интеграцию HF API и веб-приложения Flask.

  • Мы используем функцию keep_alive из файла web_app, который мы только что создали.
  • Использование клиента discord python.
  • Функция query отправляет и получает ответ от HF API, который защищен ключом API.
  • on_ready разогревает HF API, отправляя сообщение «Hello». Прогрев сервера занимает почти 20 секунд.
  • on_message проверяет, отправлено ли сообщение ботом или пользователем, затем принимает сообщение пользователя и отправляет его в HF API, а затем отображает ответ в чат-боте раздора. Добавлены дополнительные проверки ошибок или отсутствие ответа на подачу, чтобы мы могли легко отлаживать.

Чтобы узнать больше, вы можете посмотреть код ниже и прочитать комментарии.

import os
# these modules are for querying the Hugging Face model
import json
import requests
from web_app import keep_alive
# the Discord Python API
import discord
# this is my Hugging Face profile link
API_URL = ‘https://api-inference.huggingface.co/models/'
class MyClient(discord.Client):
 def __init__(self, model_name):
 super().__init__()
 self.api_endpoint = API_URL + model_name
 # retrieve the secret API token from the system environment
 huggingface_token = os.environ[‘HUGGINGFACE_TOKEN’]
 # format the header in our request to Hugging Face
 self.request_headers = {
 ‘Authorization’: ‘Bearer {}’.format(huggingface_token)
 }
def query(self, payload):
 “””
 make request to the Hugging Face model API
 “””
 data = json.dumps(payload)
 response = requests.post(
 self.api_endpoint,
 headers=self.request_headers,
 data=data)
 ret = json.loads(response.content.decode(‘utf-8’))
 return ret
async def on_ready(self):
 # print out information when the bot wakes up
 print(‘Logged in as’)
 print(self.user.name)
 print(self.user.id)
 print(‘ — — — ‘)
 # send a request to the model without caring about the response
 # just so that the model wakes up and starts loading
 self.query({‘inputs’: {‘text’: ‘Hello!’}})
async def on_message(self, message):
 “””
 this function is called whenever the bot sees a message in a channel
 “””
 # ignore the message if it comes from the bot itself
 if message.author.id == self.user.id:
  return
 # form query payload with the content of the message
 payload = message.content
 # while the bot is waiting on a response from the model
 # set the its status as typing for user-friendliness
 async with message.channel.typing():
 response = self.query(payload)
 bot_response = response[‘generated_text’]
 
 # we may get ill-formed response if the model hasn’t fully loaded
 # or has timed out
 if not bot_response:
  if ‘error’ in response:
   bot_response = ‘`Error: {}`’.format(response[‘error’])
  else:
   bot_response = ‘Hmm… something is not right.’
 # send the model’s response to the Discord channel
  await message.channel.send(bot_response)
def main():
 # DialoGPT
 client = MyClient(‘kingabzpro/DialoGPT-small-Rick-Bot’)
 keep_alive()
 client.run(os.environ[‘DISCORD_TOKEN’])
if __name__ == ‘__main__’:
 main()

Как видите, наш бот работает отлично.

Теперь давайте проверим наш дискорд-сервер. Как видите, RickBot в сети.

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

Вы также можете просто импортировать мой репозиторий на Replit и добавить свой HF API и ключ API Discord, чтобы начать работу через несколько минут.

Код

Вы можете найти код на GitHub и DAGsHub. Вы также можете посмотреть мою модель HuggingFace здесь.

Заключение

Мой опыт изучения видеоуроков и обучения собственного бота был потрясающим. Стало еще лучше, когда я начал играть с библиотекой и сервером Discord. В этом руководстве мы изучили Hugging Face API, Transformers, сервер Discord, робот безотказной работы, Kaggle API и платформу Replit. Мне не терпится увидеть, какого персонажа вы выбрали следующим, и поделиться со мной своим опытом.

Машинное обучение — это просто, усложняйте его, всегда ищите лайфхаки и советы по улучшению вашего рабочего пространства.

Ссылка

Об авторе

Абид Али Аван (@1abidaliawan) — сертифицированный специалист по анализу данных, который любит создавать модели машинного обучения. В настоящее время он занимается созданием контента и ведением технических блогов по технологиям машинного обучения и обработки данных. Абид имеет степень магистра в области управления технологиями и степень бакалавра в области телекоммуникаций. Его видение состоит в том, чтобы создать продукт искусственного интеллекта с использованием графовой нейронной сети для студентов, борющихся с психическими заболеваниями.

Первоначально опубликовано на https://www.analyticsvidhya.com 1 ноября 2021 г.