Procedure consigliate per la comprensione del linguaggio di conversazione

Usare le linee guida seguenti per creare i migliori progetti possibili nella comprensione del linguaggio di conversazione.

Scegliere uno schema coerente

Lo schema è la definizione delle finalità e delle entità. Esistono diversi approcci che è possibile adottare quando si definiscono gli elementi da creare come finalità rispetto a un'entità. Ci sono alcune domande che è necessario porsi:

  • Quali azioni o query si sta tentando di acquisire dall'utente?
  • Quali informazioni sono rilevanti in ogni azione?

In genere è possibile considerare le azioni e le query come finalità, mentre le informazioni necessarie per soddisfare tali query come entità.

Si supponga, ad esempio, di voler annullare le sottoscrizioni per vari prodotti offerti tramite il chatbot. È possibile creare una finalità Cancel con vari esempi, ad esempio "Annullare il servizio Contoso" o "interrompere l'addebito per la sottoscrizione di Fabrikam". L'intento dell'utente è annullare, il servizio Contoso o la sottoscrizione di Fabrikam sono le sottoscrizioni che vogliono annullare. È quindi possibile creare un'entità per le sottoscrizioni. È quindi possibile modellare l'intero progetto per acquisire le azioni come finalità e usare le entità per compilare tali azioni. In questo modo è possibile annullare qualsiasi elemento definito come entità, ad esempio altri prodotti. È quindi possibile avere finalità di iscrizione, rinnovo, aggiornamento e così via, che tutti usano le sottoscrizioni e altre entità.

La progettazione dello schema precedente semplifica l'estensione delle funzionalità esistenti (annullamento, aggiornamento, iscrizione) a nuove destinazioni creando una nuova entità.

Un altro approccio consiste nel modellare le informazioni come finalità e azioni come entità. Si esaminerà lo stesso esempio, consentendo ai clienti di annullare le sottoscrizioni tramite il chatbot. È possibile creare una finalità per ogni sottoscrizione disponibile, ad esempio Contoso con espressioni come "annullare Contoso", "interrompere l'addebito per i servizi contoso", "Annullare la sottoscrizione contoso". Si creerebbe quindi un'entità per acquisire l'azione, annullare. È possibile definire entità diverse per ogni azione o consolidare le azioni come un'entità con un componente elenco per distinguere le azioni con chiavi diverse.

Questa progettazione dello schema semplifica l'estensione di nuove azioni alle destinazioni esistenti aggiungendo nuove entità di azione o componenti di entità.

Assicurarsi di evitare di tentare di incanalare tutti i concetti in finalità semplici, ad esempio non provare a creare una finalità Annulla Contoso che ha solo lo scopo di un'azione specifica. Le finalità e le entità devono collaborare per acquisire tutte le informazioni necessarie dal cliente.

Si vuole anche evitare di combinare schemi diversi. Non compilare metà dell'applicazione con azioni come finalità e l'altra metà con informazioni come finalità. Assicurarsi che sia coerente per ottenere i risultati possibili.

Bilanciare i dati di training

È consigliabile provare a mantenere lo schema ben bilanciato quando si tratta di dati di training. L'inclusione di grandi quantità di una finalità e pochissime di altre comportano un modello fortemente distorto verso finalità particolari.

Per risolvere questo problema, potrebbe essere necessario eseguire il downsample del set di training o aggiungerlo. Il downcampion può essere eseguito in uno dei due casi:

  • Sbarazzarsi di una determinata percentuale dei dati di training in modo casuale.
  • In modo più sistematico analizzando il set di dati e rimuovendo voci duplicate sovrarappresentata.

È anche possibile aggiungere al set di training selezionando Suggerisci espressioni nella scheda Etichettatura dati in Language Studio. Conversational Language Understanding invierà una chiamata ad Azure OpenAI per generare espressioni simili.

Screenshot che mostra il suggerimento per l'espressione in Language Studio.

È anche consigliabile cercare "modelli" imprevisti nel set di training. Ad esempio, se il set di training per una determinata finalità è tutto minuscolo o inizia con una frase specifica. In questi casi, il modello di cui si esegue il training potrebbe apprendere questi pregiudizi imprevisti nel set di training anziché essere in grado di generalizzare.

