Имате проблеми с ИИ или разработката на пълен пакет? Нашите експерти са тук, за да ви напътстват: индивидуални съвети, техническа интеграция и др. Свържете се с [email protected].

Изграждане на GPT-J/GPT-NeoX Discord чатбот с NLP Cloud

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

Discord chatbot

Чатбот на Discord?

Discord е широко разпространена платформа за изпращане на съобщения. Все по-често хората създават свой собствен Discord сървър за своя проект, за да може общността лесно да се събира. Много компании всъщност са създали свой собствен Discord сървър, за да развиват собствена потребителска общност.

Discord може да се хоства самостоятелно или да се използва чрез уеб приложението Discord. Голямото предимство на Discord е, че има обширен API за взаимодействие със сървъра и е много лесно да се създаде чатбот, който да взаимодейства с потребителите в Discord.

Много хора създават чатботове в Discord, за да могат потребителите да обсъждат с изкуствен интелект много неща. Много е лесно да интегрирате чатбот в сървъра Discord. Нека видим как да го направим!

GPT-3, GPT-J и GPT-NeoX

През последните 2 години бяха пуснати няколко страхотни модела с изкуствен интелект: GPT-3, GPT-J и GPT-NeoX. Тези модели са много впечатляващи и са особено добри в работата с разговорни ИИ (т.е. чатботове).

С помощта на тези модели можете да проведете чудесна дискусия буквално за всичко и е доста лесно да адаптирате моделите към конкретна ситуация. Например можете да конфигурирате базирания си на GPT чатбот да бъде съпричастен, саркастичен или дори добър в отговарянето на специфични въпроси за собствената ви индустрия (медицинска, правна, маркетингова и т.н.).

Единственият проблем е, че тези модели изискват голяма изчислителна мощ, така че малко хора могат да си позволят да ги разположат на собствен сървър. NLP Cloud предлага GPT-J и GPT-NeoX чрез API, така че в следващия пример ще използваме тези модели чрез API на NLP Cloud.

Получаване на API ключове за Discord и NLP Cloud

Да предположим, че сте създали акаунт в Discord.com. Отидете в портала за разработчици: тук. Изберете "Ново приложение", дайте име на приложението си и го създайте:

New Discord Application

Сега щракнете върху "Добавяне на бот" и изтеглете токена на бота.

Последна стъпка: свържете своя бот със сървъра на Discord. За да направите това, първо кликнете върху менюто "OAuth2" и изтеглете клиентския си идентификатор:

Discord OAuth2

След това разрешете на бота да получи достъп до сървъра ви, като посети следния URL адрес: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (заменете CLIENT_ID със собствения си клиентски идентификатор, получен по-рано).

От страна на Discord всичко е наред. Сега нека извлечем API токъна на NLP Cloud!

Да предположим, че сте създали акаунт в NLP Cloud. Просто изтеглете API токена си от таблото за управление:

NLP Cloud Account

След това се абонирайте за плана за текущо плащане, който ще ви даде достъп до моделите GPT-J и GPT-NeoX (първите 100 хил. жетона са безплатни, което ще улесни тестовете ви).

NLP Cloud Pay-as-you-go Plan

Вече можете да започнете да програмирате своя Node.js бот!

Кодиране на сървъра 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