Építs egy GPT-J/GPT-NeoX Discord Chatbotot az NLP Cloud segítségével

Nagyon könnyű chatbotot építeni egy Discord szerveren, köszönhetően a nagyszerű AI modelleknek, mint a GPT-3, GPT-J és GPT-NeoX. Ebben a cikkben megmutatjuk, hogyan kódolhatod saját társalgási botodat Node.js-ben a GPT-J és a GPT-NeoX használatával az NLP Cloud API-n keresztül.

Discord chatbot

Egy Discord chatbot?

A Discord egy széles körben elfogadott üzenetküldő platform. Egyre gyakoribb, hogy az emberek saját Discord-szervert hoznak létre a projektjükhöz, hogy a közösség könnyen össze tudjon jönni. Sok vállalat valóban létrehozta saját Discord-szerverét, hogy saját felhasználói közösségét ápolhassa.

A Discordot lehet saját tárhelyen vagy a Discord webes alkalmazáson keresztül használni. A Discord nagyszerű tulajdonsága, hogy kiterjedt API-val rendelkezik a szerverrel való interakcióhoz, és nagyon könnyű olyan chatbotot létrehozni, amely a Discordon keresztül interakcióba lép a felhasználókkal.

Sokan készítenek chatbotokat a Discordon, így a felhasználók sok mindenről beszélgethetnek egy mesterséges intelligenciával. Nagyon könnyű chatbotot integrálni a Discord szerverébe. Lássuk, hogyan kell ezt megtenni!

GPT-3, GPT-J és GPT-NeoX

Az elmúlt 2 évben számos nagyszerű AI-modell jelent meg: GPT-3, GPT-J és GPT-NeoX. Ezek a modellek nagyon lenyűgözőek, és különösen jól kezelik a társalgási AI-t (azaz a chatbotokat).

Ezekkel a modellekkel szó szerint bármiről nagyszerű vitát lehet folytatni, és a modelleket viszonylag könnyen hozzá lehet igazítani egy adott helyzethez. Például beállíthatja a GPT-alapú chatbotját úgy, hogy empatikus, szarkasztikus vagy akár a saját iparágával kapcsolatos konkrét kérdésekre (orvosi, jogi, marketing stb.) jó választ adjon.

Az egyetlen probléma az, hogy ezek a modellek nagy számítási teljesítményt igényelnek, így kevesen engedhetik meg maguknak, hogy saját szerverükön telepítsék őket. Az NLP Cloud API-n keresztül kínálja a GPT-J és a GPT-NeoX modelleket, ezért a következő példában ezeket a modelleket az NLP Cloud API-n keresztül fogjuk használni.

Discord és NLP Cloud API kulcsok beszerzése

Tegyük fel, hogy létrehoztál egy fiókot a Discord.com-on. Menj a fejlesztői portálra: itt. Válassza az "Új alkalmazás" lehetőséget, nevezze el az alkalmazást, és hozza létre:

New Discord Application

Most kattintson a "Bot hozzáadása" gombra, és kérje le a bot tokenjét.

Utolsó lépés: kösd össze a botodat a Discord szerverrel. Ehhez először kattints az "OAuth2" menüre, és keresd meg az ügyfél azonosítódat:

Discord OAuth2

Ezután engedélyezd a botodnak, hogy hozzáférjen a szerveredhez a következő URL-címre látogatva: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (a CLIENT_ID-t helyettesítsd a korábban megszerzett saját ügyfél-azonosítóddal).

Minden rendben van a Discord oldalán. Most kérjünk le egy NLP Cloud API tokent!

Tegyük fel, hogy létrehoztál egy fiókot az NLP Cloudon. Egyszerűen kérje le az API-tokenjét a műszerfalon:

NLP Cloud Account

Ezután iratkozzon fel a fizetős tervre, amely hozzáférést biztosít a GPT-J és GPT-NeoX modellekhez (az első 100 000 token ingyen van, ami megkönnyíti a teszteket).

NLP Cloud Pay-as-you-go Plan

Most már elkezdheted a Node.js botod kódolását!

A Node.js szerver kódolása

Mind a Discord, mind az NLP Cloud rendelkezik Node.js kliensekkel, így a fejlesztés nagyon egyszerű lesz.

Íme egy első változat:

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']}`});
        
    })();
    });

Mint látható, először a Discord és az NLP Cloud tokent kérjük le a környezeti változókból. Tehát először exportáld a tokeneket 2 környezeti változóba, amelyek neve "NLPCLOUD_TOKEN" és "DISCORD_BOT_TOKEN". Ha úgy tetszik, a tesztek során a kódba közvetlenül is beillesztheted a tokenedet.

Az NLP Cloud Fast GPT-J modelljét használjuk - a GPT-J gyorsabb implementációját -, ami érdekes a chatbotok számára, mivel általában azt szeretnénk, ha a válaszidő a lehető legrövidebb lenne. Ha a GPT-NeoX 20B-t szeretné használni, egyszerűen használja a "gpt-neox-20b" szót a "fast-gpt-j" helyett.

Az NLP Cloud "chatbot()" funkciója megkönnyíti a GPT-modellre épülő chatbotok kezelését anélkül, hogy bonyolult paraméterekkel, kérdezéssel, néhány lépéses tanulással stb. kellene bajlódnunk. Az egyetlen trükk az, hogy minden chatbot-válasz után a választ a memóriában kell tartanunk, és a következő kérésekhez hozzá kell adnunk az előzményekhez. Ha ezt nem tesszük meg, a chatbot soha nem fog emlékezni a beszélgetés előzményeire!

A chatbotunk már működik. Egyszerűen indítsd el a szkriptedet (például a "node my_script.js" paranccsal), és látnod kell, hogy a chatbotod online van a Discord szerveren. Elkezdhetsz beszélgetni vele a valóságban!

Előzmények automatikus törlése

A mi példánk működik, de van egy gyenge pontja: A GPT modellek nem tudnak egyszerre több mint 2048 tokent kezelni (2048 token nagyjából 1700 szónak felel meg). Tehát egy bizonyos ponton a chatbot előzményei túl nagyok lehetnek, és le kell majd csonkítani! Itt van, hogyan teheti ezt meg:

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);

Mint láthatod, egyszerűen csak arra ügyelünk, hogy a történelem ne legyen túl nagy, és ha az, akkor eltávolítjuk a legrégebbi elemeket!

A gyakorlatban ez ritkán jelent problémát, mert a történelem legrégebbi elemei ritkán relevánsak a beszélgetés szempontjából. De ha mégis azok, akkor egy fejlettebb stratégiát is megvalósíthat, amely szelektíven megtart és eltávolít egyes elemeket a relevanciájuk alapján.

Következtetés

A Discord és a GPT modelleknek köszönhetően soha nem volt még ilyen egyszerű egy fejlett chatbotot létrehozni.

A fő kihívás az, hogy ezeket a modern AI-modelleket egyre nehezebb használni a hatalmas méretük miatt, ezért sokkal egyszerűbb és sokkal költséghatékonyabb lehet egy olyan API-t használni, mint az NLP Cloud.

Ha szeretné megvalósítani saját chatbotját, de nem tudja, hogyan kell kezelni, forduljon hozzánk bizalommal!

Julien Salinas
CTO az NLP Cloud-nál