È consigliabile introdurre la diversità di maiuscole e minuscole e punteggiatura nel set di training. Se si prevede che il modello gestisca le variazioni, assicurarsi di avere un set di training che rifletta anche tale diversità. Ad esempio, includere alcune espressioni con maiuscole e minuscole e alcune in lettere minuscole.

Etichettare chiaramente le espressioni

  • Assicurarsi che i concetti a cui fanno riferimento le entità siano ben definiti e separabili. Controllare se è possibile determinare facilmente le differenze in modo affidabile. In caso contrario, questo potrebbe indicare che anche il componente appreso avrà difficoltà.

  • Se esiste una somiglianza tra le entità, assicurarsi che vi siano alcuni aspetti dei dati che forniscono un segnale per la differenza tra di essi.

    Ad esempio, se hai creato un modello per prenotare i voli, un utente potrebbe usare un'espressione come "Voglio un volo da Boston a Seattle". La città di origine e la città di destinazione per tali espressioni dovrebbero essere simili. Un segnale per distinguere "Città di origine" potrebbe essere che spesso è preceduto dalla parola "from".

  • Assicurarsi di etichettare tutte le istanze di ogni entità nei dati di training e di test. Un approccio consiste nell'usare la funzione di ricerca per trovare tutte le istanze di una parola o di una frase nei dati per verificare se sono etichettate correttamente.

  • Etichettare i dati di test per le entità che non hanno alcun componente appreso e anche per quelle che lo fanno. In questo modo si garantisce che le metriche di valutazione siano accurate.

Usare il training standard prima del training avanzato

Il training standard è gratuito e veloce rispetto al training avanzato, rendendo utile comprendere rapidamente l'effetto della modifica del set di training o dello schema durante la compilazione del modello. Dopo aver soddisfatto lo schema, è consigliabile usare il training avanzato per ottenere la migliore intelligenza artificiale dal modello.

Usare la funzionalità di valutazione

Quando si compila un'app, spesso è utile rilevare gli errori in anticipo. In genere è consigliabile aggiungere un set di test durante la compilazione dell'app, poiché i risultati di training e valutazione sono molto utili per identificare errori o problemi nello schema.

Componenti e composizione di Machine Learning

Vedere Tipi di componenti.

Utilizzo della soglia del punteggio "none"

Se viene visualizzato un numero eccessivo di falsi positivi, ad esempio espressioni out-of-context contrassegnate come finalità valide, vedere Soglia di attendibilità per informazioni su come influisce sull'inferenza.

  • I componenti di entità non appresi come elenchi ed espressioni regolari non sono per definizione contestuali. Se vengono visualizzate entità elenco o regex in posizioni indesiderate, provare a etichettare i sinonimi dell'elenco come componente appreso automaticamente.

  • Per le entità, è possibile usare il componente appreso come componente "Obbligatorio" per limitare quando deve essere attivata un'entità composta.

Si supponga, ad esempio, di avere un'entità denominata "quantità di biglietti" che tenta di estrarre il numero di biglietti che si desidera prenotare per prenotare i voli, per espressioni come "Prenota due biglietti domani al Cairo".

In genere, si aggiunge un componente predefinito per Quantity.Number che estrae già tutti i numeri nelle espressioni. Tuttavia, se l'entità è stata definita solo con il componente predefinito, estrarrebbe anche altri numeri come parte dell'entità della quantità di biglietti, ad esempio "Prenota due biglietti domani al Cairo alle 18.00".

Per risolvere questo problema, è necessario etichettare un componente appreso nei dati di training per tutti i numeri destinati a essere una quantità di ticket. L'entità include ora due componenti:

  • Componente predefinito che può interpretare tutti i numeri e
  • Componente appreso che stima la posizione della quantità di ticket in una frase.

Se è necessario il componente appreso, assicurarsi che la quantità di ticket venga restituita solo quando il componente appreso lo stima nel contesto corretto. Se è necessario anche il componente predefinito, è possibile garantire che l'entità di quantità di ticket restituita sia un numero che nella posizione corretta.

Indirizzamento delle incoerenze di maiuscole e minuscole

