Очень легко создать чат-бота на сервере Discord благодаря таким замечательным моделям искусственного интеллекта, как GPT-3, GPT-J и GPT-NeoX. В этой статье мы покажем вам, как создать своего собственного разговорного бота на Node.js с помощью GPT-J и GPT-NeoX через NLP Cloud API.

Discord - это широко распространенная платформа для обмена сообщениями. Все чаще можно увидеть, как люди создают собственный сервер Discord для своего проекта, чтобы сообщество могло легко собираться вместе. Многие компании действительно создали свой собственный сервер Discord, чтобы способствовать развитию своего сообщества пользователей.
Discord может быть размещен на собственном сервере или использоваться через веб-приложение Discord. Преимущество Discord в том, что он имеет обширный API для взаимодействия с сервером, и очень легко создать чат-бота, который будет взаимодействовать с пользователями в Discord.
Многие люди создают чат-ботов в Discord, чтобы пользователи могли обсуждать с искусственным интеллектом множество вопросов. Интегрировать чат-бота в ваш сервер Discord очень просто. Давайте посмотрим, как это сделать!
За последние 2 года было выпущено несколько отличных моделей ИИ: GPT-3, GPT-J и GPT-NeoX. Эти модели очень впечатляют и особенно хороши в работе с разговорным ИИ (т.е. чат-ботами).
С помощью этих моделей можно отлично обсудить буквально все, и их довольно легко адаптировать к конкретной ситуации. Например, вы можете настроить чатбота на основе GPT на сочувствие, сарказм или даже на ответы на конкретные вопросы о вашей отрасли (медицинская, юридическая, маркетинговая и т.д.).
Единственная проблема заключается в том, что эти модели требуют больших вычислительных мощностей, поэтому мало кто может позволить себе развернуть их на собственном сервере. NLP Cloud предлагает GPT-J и GPT-NeoX через API, поэтому в следующем примере мы будем использовать эти модели через API NLP Cloud.
Предположим, что вы создали учетную запись на сайте Discord.com. Перейдите на портал разработчиков: здесь. Выберите "Новое приложение", назовите свое приложение и создайте его:

Теперь нажмите "Добавить бота" и получите токен бота.
Последний шаг: привяжите бота к вашему серверу Discord. Чтобы сделать это, сначала щелкните меню "OAuth2" и получите ID клиента:

Затем разрешите боту получить доступ к вашему серверу, посетив следующий URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (замените CLIENT_ID на ваш собственный ID клиента, полученный ранее).
На стороне Discord все в порядке. Теперь давайте получим токен API NLP Cloud!
Предположим, что вы создали учетную запись на NLP Cloud. Просто получите свой токен API на панели управления:

Затем подпишитесь на тарифный план с оплатой по факту, который даст вам доступ к моделям GPT-J и GPT-NeoX (первые 100 тыс. токенов бесплатны, что облегчит вам тестирование).

