Suggerimenti per la creazione della conversazione

Ottieni suggerimenti su come affrontare le attività comuni.

Aggiunta di nodi

  • Aggiungi un nome nodo che descrive lo scopo del nodo.

    Oggi sai quali operazioni vengono svolte dal tuo nodo, ma tra alcuni mesi potresti non ricordarlo. E il nome nodo viene visualizzato nel log, ciò può esserti utile per eseguire il debug di una conversazione in un secondo momento.

  • Per raccogliere le informazioni richieste per completare un'attività, utilizzare un nodo con slot invece di un gruppo di nodi separati per ottenere informazioni dagli utenti. Vedi Raccolta di informazioni con gli slot.

  • Per un flusso di processo complesso, informare gli utenti di tutte le informazioni che devono fornire all'inizio del processo.

  • Comprendi in che modo il tuo assistente passa attraverso la struttura ad albero di dialogo e l'impatto che cartelle, rami, passaggi e digressioni hanno sulla rotta. Vedi Flusso di dialogo.

  • Non aggiungere passaggi ovunque. Aumentano la complessità del flusso di dialogo e rendono più difficile eseguire il debug del dialogo in un secondo momento.

  • Per passare a un nodo nello stesso ramo del nodo corrente, utilizza Ignora input utente invece di Passa a.

    Questa scelta impedisce di dover modificare le impostazioni del nodo corrente quando si rimuovono o si riordinano i nodi figlio a cui si è passati. Vedi Definizione delle operazioni successive.

  • Prima di consentire la generazione di digressioni da un nodo, verifica gli scenari utente più comuni. E assicurati che presumibilmente i nodi da cui generare la digressione siano configurati per il ritorno. Vedi Digressioni.

Aggiunta di risposte

  • Utilizza risposte brevi e utili.

  • Nella risposta, rifletti l'intento dell'utente.

    In questo modo si assicura agli utenti che il bot li capisca o, in caso contrario, si offre loro la possibilità di correggere immediatamente un malinteso.

  • Includere i link ai siti esterni nelle risposte se la risposta dipende dai dati che cambiano frequentemente.

  • Evita di utilizzare eccessivamente i pulsanti. Incoraggiare gli utenti a scegliere le opzioni predefinite da una serie di pulsanti rende meno reale la conversazione e riduce la tua capacità di capire cosa vogliono veramente fare gli utenti. Quando consenti agli utenti di porre domande con parole loro, puoi utilizzare l'input per addestrare il sistema e ricavare intenti migliori.

  • Evitare di utilizzare un gruppo di nodi quando un nodo è sufficiente. Ad esempio, aggiungi più risposte condizionali a un singolo nodo per restituire risposte diverse a seconda dei dettagli forniti dall'utente. Vedi Risposte condizionali.

  • Formula attentamente le tue risposte. Puoi cambiare il modo in cui una persona reagisce al tuo sistema semplicemente in base a come formuli una risposta. La modifica di una riga del testo può evitarti di dover scrivere più righe di codice per implementare una soluzione programmatica complessa.

Suggerimenti per l'acquisizione delle informazioni dall'input utente

