Aveți probleme cu inteligența artificială sau cu dezvoltarea full-stack? Experții noștri sunt aici pentru a vă ghida: consiliere personalizată, integrare tehnică și multe altele. Contactați-ne la [email protected].

Construiți un chatbot GPT-J/GPT-NeoX Discord cu NLP Cloud

Este foarte ușor să construiești un chatbot pe un server Discord datorită unor modele de inteligență artificială excelente, cum ar fi GPT-3, GPT-J și GPT-NeoX. În acest articol, vă arătăm cum să vă codificați propriul robot de conversație în Node.js utilizând GPT-J și GPT-NeoX prin intermediul API NLP Cloud.

Discord chatbot

Un chatbot Discord?

Discord este o platformă de mesagerie adoptată pe scară largă. Este din ce în ce mai des întâlnit ca oamenii să își creeze propriul server Discord pentru proiectul lor, pentru ca o comunitate să se reunească cu ușurință. Multe companii și-au creat, de fapt, propriul server Discord pentru a-și promova propria comunitate de utilizatori.

Discord poate fi găzduit de sine stătător sau poate fi utilizat prin intermediul aplicației web Discord. Un lucru grozav la Discord este că are un API extins pentru a interacționa cu serverul și este foarte ușor să creați un chatbot care să interacționeze cu utilizatorii de pe Discord.

Mulți oameni creează roboți de chat pe Discord pentru ca utilizatorii să poată discuta cu un AI despre multe lucruri. Este foarte ușor să integrați un chatbot în serverul dumneavoastră Discord. Haideți să vedem cum să facem asta!

GPT-3, GPT-J și GPT-NeoX

În ultimii 2 ani, au fost lansate mai multe modele de inteligență artificială: GPT-3, GPT-J și GPT-NeoX. Aceste modele sunt foarte impresionante și sunt deosebit de bune în special în ceea ce privește AI conversațional (adică chatbots).

Cu ajutorul acestor modele se poate purta o discuție interesantă despre orice și este destul de ușor de adaptat modelele la o situație specifică. De exemplu, vă puteți configura chatbotul bazat pe GPT pentru a fi empatic, sarcastic sau chiar bun la a răspunde la întrebări specifice despre propria industrie (medicală, juridică, de marketing etc.).

Singura problemă este că aceste modele necesită multă putere de calcul, astfel încât puțini oameni își pot permite să le implementeze pe propriul server. NLP Cloud propune atât GPT-J, cât și GPT-NeoX prin intermediul unei API, astfel încât vom utiliza aceste modele prin intermediul API-ului NLP Cloud în următorul exemplu.

Obțineți cheile API Discord și NLP Cloud

Să presupunem că v-ați creat un cont pe Discord.com. Mergeți la portalul dezvoltatorilor: aici. Selectați "New Application" (Aplicație nouă), denumiți aplicația și creați-o:

New Discord Application

Acum faceți clic pe "Add a bot" (Adăugați un robot) și recuperați token-ul de robot.

Ultimul pas: conectați robotul la serverul dumneavoastră Discord. Pentru a face acest lucru, faceți mai întâi clic pe meniul "OAuth2" și preluați ID-ul de client:

Discord OAuth2

Apoi permiteți robotului dvs. să vă acceseze serverul vizitând următoarea adresă URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (înlocuiți CLIENT_ID cu propriul dvs. ID de client obținut mai devreme).

Totul este în regulă pe partea de Discord. Acum să recuperăm un token NLP Cloud API!

Să presupunem că v-ați creat un cont pe NLP Cloud. Pur și simplu recuperați token-ul API în tabloul de bord:

NLP Cloud Account

Apoi, abonați-vă la planul de plată care vă va oferi acces la modelele GPT-J și GPT-NeoX (primele 100.000 de jetoane sunt gratuite, ceea ce vă va facilita testele).

NLP Cloud Pay-as-you-go Plan

Acum puteți începe să vă codificați robotul Node.js!

Codarea serverului Node.js

Atât Discord, cât și NLP Cloud au clienți Node.js, astfel încât dezvoltarea va fi foarte ușoară.

Iată o primă versiune:

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

După cum puteți vedea, mai întâi recuperăm token-ul Discord și NLP Cloud din variabilele de mediu. Deci, mai întâi exportați token-urile în 2 variabile de mediu numite "NLPCLOUD_TOKEN" și "DISCORD_BOT_TOKEN". De asemenea, dacă preferați, puteți să copiați și să lipiți pur și simplu token-ul direct în cod în timpul testelor.

Folosim modelul Fast GPT-J de la NLP Cloud - o implementare mai rapidă a GPT-J - care este interesantă pentru chatbots, deoarece, de obicei, dorim ca timpul de răspuns să fie cât mai scurt posibil. Dacă doriți să folosiți GPT-NeoX 20B, utilizați pur și simplu "gpt-neox-20b" în loc de "fast-gpt-j".

Funcția "chatbot()" din NLP Cloud facilitează gestionarea unui chatbot bazat pe un model GPT fără a se deranja cu parametrii complecși, cu promptarea, cu învățarea în câteva rânduri etc. Singurul truc este că, după fiecare răspuns al chatbot-ului, trebuie să păstrăm răspunsul în memorie și să-l adăugăm la istoric pentru următoarele cereri. Dacă nu facem acest lucru, chatbotul nu-și va aminti niciodată istoricul conversației!

Chatbotul nostru funcționează acum. Pur și simplu lansați scriptul (cu "node my_script.js", de exemplu) și ar trebui să vedeți că chatbotul dvs. este online pe serverul Discord. Puteți începe să vorbiți cu el pe bune!

Tăierea automată a istoricului

Exemplul nostru funcționează, dar există un punct slab: Modelele GPT nu pot gestiona mai mult de 2048 de simboluri în același timp (2048 de simboluri sunt mai mult sau mai puțin egale cu 1700 de cuvinte). Deci, la un moment dat, istoricul chatbotului dvs. ar putea deveni prea mare și va trebui să îl trunchiați! Iată cum ați putea face acest lucru:

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

După cum vedeți, ne asigurăm pur și simplu că istoricul nu este prea mare, iar atunci când este, eliminăm cele mai vechi elemente!

În practică, acest lucru este rareori o problemă, deoarece cele mai vechi elemente din istorie sunt rareori relevante pentru conversație. Dar dacă sunt, puteți implementa o strategie mai avansată care să păstreze și să elimine selectiv unele elemente în funcție de relevanța lor.

Concluzie

Construirea unui chatbot avansat nu a fost niciodată atât de ușoară datorită modelelor Discord și GPT.

Principala provocare este că aceste modele moderne de inteligență artificială sunt din ce în ce mai greu de utilizat din cauza dimensiunii lor uriașe, motiv pentru care poate fi mult mai simplu și mult mai rentabil să folosiți în schimb un API precum NLP Cloud.

Dacă doriți să vă implementați propriul chatbot, dar nu sunteți sigur cum să vă descurcați, nu ezitați să ne contactați!

Julien Salinas
CTO la NLP Cloud