Crea un chatbot vocale per WhatsApp alimentato da ChatGPT

11 novembre 2024

Esegui un chatbot WhatsApp specifico per la tua attività che può comprendere testi, immagini e messaggi vocali, e rispondere agli utenti con messaggi di testo e vocali. Alimentato da GPT-4o, Node.js e l'API di Wassenger.

Seguendo questo tutorial, puoi avere un chatbot AI completamente funzionante, abilitato alla voce e simile a ChatGPT in esecuzione in pochi minuti sul tuo computer o su un server cloud. Il chatbot è progettato per funzionare come assistente virtuale di supporto clienti personalizzato per scopi aziendali specifici, comunicando con gli utenti tramite messaggi di testo e vocali su WhatsApp.

Il chatbot può comprendere testi, immagini e messaggi vocali in molte lingue e rispondere con messaggi di testo e vocali, addestrato come assistente virtuale di supporto clienti con istruzioni e conoscenze predefinite.

Puoi facilmente personalizzare, estendere e istruire il bot AI per adattarne il comportamento, il ruolo, lo scopo e i confini di conoscenza al tuo caso aziendale. Il bot AI è consapevole della conversazione basandosi sulla cronologia dei messaggi WhatsApp precedenti con l'utente, consentendo risposte più contestuali e accurate.

Inoltre, puoi facilmente ampliare le conoscenze specifiche del dominio sulla tua attività e sul cliente in tempo reale utilizzando funzioni tool, permettendo al bot AI di recuperare informazioni esterne da API remote, database o file, e fornire all'AI informazioni dettagliate, specifiche per l'utente o per il contesto.

👉 👉 Il codice per questo tutorial è disponibile su GitHub 💻

👉 👉 Tutorial video disponibile su YouTube

Contenuti

🤩 🤖 Wassenger è una soluzione completa per Team Chat e API di WhatsApp. Registrati per una prova gratuita di 7 giorni e inizia in pochi minuti!

Caratteristiche

Questo tutorial fornisce un'implementazione completa di un chatbot AI abilitato alla voce e alimentato da ChatGPT in Node.js che:

  • Fornisce un chatbot completo abilitato alla voce sul tuo numero WhatsApp collegato a Wassenger.
  • Elabora automaticamente tutti i messaggi in arrivo degli utenti (testo, immagine e voce) e risponde con testo e voce.
  • Comprende il linguaggio parlato in oltre 90 lingue diverse e risponde di conseguenza in base a istruzioni preaddestrate specifiche.
  • Permette agli utenti di richiedere di parlare con un umano, nel qual caso la chat verrà assegnata a un agente del team ed uscirà dal flusso del bot.
  • Il comportamento del chatbot AI può essere facilmente regolato nel file di configurazione (vedi config.js).

Come funziona

  • Avvia un servizio web che si connette automaticamente all'API di Wassenger e al tuo numero WhatsApp.
  • Crea un tunnel usando Ngrok per ricevere eventi Webhook sul tuo computer (oppure puoi usare un URL Webhook dedicato se esegui il bot su cloud).
  • Registra automaticamente l'endpoint webhook per ricevere i messaggi in arrivo.
  • Elabora i messaggi di testo, immagine e voce in arrivo da WhatsApp e risponde con messaggi vocali usando un modello GPT-4o (multimodale) preaddestrato con istruzioni aziendali specifiche.
  • Assegna automaticamente le chat agli agenti del team disponibili quando l'utente lo richiede o quando il chatbot non può aiutare.

Comportamento del bot

Il bot AI risponderà ai messaggi in entrata basandosi sui seguenti criteri:

  • La chat non è assegnata a nessun agente dentro Wassenger.
  • La chat non ha nessuna delle etichette in blacklist (vedi config.js).
  • Il numero dell'utente della chat non è stato inserito nella blacklist (vedi config.js).
  • La chat o il contatto non è stato archiviato o bloccato.
  • La chat non è un gruppo o un canale.
  • Se una chat viene rimosso dall'assegnazione a un agente, il bot la riprenderà e risponderà automaticamente ai nuovi messaggi in arrivo.

Requisiti

Struttura del progetto

Esplora i file sorgente su GitHub