Può essere difficile sapere quale sintassi utilizzare nel tuo nodo di dialogo per acquisire con precisione le informazioni che desideri trovare nell'input utente. Ecco alcuni approcci che è possibile utilizzare per raggiungere obiettivi comuni.

  • Restituzione dell'input dell'utente: puoi acquisire il testo esatto espresso dall'utente e restituirlo nella tua risposta. Utilizza la seguente espressione SpEL in una risposta per ripetere il testo che l'utente ha specificato nella risposta:

    You said: <? input.text ?>.

    Se la correzione automatica è attiva e si desidera restituire l'input originale dell'utente prima che sia corretto, è possibile utilizzare <? input.original_text ?>. Tuttavia, assicurati di utilizzare una condizione di risposta che controlli innanzitutto se il campo original_text esiste.

  • Determinazione del numero di parole nell'input utente: puoi eseguire uno qualsiasi dei metodi Stringa supportati sull'oggetto input.text. Ad esempio, puoi scoprire quante parole ci sono in un'espressione utente utilizzando la seguente espressione SpEL:

    input.text.split(' ').size()

  • Gestione di più intenti: un utente immette un input che esprime due attività separate. I want to open a savings account and apply for a credit card. In che modo il dialogo riconosce e fa fronte a entrambe? Consultare la voce del blog Domande composte.

  • Gestione degli intenti ambigui: un utente immette un input sufficientemente ambiguo da consentire al tuo assistente di trovare due o più nodi con intenti che potrebbero potenzialmente indirizzarlo. In che modo il dialogo stabilisce quale ramo di dialogo seguire? Se abiliti la disambiguazione, questa può mostrare agli utenti le loro opzioni e chiedere loro di selezionare quella corretta. Per ulteriori dettagli, vedi Disambiguazione.

  • Gestione di più entità nell'input: se vuoi valutare solo il valore della prima istanza rilevata di un tipo di entità, puoi utilizzare la sintassi @entity == 'specific-value' invece del formato @entity:(specific-value).

    Ad esempio, quando utilizzi @appliance == 'air conditioner', valuti solo il valore della prima entità @appliance rilevata. Ma, l'utilizzo di @appliance:(air conditioner) viene esteso in entity['appliance'].contains('air conditioner'), che corrisponde ogni volta che viene rilevata almeno un'entità @appliance di valore 'air conditioner' nell'input utente.

  • Come nascondere i dati dal log: è possibile evitare che le informazioni vengano memorizzate nei log memorizzando i dati in una variabile di contesto e nidificando la variabile di contesto nella sezione $private del contesto del messaggio. Ad esempio, $private.my_info. La memorizzazione dei dati nell'oggetto privato le nasconde solo dai log. Le informazioni vengono ancora memorizzate nell'oggetto JSON sottostante. Non consentire che queste informazioni vengano esposte all'applicazione client.

  • Controllo delle informazioni personali: se vuoi controllare e impedire a un utente di inoltrare informazioni identificabili personalmente (PII) a un processo successivo, puoi aggiungere un nodo di dialogo che condiziona un'entità modello. Posiziona il nodo all'inizio della struttura ad albero di dialogo per garantire che verifichi prima l'input. Ad esempio, l'entità potrebbe controllare i modelli di numero di previdenza sociale degli Stati Uniti o i modelli di indirizzo email. Può quindi rispondere con qualcosa di simile, Please do not submit personally identifiable information. Can you reenter your request? Puoi facoltativamente reimpostare il contesto per garantire che le informazioni inoltrate dall'utente con PII non vengano conservate.

Suggerimenti sull'utilizzo delle condizioni

  • Controllo dei valori con caratteri speciali: se desideri controllare se un'entità o una variabile di contesto contiene un valore e se il valore include un carattere speciale, ad esempio un apostrofo ('), devi racchiudere tra parentesi il valore che desideri controllare. Ad esempio, per controllare se un'entità o una variabile di contesto contiene il nome O'Reilly, devi racchiudere il nome tra parentesi.

    @person:(O'Reilly) e $person:(O'Reilly)

    Il tuo assistente converte questi riferimenti abbreviati in queste espressioni SpEL complete:

    entities['person']?.contains('O''Reilly') e context['person'] == 'O''Reilly'

    SpEL utilizza un secondo apostrofo per eseguire l'escape del singolo apostrofo nel nome.

  • Controllo di più valori: se desideri controllare più di un valore, puoi creare una condizione che utilizza gli operatori OR (||) per elencare più valori nella condizione. Ad esempio, per definire una condizione che viene valutata come true se la variabile di contesto $state contiene le abbreviazioni per Massachusetts, Maine o New Hampshire, puoi utilizzare questa espressione:

    $state:MA || $state:ME || $state:NH

  • Controllo dei valori numerici: quando si confrontano i numeri, assicurarsi innanzitutto che l'entità o la variabile che si sta controllando abbia un valore. Se l'entità o la variabile non ha un valore numerico, viene trattata come se avesse un valore null (0) in un confronto di numeri.

    Ad esempio, si desidera verificare se un valore in dollari incluso nell'input utente è inferiore a 100. Se si utilizza la condizione @price < 100 e l'entità @price è null, la condizione viene valutata come true perché 0 è inferiore a 100, anche se il prezzo non è stato mai impostato. Per impedire questo tipo di risultato non accurato, utilizzare una condizione come @price AND @price < 100. Se @price non ha alcun valore, questa condizione restituirà correttamente false.

  • Controllo degli intenti con uno specifico modello di nome intento: puoi utilizzare una condizione che ricerca gli intenti che corrispondono ad un modello. Ad esempio, per trovare tutti gli intenti rilevati con nomi intento che iniziano con 'User_', nella condizione puoi utilizzare una sintassi come quella riportata di seguito:

    intents[0].intent.startsWith("User_")

    Tuttavia, quando esegui questa operazione, vengono considerati tutti gli intenti rilevati, anche quelli con una affidabilità inferiore a 0,2. Inoltre, controlla che gli intenti considerati irrilevanti in base al relativo punteggio di affidabilità non vengano restituiti. Affinché questo avvenga, modifica la condizione come segue:

    !irrelevant && intents[0].intent.startsWith("User_")

  • Come la corrispondenza fuzzy influisce sul riconoscimento dell'entità: se si utilizza un'entità come condizione e la corrispondenza fuzzy è abilitata, @entity_name restituisce true solo se la confidenza della corrispondenza è maggiore del 30%. Vale a dire, solo se @entity_name.confidence > .3.