Теперь вы можете приступить к созданию своего бота на Node.js!
И Discord, и NLP Cloud имеют клиенты Node.js, поэтому разработка будет очень простой.
Вот первая версия:
const NLPCloudClient = require('nlpcloud');
const { Client, Intents } = require('discord.js');
// Load NLP Cloud token and Discord Bot token.
const nlpcloudToken = process.env.NLPCLOUD_TOKEN;
if (nlpcloudToken == null) {
console.error('No NLP Cloud token received');
process.exit();
}
const discordBotToken = process.env.DISCORD_BOT_TOKEN;
if (discordBotToken == null) {
console.error('No Discord bot token received');
process.exit();
}
// Initialize the NLP Cloud and Discord clients.
const nlpCloudClient = new NLPCloudClient('fast-gpt-j', nlpcloudToken, true)
const discordClient = new Client({intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});
let history = [];
discordClient.on("messageCreate", function(message) {
if (message.author.bot) return;
(async () => {
// Send request to NLP Cloud.
const response = await nlpCloudClient.chatbot(`${message.content}`, '', history);
// Send response to Discord bot.
message.reply(`${response.data['response']}`);
// Add the request and response to the chat history.
history.push({'input':`${message.content}`,'response':`${response.data['response']}`});
})();
});
Как вы можете видеть, сначала мы получаем токен Discord и NLP Cloud из переменных окружения. Поэтому сначала экспортируйте свои токены в 2 переменные окружения под названием "NLPCLOUD_TOKEN" и "DISCORD_BOT_TOKEN". Вы также можете просто вставить токен непосредственно в код во время тестирования, если хотите.
Мы используем модель Fast GPT-J от NLP Cloud - более быструю реализацию GPT-J, что интересно для чат-ботов, поскольку мы обычно хотим, чтобы время ответа было как можно меньше. Если вы хотите использовать GPT-NeoX 20B, просто используйте "gpt-neox-20b" вместо "fast-gpt-j".
Функция NLP Cloud "chatbot()" позволяет легко управлять чатботом на основе модели GPT, не утруждая себя сложными параметрами, подсказками, обучением в несколько выстрелов и т. д. Единственная хитрость заключается в том, что после каждого ответа чатбота мы должны сохранить ответ в памяти и добавить его в историю для следующих запросов. Если этого не сделать, чатбот никогда не вспомнит историю разговора!
Теперь наш чатбот работает. Просто запустите свой скрипт (например, с помощью "node my_script.js"), и вы увидите, что ваш чатбот находится в режиме онлайн на вашем сервере Discord. Вы можете начать общаться с ним по-настоящему!
Наш пример работает, но есть одно слабое место: Модели GPT не могут одновременно обрабатывать более 2048 лексем (2048 лексем более или менее равны 1700 словам). Поэтому в какой-то момент история вашего чатбота может стать слишком большой, и вам придется ее усечь! Вот как это можно сделать:
const NLPCloudClient = require('nlpcloud');
const { Client, Intents } = require('discord.js');
// Load NLP Cloud token and Discord Bot token.
const nlpcloudToken = process.env.NLPCLOUD_TOKEN;
if (nlpcloudToken == null) {
console.error('No NLP Cloud token received');
process.exit();
}
const discordBotToken = process.env.DISCORD_BOT_TOKEN;
if (discordBotToken == null) {
console.error('No Discord bot token received');
process.exit();
}
// Initialize the NLP Cloud and Discord clients.
const nlpCloudClient = new NLPCloudClient('fast-gpt-j', nlpcloudToken, true)
const discordClient = new Client({intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});
let history = [];
let charsCount = 0;
discordClient.on("messageCreate", function(message) {
if (message.author.bot) return;
(async () => {
charsCount += `${message.content}`.length;
// Send request to NLP Cloud.
const response = await nlpCloudClient.chatbot(`${message.content}`, '', history);
charsCount += `${response.data['response']}`.length;
// Send response to Discord bot.
message.reply(`${response.data['response']}`);
// Add the request and response to the chat history.
history.push({'input':`${message.content}`,'response':`${response.data['response']}`});
// If the chat history is bigger than 1500 tokens, we remove the oldest elements from
// the history. We consider that 1 token = 4 characters.
// The theoretical GPT context limit is 2048 tokens but we choose 1500 tokens instead
// in order to be safe since the tokens count is not perfectly accurate.
while (charsCount > 1500 * 4) {
charsCount -= history[0]['input'].length + history[0]['response'].length;
history.shift();
}
})();
});
discordClient.login(discordBotToken);
Как видите, мы просто следим за тем, чтобы история не была слишком большой, а когда она становится большой, мы удаляем самые старые элементы!
На практике это редко является проблемой, поскольку самые старые элементы в истории редко имеют отношение к разговору. Но если это так, вы также можете реализовать более продвинутую стратегию, которая заключается в выборочном сохранении и удалении некоторых элементов на основе их релевантности.
Создать продвинутый чатбот еще никогда не было так просто благодаря моделям Discord и GPT.
Основная проблема заключается в том, что эти современные модели ИИ все сложнее и сложнее использовать из-за их огромного размера, вот почему вместо этого может быть гораздо проще и гораздо экономичнее использовать API, например NLP Cloud.
Если вы хотите внедрить свой собственный чатбот, но не уверены, как это сделать, пожалуйста, свяжитесь с нами!
Julien Salinas
Технический директор NLP Cloud