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.
Prima di procedere, assicurati di avere accesso a:
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.
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.
È 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.
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.
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:
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.
È 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)
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.
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.
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.