Memorizzazione e riconoscimento dei gruppi di entità modello nell'input

Per memorizzare il valore di una entità modello in una variabile di contesto, aggiungere .literal al nome entità. L'utilizzo di questa sintassi assicura che nella variabile venga memorizzata l'esatta parte di testo dell'input utente corrispondente al modello specificato.

Aggiungi .literal
Variabile Valore
email <? @email.literal ?>

Per memorizzare il testo da un singolo gruppo in un'entità modello con gruppi definiti, specifica il numero di array del gruppo che desideri memorizzare. Ad esempio, presupponi che il modello di entità sia definito come segue per l'entità @phone_number. (Ricorda, le parentesi indicano i gruppi di modelli):

\b((958)|(555))-(\d{3})-(\d{4})\b

Per memorizzare solo il prefisso dal numero di telefono specificato nell'input utente, puoi utilizzare la seguente sintassi:

Solo prefisso
Variabile Valore
area_code <? @phone_number.groups[1] ?>

I gruppi sono delimitati dall'espressione regolare utilizzata per definire il modello di gruppo. Ad esempio, se l'input utente che corrisponde al pattern definito nell'entità @phone_number è: 958-234-3456, vengono creati i seguenti gruppi:

Dettagli gruppo
Numero gruppo Valore motore Regex Valore dialogo Spiegazione
gruppi[0] 958-234-3456 958-234-3456 Il primo gruppo è sempre una stringa di corrispondenza completa.
gruppi[1] ((958)l(555)) 958 La stringa che corrisponde a regex per il primo gruppo definito, che è ((958)l(555)).
gruppi[2] (958) 958 La corrispondenza nel gruppo incluso come primo operando nell'espressione OR ((958)l(555))
gruppi[3] (555) null Nessuna corrispondenza nel gruppo incluso come secondo operando nell'espressione OR ((958)l(555))
gruppi[4] (\d{3}) 234 La stringa che corrisponde all'espressione regolare definita per il gruppo.
gruppi[5] (\d{4}) 3456 La stringa che corrisponde all'espressione regolare definita per il gruppo.

Per aiutarti nel decifrare quale numero di gruppo utilizzare per acquisire la sezione dell'input a cui sei interessato, puoi estrarre contemporaneamente le informazioni relative a tutti i gruppi. Utilizza la seguente sintassi per creare una variabile di contesto che restituisca un array di tutte le corrispondenze di entità modello raggruppate:

Array di gruppi corrispondenti
Variabile Valore
array_of_matched_groups <? @phone_number.groups ?>

Utilizza il riquadro "Try it out" per immettere alcuni valori di numero di telefono di test. Per l'input 958-123-2345, questa espressione imposta $array_of_matched_groups su ["958-123-2345","958","958",null,"123","2345"].

Puoi quindi conteggiare ciascun valore nell'array partendo da 0 per acquisire il numero di gruppo relativo ad esso.

Elementi dell'array
Valore elemento array Numero elemento array
"958-123-2345" 0
"958" 1
"958" 2
null 3
"123" 4
"2345" 5

Dal risultato, è possibile determinare che per catturare le ultime quattro cifre del numero di telefono, è necessario, ad esempio, il gruppo #5.

Per ritornare alla struttura JSONArray creata per rappresentare l'entità di modello raggruppata, utilizza la seguente sintassi:

JSON di gruppi corrispondenti
Variabile Valore
json_matched_groups <? @phone_number.groups_json ?>

Questa espressione imposta $json_matched_groups sul seguente array JSON:

[
  {"group": "group_0","location": [0, 12]},
  {"group": "group_1","location": [0, 3]},
  {"group": "group_2","location": [0, 3]},
  {"group": "group_3"},
  {"group": "group_4","location": [4, 7]},
  {"group": "group_5","location": [8, 12]}
]

location è una proprietà di un'entità che utilizza un offset di caratteri in base zero per indicare dove inizia e termina il valore di entità rilevato nel testo di input.

Se prevedi che nell'input verranno forniti due numeri di telefono, puoi controllare due numeri di telefono. Se presenti, utilizza la seguente sintassi per acquisire, ad esempio, il prefisso del secondo numero.

JSON di gruppi corrispondenti
Variabile Valore
second_areacode <? entities['phone_number'][1].groups[1] ?>

Se l'input è I want to change my phone number from 958-234-3456 to 555-456-5678, $second_areacode sarà uguale a 555.