Se la qualità dell'intelligenza artificiale è scarsa e si determina la combinazione di maiuscole e minuscole usate nei dati di training è diversa dai dati di test, è possibile usare l'impostazione del normalizeCasing progetto. In questo modo viene normalizzata la combinazione di maiuscole e minuscole di espressioni durante il training e il test del modello. Se è stata eseguita la migrazione da LUIS, è possibile riconoscere che LUIS ha eseguito questa operazione per impostazione predefinita.

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      "confidenceThreshold": 0.5,
      "normalizeCasing": true
    }
...

Gestione del modello di overconfidenza

I clienti possono usare la versione della ricetta LoraNorm nel caso in cui il modello sia erroneamente sovraconfidente. Un esempio può essere simile al seguente (si noti che il modello stima la finalità errata con attendibilità del 100%. In questo modo l'impostazione del progetto soglia di attendibilità non è utilizzabile.

Testo Finalità stimata Punteggio di attendibilità
"Chi ha costruito la Torre Eiffel?" Sports 1,00
"Ti aspetto bene oggi?" QueryWeather 1,00
"Spero che tu abbia una buona serata. Alarm 1,00

Per risolvere questo problema, usare la versione di 2023-04-15 configurazione che normalizza i punteggi di attendibilità. L'impostazione del progetto soglia di attendibilità può quindi essere modificata per ottenere il risultato desiderato.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2023-04-15",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Dopo aver inviato la richiesta, è possibile tenere traccia dello stato di avanzamento del processo di training in Language Studio come di consueto.

Nota

È necessario ripetere il training del modello dopo aver aggiornato l'impostazione del confidenceThreshold progetto. Successivamente, dovrai ripubblicare l'app per rendere effettiva la nuova soglia.

Normalizzazione nel modello versione 2023-04-15

La comprensione del linguaggio conversazionale versione 2023-04-15 fornisce la normalizzazione nel livello di inferenza che non influisce sul training.

Il livello di normalizzazione normalizza i punteggi di attendibilità della classificazione in un intervallo limitato. L'intervallo attualmente selezionato è da [-a,a] dove "a" è la radice quadrata del numero di finalità. Di conseguenza, la normalizzazione dipende dal numero di finalità nell'app. Se esiste un numero molto basso di finalità, il livello di normalizzazione ha un intervallo molto ridotto da usare. Con un numero abbastanza elevato di finalità, la normalizzazione è più efficace.

Se questa normalizzazione non sembra aiutare le finalità che non rientrano nell'ambito nella misura in cui la soglia di attendibilità può essere usata per escludere le espressioni di ambito, potrebbe essere correlata al numero di finalità nell'app. Prendere in considerazione l'aggiunta di altre finalità all'app o, se si usa un'architettura orchestrata, è consigliabile unire le app che appartengono allo stesso dominio insieme.

Debug di entità composte

Le entità sono funzioni che generano intervalli nell'input con un tipo associato. La funzione è definita da uno o più componenti. È possibile contrassegnare i componenti in base alle esigenze ed è possibile decidere se abilitare l'impostazione combina componenti . Quando si combinano componenti, tutti gli intervalli che si sovrappongono verranno uniti in un unico intervallo. Se l'impostazione non viene usata, verrà generato ogni intervallo di componenti.

Per comprendere meglio le prestazioni dei singoli componenti, è possibile disabilitare l'impostazione e impostare ogni componente su "non obbligatorio". In questo modo è possibile esaminare i singoli intervalli generati e sperimentare la rimozione di componenti in modo che vengano generati solo componenti problematici.

Valutare un modello usando più set di test

I dati in un progetto di comprensione del linguaggio di conversazione possono avere due set di dati. Set di "test" e set di "training". Se si vogliono usare più set di test per valutare il modello, è possibile:

  • Assegnare ai set di test nomi diversi, ad esempio "test1" e "test2".
  • Esportare il progetto per ottenere un file JSON con i relativi parametri e configurazione.
  • Usare il codice JSON per importare un nuovo progetto e rinominare il secondo set di test desiderato su "test".
  • Eseguire il training del modello per eseguire la valutazione usando il secondo set di test.

Parametri personalizzati per le app di destinazione e le app figlio

Se si usano app orchestrate, è possibile inviare sostituzioni di parametri personalizzati per varie app figlio. Il targetProjectParameters campo consente agli utenti di inviare un dizionario che rappresenta i parametri per ogni progetto di destinazione. Si consideri, ad esempio, un'app dell'agente di orchestrazione denominata Orchestrator orchestrazione tra un'app di comprensione del linguaggio di conversazione denominata e un'app di risposta alle domande personalizzata denominata CLU1CQA1. Se si vuole inviare un parametro denominato "top" all'app di risposta alle domande, è possibile usare il parametro precedente.

curl --request POST \
   --url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
   --header 'ocp-apim-subscription-key: <your subscription key>' \
   --data '{
     "kind": "Conversation",
     "analysisInput": {
         "conversationItem": {
             "id": "1",
             "text": "Turn down the volume",
             "modality": "text",
             "language": "en-us",
             "participantId": "1"
         }
     },
     "parameters": {
         "projectName": "Orchestrator",
         "verbose": true,
         "deploymentName": "std",
         "stringIndexType": "TextElement_V8",
"targetProjectParameters": {
            "CQA1": {
                "targetProjectKind": "QuestionAnswering",
                "callingOptions": {
                    "top": 1
                }
             }
         }
     }
 }'

