Створити чат-бота на сервері 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" і отримайте свій ідентифікатор клієнта:

Потім дозвольте боту отримати доступ до вашого сервера, перейшовши за наступною адресою: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (замініть CLIENT_ID на ваш власний ідентифікатор клієнта, отриманий раніше).
На стороні Discord все в порядку. Тепер давайте отримаємо токен NLP Cloud API!
Припустимо, ви створили обліковий запис на 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, не обтяжуючи себе складними параметрами, підказками, навчанням з кількох спроб тощо (див. нижче інший приклад з використанням функції generation() замість функції chatbot()). Єдина хитрість полягає в тому, що після кожної відповіді чат-бота ми повинні зберігати відповідь в пам'яті і додавати її в історію для наступних запитів. Якщо цього не зробити, то чат-бот ніколи не запам'ятає історію розмови!
Наш чат-бот запрацював. Просто запустіть свій скрипт (наприклад, за допомогою "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);
Як бачите, ми просто стежимо за тим, щоб історія не була занадто великою, а коли вона стає такою, ми видаляємо найстаріші елементи!
На практиці це рідко є проблемою, оскільки найстаріші елементи історії рідко мають відношення до розмови. Але якщо це так, ви також можете застосувати більш просунуту стратегію, яка полягає у вибірковому збереженні та видаленні деяких елементів, виходячи з їхньої релевантності.
У наведеному вище прикладі використовувалася функція chatbot(), яка є обгорткою для функції generation(). Функція generation() трохи складніша у використанні, але вона дає вам більше контролю над вашим чат-ботом. Ось приклад:
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 = `Input: Hey, how are you today?
Response: Very well thank you, what about you?
###
Input: I am great.
Response: What are you going to do?
###
Input: Most likely read a couple of book and relax.
Response: Fantastic!`;
discordClient.on("messageCreate", function(message) {
if (message.author.bot) return;
(async () => {
if (history != '') {
history += '\n###\n'
}
let finalContent = history+'Input: '+`${message.content}`+'\nResponse:';
// Send request to NLP Cloud.
const response = await nlpCloudClient.generation(finalContent,0,200,true,'###',true,true)
// Remove end_sequence from response.
let cleanedResponse = response.data['generated_text'].replace('###','').trim();
// Send response to Discord bot.
message.reply(cleanedResponse);
// Add the request and response to the chat history.
history = finalContent+cleanedResponse;
// 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.
if (history.length > 1500 * 4) {
history = history.slice(charsCount-(1500 * 4));
}
})();
});
discordClient.login(discordBotToken);
Ви помітили, що нам потрібно вручну ініціалізувати обговорення в чаті якоюсь балаканиною. Ідея тут полягає в тому, щоб показати моделі генерації тексту, що ми хочемо бути в розмовному режимі. Ця балаканина несуттєва і має бути максимально нейтральною, щоб не впливати на решту розмови.
Також зверніть увагу, що ми змушуємо модель додавати "###" в кінці кожної згенерованої відповіді. Таким чином, ми можемо легко зупинити генерацію тексту при зустрічі цих символів.
Ще раз наголошуємо, що цей приклад призначений лише для розширеного використання!
Створити просунутого чат-бота ще ніколи не було так просто завдяки моделям Discord та GPT.
Основна проблема полягає в тому, що ці сучасні моделі ШІ все важче і важче використовувати через їх величезний розмір, тому може бути набагато простіше і набагато економічно ефективніше використовувати API, такі як NLP Cloud.
Якщо ви бажаєте впровадити власного чат-бота, але не знаєте, як це зробити, звертайтеся до нас!
Julien Salinas
CTO в NLP Cloud