Crea un'interfaccia di conversazione per Android con Dialogflow

Cosa starai creando

L'ascesa dell'intelligenza artificiale sta innescando un cambio di paradigma nel campo dello sviluppo dell'interfaccia utente. Grazie alla proliferazione di assistenti intelligenti attivati ​​a voce come Google Home, Siri e Alexa, gli utenti cominciano a pensare che premere numerosi pulsanti su uno schermo o compilare manualmente i moduli non solo sia inefficiente e lento, ma anche vecchio stile.

Fortunatamente, oggi ci sono molti servizi basati su cloud che semplificano agli sviluppatori l'aggiunta di interfacce utente conversazionali alle loro app. Google Dialogflow Standard Edition è uno di questi servizi. È gratuito, molto potente, multilingue e viene fornito con un gran numero di modelli ben progettati.

In questo tutorial, ti mostrerò come creare una semplice interfaccia utente conversazionale basata su testo per Android utilizzando Dialogflow.

Prerequisiti

Prima di procedere, assicurati di avere accesso a:

  • l'ultima versione di Android Studio
  • un dispositivo o emulatore con Android 5.0 o versioni successive

1. Creazione di un agente

Durante l'utilizzo di Dialogflow, lavorerai sempre con un agente, un sistema di comprensione del linguaggio naturale addestrato a gestire un insieme specifico di input dell'utente.

Per creare il primo agente, utilizzare un account Google per accedere alla console Dialogflow e premere il tasto Crea agente pulsante.

Nel modulo che si apre, dare un nome ragionevole all'agente e premere il tasto Creare pulsante.

Dopo pochi secondi, avrai un nuovo agente.

2. Creazione di un intento

Mentre le interfacce visuali hanno pulsanti che gli utenti possono premere per esprimere le loro intenzioni, le interfacce conversazionali hanno intenti. In quanto tale, in un'interfaccia di conversazione ben progettata, tutto ciò che un utente può dire è mappato a un intento. Il lavoro di un agente è solo per determinare con precisione quale intento deve essere attivato quando un utente pronuncia o digita una frase o frase.

Per semplificare le cose, creiamo un solo intento per il nostro agente: un intento chiamato PESO, che consentirà agli utenti di convertire pesi in chilogrammi in sterline e viceversa.

Per creare l'intento, premere il tasto Crea l'intento pulsante nella console.

Nella schermata successiva, digita il nome dell'intenzione e premi il tasto Aggiungi frasi di allenamento pulsante. Ora sarai in grado di fornire più frasi che l'agente può utilizzare per allenarsi. Ad esempio, la frase "che cosa è 32 chilogrammi in sterline" sarebbe una buona frase di allenamento per il PESO intento.

Dopo aver digitato la frase e premuto il tasto accedere chiave, vedrai che Dialogflow indovina correttamente che la frase "32 chilogrammi" è variabile. Creerà inoltre automaticamente un parametro accessibile a livello di programmazione denominato unità di peso per esso e impostare il suo tipo a @ Sys.unit-peso.

Allo stesso modo, suppone che anche la parola "sterline" sia variabile e crea un parametro per essa chiamato unità di peso-nome, di chi è il tipo @-Peso-name sys.unit.

Ti suggerisco di digitare alcune frasi di allenamento più simili, assicurandoti sempre che il unità di peso e unità di peso-nome i parametri sono risolti ai valori corretti.

Quindi, premere il tasto Aggiungi risposte pulsante per digitare alcune risposte generiche. Capisci che questi saranno mostrati all'utente testualmente.

Quando sei soddisfatto delle frasi e delle risposte di allenamento che hai fornito, vai avanti e premi il pulsante Salvare pulsante per salvare l'intento e avviare il processo di allenamento, che di solito viene eseguito per meno di un minuto.

Come ho detto prima, una buona interfaccia di conversazione deve essere in grado di gestire tutto ciò che l'utente dice. Ciò significa che il nostro agente deve anche essere in grado di mappare i convenevoli e le frasi che non comprende a intenti validi. Poiché questo è un requisito molto comune, Dialogflow genera automaticamente tali intenti per noi, opportunamente denominati Default Welcome Intent e Default Fallback Intent. Mentre il secondo non ha bisogno di modifiche, il primo lo fa.

Il Default Welcome Intent non ha frasi di allenamento, quindi è necessario fornire alcuni. Inoltre, non lavoreremo con gli eventi in questo tutorial, quindi puoi rimuovere il benvenuto evento associato ad esso. 

premi il Salvare pulsante dopo aver apportato le modifiche.

3. Abilitazione di Small Talk