|– bot.js -> The bot source code in a single file
|– config.js -> Configuration file to customize credentials and bot behavior
|– actions.js -> Functions to perform actions through the Wassenger API
|– server.js -> Initializes the web server to process webhook events
|– main.js -> Initializes the bot server and creates the webhook tunnel(when applicable)
|– speech.js -> Handles voice message transcription and synthesis
|– package.json -> Node.js package manifest required to install dependencies
|– node_modules -> Where the project dependencies will be installed, managed by npm

Installazione

Se hai Git installato, esegui il seguente comando dal Terminale:

git clone https://github.com/wassengerhq/whatsapp-chatgpt-bot.git

Se non hai git, scarica i file sorgente del progetto qui e decomprimili.

Configurazione

Apri il tuo terminale preferito e spostati nella cartella del progetto dove si trova `package.json`:

cd whatsapp-chatgpt-bot/

Da quella cartella, installa le dipendenze eseguendo:

npm install

Con il tuo editor di codice preferito, apri il file `config.js` e segui i passaggi seguenti:

Imposta la tua API Key di Wassenger

Inserisci la tua API key di Wassenger.

Puoi registrarti gratuitamente qui per ottenere la tua API key di Wassenger:

// Required.Specify the Wassenger API key to be used
const apiKey = process.env.API_KEY || 'ENTER API KEY HERE',

Imposta la tua API Key di OpenAI

Inserisci la tua OpenAI API key.

Registrati su OpenAI gratuitamente e poi ottieni la chiave API qui:

// Required.Specify the OpenAI API key to be used
const openaiKey = process.env.OPENAI_API_KEY || 'ENTER OPENAI API KEY HERE',

Imposta il tuo token Ngrok (opzionale)

Se devi eseguire il programma sul tuo computer locale, il programma deve creare un tunnel usando Ngrok per elaborare gli eventi webhook dei messaggi WhatsApp in arrivo.

Registrati su Ngrok per un account gratuito e poi ottieni il tuo auth token come spiegato qui.

Imposta il token in config.js:

// Ngrok tunnel authentication token.
// Required if webhook URL is not provided.
const ngrokToken = process.env.NGROK_TOKEN || 'ENTER NGROK TOKEN HERE',

Se esegui il programma su un server cloud pubblicamente accessibile da Internet, non è necessario usare Ngrok. Invece, imposta l'URL del tuo server in config.js > campo webhookUrl.

Abilita la funzionalità di input e output audio

In config.js, vai alla dichiarazione features alla riga 67 e imposta audioInput e audioOutput su true come mostrato di seguito:

// Chatbot features.Edit as needed.
const features = {
  // Enable or disable knowledge data loading for AI model training(pdfs, docs, csv, etc)
  knowledge: true,
  // Enable or disable text input processing
  audioInput: true,
  // Enable or disable audio voice responses.
  // By default the bot will only reply with an audio messages if the user sends an audio message first.
  audioOutput: true,
  // Reply only using audio voice messages instead of text.
  // Requires "features.audioOutput" to be true.
  audioOnly: false,
  // Audio voice to use for the bot responses.Requires "features.audioOutput" to be true.
  // Options: 'alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'
  // More info: https://platform.openai.com/docs/guides/text-to-speech
  voice: 'echo',
  // Audio voice speed from 0.25 to 2.Requires "features.audioOutput" to be true.
  voiceSpeed: 1,
  // Enable or disable image input processing
  // Note: image processing can significnantly increase the AI token processing costs compared to text
  imageInput: true
};

Abilita la modalità risposta solo audio

Se vuoi che il chatbot risponda esclusivamente usando messaggi audio, imposta audioOnly su true:

// Chatbot features.Edit as needed.
const features = {
  // Enable or disable knowledge data loading for AI model training(pdfs, docs, csv, etc)
  knowledge: true,
  // Enable or disable text input processing
  audioInput: true,
  // Enable or disable audio voice responses.
  // By default the bot will only reply with an audio messages if the user sends an audio message first.
  audioOutput: true,
  // Reply only using audio voice messages instead of text.
  // Requires "features.audioOutput" to be true.
  audioOnly: true,
  // Audio voice to use for the bot responses.Requires "features.audioOutput" to be true.
  // Options: 'alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'
  // More info: https://platform.openai.com/docs/guides/text-to-speech
  voice: 'echo',
  // Audio voice speed from 0.25 to 2.Requires "features.audioOutput" to be true.
  voiceSpeed: 1,
  // Enable or disable image input processing
  // Note: image processing can significnantly increase the AI token processing costs compared to text
  imageInput: true
};