Copiare progetti tra risorse del linguaggio

Spesso è possibile copiare progetti di comprensione del linguaggio di conversazione da una risorsa a un'altra usando il pulsante copia in Azure Language Studio. In alcuni casi, tuttavia, potrebbe essere più semplice copiare i progetti usando l'API.

Identificare prima di tutto:

  • nome progetto di origine
  • nome progetto di destinazione
  • risorsa del linguaggio di origine
  • risorsa della lingua di destinazione, in cui si vuole copiarlo.

Chiamare l'API per autorizzare l'azione di copia e ottenere accessTokens per l'operazione di copia effettiva in un secondo momento.

curl --request POST \ 
  --url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \ 
  --data '{"projectKind":"Conversation","allowOverwrite":false}' 

Chiamare l'API per completare l'operazione di copia. Usare la risposta ottenuta in precedenza come payload.

curl --request POST \ 
  --url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\ 
  --data '{ 
"projectKind": "Conversation", 
"targetProjectName": "<target-project-name>", 
"accessToken": "<access-token>", 
"expiresAt": "<expiry-date>", 
"targetResourceId": "<target-resource-id>", 
"targetResourceRegion": "<target-region>" 
}'

Indirizzamento all'esterno delle espressioni di dominio

I clienti possono usare la nuova versione della ricetta '2024-06-01-preview' nel caso in cui il modello abbia un'intelligenza artificiale insufficiente nelle espressioni di dominio. Un esempio di questo tipo con la ricetta predefinita può essere simile al seguente, in cui il modello ha 3 finalità Sports, QueryWeather e Alarm. Le espressioni di test non sono espressioni di dominio e il modello le classifica come InDomain con un punteggio di attendibilità relativamente elevato.

Testo Finalità stimata Punteggio di attendibilità
"Chi ha costruito la Torre Eiffel?" Sports 0.90
"Ti aspetto bene oggi?" QueryWeather 1,00
"Spero che tu abbia una buona serata. Alarm 0.80

Per risolvere questo problema, usare la 2024-06-01-preview versione di configurazione creata specificamente per risolvere questo problema mantenendo al tempo stesso una qualità ragionevolmente buona nelle espressioni di dominio.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2024-06-01-preview",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Dopo aver inviato la richiesta, è possibile tenere traccia dello stato di avanzamento del processo di training in Language Studio come di consueto.

Avvertenze:

  • La soglia None Score per l'app (soglia di attendibilità inferiore alla quale topIntent è contrassegnato come Nessuno) quando si usa questa ricetta deve essere impostata su 0. Ciò è dovuto al fatto che questa nuova ricetta attributi una determinata parte dell'oggetto nelle probabilità del dominio all'esterno del dominio, in modo che il modello non sia erroneamente sovraconfidente rispetto alle espressioni di dominio. Di conseguenza, gli utenti possono vedere punteggi di attendibilità leggermente ridotti per nelle espressioni di dominio rispetto alla ricetta di produzione.
  • Questa ricetta non è consigliata per le app con solo due finalità (2), ad esempio IntentA e None.
  • Questa ricetta non è consigliata per le app con un numero ridotto di espressioni per finalità. È consigliabile usare almeno 25 espressioni per finalità.