È improbabile che la maggior parte degli utenti si limiti a PESO intento che hai creato. Sebbene l'intento di fallback sia in grado di gestire tutte le query non valide, è sempre una buona idea addestrare l'agente in modo che possa impegnarsi in chiacchiere. Così facendo sembrerà più umano.

Nella console Dialogflow, l'aggiunta di funzionalità di conversazione ridotta all'agente è molto semplice. Tutto quello che devi fare è aprire il Chiacchiere scheda e premere il Abilitare pulsante.

A questo punto, l'agente sarà in grado di generare risposte predefinite per molte domande comuni. Opzionalmente, puoi personalizzare quelle risposte per dargli una personalità unica. Per ora, ti suggerisco di rispondere ad alcune domande nel Informazioni sull'agente sezione e premere il Salvare pulsante.

4. Ottenere un token di accesso

La tua app Android avrà bisogno di un token di accesso client durante la comunicazione con l'agente Dialogflow. Per ottenerlo, fai clic sull'icona dell'ingranaggio accanto al nome dell'agente e apri il pulsante Generale scheda. Scorrendo verso il basso Chiavi API sezione, sarai in grado di vedere il token. Annotalo per poterlo usare più tardi.

5. Aggiunta di dipendenze di progetto

Utilizzeremo la libreria di rete di Fuel mentre interagiamo con il servizio web di Dialogflow, quindi aggiungi quanto segue implementazione dipendenza nel App modulo di build.gradle file:

implementazione 'com.github.kittinunf.fuel: fuel-android: 1.12.1'

Dialogflow può gestire sia il testo che l'audio. In questo tutorial, tuttavia, lavoreremo solo con il testo. Di conseguenza, la nostra app avrà un'interfaccia utente simile a una chat. Quindi aggiungere la libreria ChatMessageView come un'altra dipendenza.

implementazione 'com.github.bassaer: chatmessageview: 1.10.0'

Infine, assicurati che la tua app possa connettersi a Internet richiedendo la seguente autorizzazione in AndroidManifest.xml file:

6. Definizione del layout

La libreria di ChatMessageView ChatView widget offre un'interfaccia utente di chat completa in grado sia di visualizzare messaggi di chat che di accettare input dell'utente. Usandolo nel nostro layout, possiamo risparmiare un sacco di tempo e fatica. Quindi posiziona il widget dentro a FrameLayout widget e aggiungilo al tuo file XML di layout.

   

Se hai Kotlin Android Extensions abilitato nel tuo progetto, un riferimento al widget sarà disponibile come proprietà di estensione all'interno della tua attività.

Ti suggerisco di eseguire la tua app ora per dare un'occhiata al layout appena creato.

7. Configurazione del combustibile

È possibile rendere il codice di rete molto più conciso configurando il client Fuel in modo specifico per utilizzare il servizio Web Dialogflow. Prima di farlo, tuttavia, aggiungi il token di accesso client che hai ottenuto in precedenza come costante in fase di compilazione per la tua attività.

oggetto companion private const val ACCESS_TOKEN = "1234567890abcdef"

Tutte le richieste HTTP effettuate sul servizio web Dialogflow devono avere un Autorizzazione intestazione basata sul token. Per evitare di creare manualmente l'intestazione ogni volta che si effettua una richiesta, utilizzare baseHeaders proprietà del FuelManager classe.

FuelManager.instance.baseHeaders = mapOf ("Autorizzazione" a "Portatore $ ACCESS_TOKEN")

Quindi, imposta il basePath proprietà del FuelManager classificare l'URL di base del servizio Web Dialogflow.

FuelManager.instance.basePath = "https://api.dialogflow.com/v1/"

Infine, tutte le richieste HTTP devono sempre avere i seguenti parametri di configurazione: a v parametro che specifica la versione del protocollo che si desidera utilizzare, a Lang parametro che specifica la lingua in cui si desidera inserire le risposte dell'agente e a sessionId parametro il cui valore può essere una stringa casuale.

Il seguente codice mostra come usare il baseParams proprietà per impostare tutti i parametri:

FuelManager.instance.baseParams = listOf ("v" a "20170712", // ultimo protocollo "sessionId" a UUID.randomUUID (), // ID casuale "lang" a "en" // lingua inglese)

8. Configurazione dell'interfaccia di chat

Il ChatView widget ha bisogno di due ChatUser oggetti: uno per l'utente e uno per l'agente. Questi oggetti sono pensati per la memorizzazione di dettagli come i nomi e le immagini del profilo che dovrebbero essere visualizzati insieme ai messaggi di chat. Inoltre, ciascuno ChatUser l'oggetto deve avere un ID univoco associato ad esso.

Il codice seguente mostra come creare gli oggetti:

val human = ChatUser (1, "You", BitmapFactory.decodeResource (risorse, R.drawable.ic_account_circle)) val agent = ChatUser (2, "Agent", BitmapFactory.decodeResource (risorse, R.drawable.ic_account_circle))

Si noti che il codice utilizza una risorsa interna denominata ic_account_circle come l'avatar per entrambi gli oggetti. Sentiti libero di usare qualsiasi altra risorsa drawable se vuoi.

9. Invio e ricezione di messaggi

Ogni volta che gli utenti premono il pulsante di invio di ChatView widget, è necessario creare Messaggio oggetti basati sul testo che hanno digitato. Per fare ciò, puoi usare il Message.Builder classe. Durante la creazione dell'oggetto, dovrai assicurarti che appartenga all'utente umano chiamando il setuser () metodo.

Una volta il Messaggio l'oggetto è pronto, puoi passarlo al inviare() metodo del ChatView widget per renderlo. Il seguente codice mostra come farlo all'interno di setOnClickSendButtonListener () metodo del ChatView widget di.

my_chat_view.setOnClickSendButtonListener (View.OnClickListener my_chat_view.send (Message.Builder () .setUser (human) .setText (my_chat_view.inputText) .build ()) // Altro codice qui)

Per inviare effettivamente il messaggio dell'utente al tuo agente, ora devi fare una richiesta HTTP GET al / interrogazione endpoint del servizio Web Dialogflow. Come input, si aspetta a domanda parametro, il cui valore può essere qualsiasi frase o frase digitata dall'utente.

Come risposta HTTP, otterrai un documento JSON di cui risultato / realizzazione / discorso valore contiene la risposta dell'agente.

Fuel.get ("/ query", listOf ("query" a my_chat_view.inputText)) .responseJson _, _, result -> val reply = result.get (). Obj () .getJSONObject ("result"). getJSONObject ("fulfillment") .getString ("speech") // Altro codice qui

Per rendere la risposta all'interno del ChatView widget, devi costruirne un'altra Messaggio oggetto. Questa volta, tuttavia, il suo proprietario deve essere l'agente. Inoltre, per rendere il messaggio sul lato destro, devi passare vero al suo Setright () metodo.

my_chat_view.send (Message.Builder () .setRight (true) .setUser (agent) .setText (reply) .build ())

Se esegui l'app ora, dovresti essere in grado di chattare con l'agente.

Se chiedi all'app di convertire un peso in chilogrammi in sterline, tuttavia, fornirà solo una risposta generica. Per essere in grado di eseguire effettivamente la conversione, è necessario innanzitutto determinare se il file PESO l'intento è stato attivato. Per fare ciò, è possibile controllare il valore di risultato / metadata / intentName chiave.

val intent: String? = result.get (). obj () .getJSONObject ("result") .optJSONObject ("metadata") .optString ("intentName") if (intent !! == "WEIGHT") // Altro codice qui

Una volta che sei sicuro che il PESO l'intento è stato attivato, è possibile determinare i valori di unità di peso-nome e unità di peso parametri, che saranno presenti all'interno del Risultato / parametri oggetto.

// Converti in quanto val unitWeightName = result.get (). Obj () .getJSONObject ("result") .getJSONObject ("parameters") .getString ("unit-weight-name") // Il peso che deve essere convertito val unitWeight = result.get (). obj () .getJSONObject ("result") .getJSONObject ("parameters") .getJSONObject ("unit weight") .getDouble ("amount")

Con i valori di cui sopra, basta matematica e un semplice se altro dichiarazione per eseguire la conversione. Per rendere il risultato, ne avrai bisogno di un altro Messaggio oggetto. Anche il suo proprietario deve essere l'agente.

// Esegue conversione val result = if (unitWeightName == "lb") unitWeight * 2.20462 else unitWeight / 2.20462 // Render risultato my_chat_view.send (Message.Builder () .setRight (true) .setUser (agent) .setText ("Quello è $ "%. 2f ".format (risultato) $ unitWeightName") .build ())

La nostra app è pronta. Dovresti essere in grado di eseguirlo ora per vedere che esegue correttamente tutte le conversioni.

Conclusione

Ora sai come creare un agente amichevole e utile utilizzando Google Dialogflow. In questo tutorial, hai anche imparato a creare un'interfaccia accattivante che le persone possono utilizzare durante la comunicazione con l'agente.

Per ulteriori informazioni su Dialogflow, fare riferimento alla relativa documentazione ufficiale.