Personalizzazione

Puoi personalizzare il comportamento del chatbot definendo un insieme di istruzioni in linguaggio naturale che l'AI seguirà.

Leggi i commenti nel codice per ulteriori istruzioni.

Inoltre, puoi facilmente adattare il codice per soddisfare requisiti più specifici. Le possibilità sono praticamente infinite!

Per procedere con la personalizzazione, apri config.js con il tuo editor preferito e imposta le istruzioni del bot, i messaggi di benvenuto e i messaggi predefiniti in base alle tue preferenze.

Chiamare dati esterni e API (RAG)

Con le chiamate a funzione, puoi facilmente fornire al modello AI informazioni contestuali, in tempo reale e specifiche per l'utente per generare risposte migliori e più accurate utilizzando tecniche di Retrieval-Augmented Generation (RAG). Dietro le quinte usa la funzionalità OpenAI Tool Function Calling.

Quando il modello AI richiede determinate informazioni per generare una risposta, indicherà di eseguire una o più funzioni per recuperare informazioni aggiuntive. Per esempio, in una funzione puoi interrogare un'API CRM esterna o un database per recuperare informazioni specifiche sul cliente con cui l'agente AI sta chattando, come indirizzo e-mail, username, indirizzo di spedizione, ecc., quindi fornire tali informazioni come testo o JSON al modello AI per una generazione di risposta più accurata e contestualizzata per l'utente.

Usare funzioni tool è molto flessibile e ti permette di costruire casi d'uso complessi e specifici per dominio per un agente AI.

Vedi il file [functions.js](https://github.com/wassengerhq/whatsapp-chatgpt-bot/blob/master/functions.js) per diversi esempi su come usare e definire funzioni tool per il caricamento remoto di dati per l'AI (RAG):

// Tool functions to be consumed by the AI when needed.
// Edit as needed to cover your business use cases.
// Using it you can instruct the AI to inform you to execute arbitrary functions
// in your code based in order to augment information for a specific user query.
// For example, you can call an external CRM in order to retrieve, save or validate
// specific information about the customer, such as email, phone number, user ID, etc.
// Learn more here: https://platform.openai.com/docs/guides/function-calling
const functions = [
  // Sample function to retrieve plan prices of the product
  // Edit as needed to cover your business use cases
  {
    name: 'getPlanPrices',
    description:
      'Get available plans and prices information available in Wassenger',
    parameters: { type: 'object', properties: {} },
    // Function implementation that will be executed when the AI requires to call this function
    // The function must return a string with the information to be sent back to the AI for the response generation
    // You can also return a JSON or a prompt message instructing the AI how to respond to a user
    // Functions may be synchronous or asynchronous.
    //
    // The bot will inject the following parameters:
    // - parameters: function parameters provided by the AI when the function has parameters defined
    // - response: AI generated response object, useful to evaluate the AI response and take actions
    // - data: webhook event context, useful to access the last user message, chat and contact information
    // - device: WhatsApp number device information provided the by Wassenger API
    // - messages: an list of previous messages in the same user chat
    run: async ({ parameters, response, data, device, messages }) => {
      // console.log('=> data:', response)
      // console.log('=> response:', response)
      const reply = [
        '*Send & Receive messages + API + Webhooks + Team Chat + Campaigns + CRM + Analytics*',
        '',
        '- Platform Professional: 30, 000 messages + unlimited inbound messages + 10 campaigns / month',
        '- Platform Business: 60, 000 messages + unlimited inbound messages + 20 campaigns / month',
        '- Platform Enterprise: unlimited messages + 30 campaigns',
        '',
        'Each plan is limited to one WhatsApp number.You can purchase multiple plans if you have multiple numbers.',
        '',
        '*Find more information about the different plan prices and features here:*',
        'https://wassenger.com/#pricing'
      ].join('\n');
      return reply;
    }
  },
  // Sample function to load user information from a CRM
  {
    name: 'loadUserInformation',
    description: 'Find user name and email from the CRM',
    parameters: {
      type: 'object',
      properties: {}
    },
    run: async ({ parameters, response, data, device, messages }) => {
      // You may call an remote API and run a database query
      const reply =
        'I am sorry, I am not able to access the CRM at the moment.Please try again later.';
      return reply;
    }
  }
];

Esegui il bot

Esegui il programma del bot:

node main

Esegui il programma del bot su una porta personalizzata:

PORT=80 node main

Esegui il programma del bot per un dispositivo collegato a Wassenger specifico:

DEVICE=WHATSAPP_DEVICE_ID node main

Esegui il programma del bot in modalità produzione:

NODE_ENV=production node main

Esegui il bot con un server webhook esistente senza il tunnel Ngrok:

WEBHOOK_URL=https://bot.company.com:8080/webhook node main

Nota: `https://bot.company.com:8080` deve puntare al programma del bot in esecuzione sul tuo server ed essere raggiungibile in rete tramite HTTPS per una connessione sicura.

Domande

Posso addestrare l'AI a comportarsi in modo personalizzato?

Sì! Puoi fornire istruzioni personalizzate all'AI per determinare il comportamento del bot, l'identità e altro.

Per impostare le tue istruzioni personalizzate, inserisci il testo in config.js > botInstructions.

Posso istruire l'AI a non rispondere a argomenti non pertinenti?

Sì! Definendo un insieme di istruzioni chiare ed esplicite, puoi insegnare all'AI a restare nel ruolo e a rifiutare educatamente di rispondere a argomenti non correlati al soggetto rilevante.

Ad esempio, puoi aggiungere quanto segue nelle tue istruzioni:

You are a smart virtual customer support assistant who works for Wassenger.
Be polite, gentle, helpful, and empathetic.
Politely reject any queries that are not related to your customer support role or Wassenger itself.
Strictly stick to your role as a customer support virtual assistant for Wassenger.Copia codice

Posso personalizzare la risposta e il comportamento del chatbot?

Certo! Il codice è disponibile gratuitamente e puoi adattarlo quanto vuoi.

Hai solo bisogno di qualche conoscenza di JavaScript/Node.js, e puoi sempre chiedere a ChatGPT di aiutarti a scrivere il codice di cui hai bisogno.

Come faccio a impedire al bot di rispondere a determinate chat?

Devi semplicemente assegnare le chat specifiche a un agente sulla web chat di Wassenger o usare l'API.

In alternativa, puoi impostare etichette in blacklist in config.js > campo skipChatWithLabels, quindi aggiungere una di queste etichette alla chat specifica che vuoi venga ignorata dal bot. Puoi assegnare etichette alle chat usando la web chat di Wassenger o tramite l'API.

Devo usare Ngrok?

No, non è necessario. Ngrok viene usato solo per scopi di sviluppo/test quando esegui il programma dal tuo computer locale. Se esegui il programma su un server cloud, molto probabilmente non avrai bisogno di Ngrok se il tuo server è raggiungibile via Internet tramite un dominio pubblico (es., bot.company.com) o un IP pubblico.

In tal caso, devi fornire l'URL completo del tuo server che termina con /webhook così quando esegui il programma del bot:

WEBHOOK_URL=https://bot.company.com:8080/webhook node main

Nota: https://bot.company.com:8080 deve puntare al programma del bot in esecuzione sul tuo server ed essere raggiungibile in rete tramite HTTPS per una connessione sicura.

Cosa succede se il programma fallisce?

Controlla l'errore nel terminale e assicurati di eseguire il programma con i permessi necessari per avviarlo sulla porta 8080 sul localhost.

Come evitare che chat specifiche vengano risposte dal bot?

Per impostazione predefinita, il bot ignorerà i messaggi inviati in chat di gruppo, contatti bloccati e chat/contatti archiviati.

Oltre a questo, puoi inserire numeri di telefono e chat specifiche in blacklist o whitelist e gestire le chat con etichette affinché siano gestite (o ignorate) dal bot.

Vedi le opzioni numbersBlacklist, numbersWhitelist e skipChatWithLabels in config.js per maggiori informazioni.

Posso eseguire questo bot sul mio server?

Assolutamente! Distribuisci o trasferisci il codice sorgente del programma sul tuo server ed esegui il comando di avvio da lì.

I requisiti sono gli stessi, indipendentemente da dove esegui il bot.

Ricorda inoltre di definire la variabile d'ambiente WEBHOOK_URL con l'URL pubblico accessibile via Internet del tuo server come spiegato in precedenza.

Programma affiliati

🤑 💰 Guadagna il 30% di commissione riferendo utenti a Wassenger. Ottieni subito il tuo link di referral. Si applicano termini e condizioni.

Ready to transform your WhatsApp communication?

Start automating your customer interactions today with Wassenger

Get Started Free