Aggiungere la comprensione del linguaggio naturale al bot

SI APPLICA A: SDK v4

Nota

Language Understanding (LUIS) verrà ritirato il 1° ottobre 2025. A partire dal 1° aprile 2023, non sarà possibile creare nuove risorse LUIS. Una versione più recente di Language Understanding è ora disponibile come parte del linguaggio di intelligenza artificiale di Azure.

CLU (Conversational Language Understanding), una funzionalità del linguaggio di intelligenza artificiale di Azure, è la versione aggiornata di LUIS. Per altre informazioni sul supporto per la comprensione del linguaggio in Bot Framework SDK, vedere Comprensione del linguaggio naturale.

La capacità di riconoscere ciò che l'utente intende a livello di conversazione e di contesto può essere un'attività difficile, ma può offrire al bot un'esperienza di conversazione più naturale. Language Understanding (LUIS) è un servizio API basato sul cloud che consente di creare una conversazione più naturale in modo tale che il bot riesca a riconoscere la finalità dei messaggi utente, rendendo più naturale il linguaggio per l'utente stesso, e indirizzi in modo migliore il flusso della conversazione.

Questo argomento descrive la procedura per aggiungere LUIS a un'applicazione di prenotazione di voli e riconoscere diverse finalità ed entità contenute nell'input utente.

Nota

Gli SDK JavaScript, C# e Python di Bot Framework continueranno a essere supportati, ma Java SDK verrà ritirato con il supporto finale a lungo termine che termina a novembre 2023. Verranno eseguite solo correzioni di bug e sicurezza critiche all'interno di questo repository.

I bot esistenti creati con Java SDK continueranno a funzionare.

Per la creazione di nuovi bot, prendere in considerazione l'uso di Power Virtual Agents e leggere la scelta della soluzione chatbot appropriata.

Per altre informazioni, vedere Il futuro della compilazione di bot.

Prerequisiti

Informazioni sull'esempio

Questo esempio di bot di base mostra un esempio di un'applicazione di prenotazione di voli. Usa un servizio LUIS per riconoscere l'input utente e restituire la principale finalità LUIS riconosciuta.

Il modello linguistico ha tre finalità: Book Flight, Cancele None. LUIS userà queste finalità per comprendere cosa intende l'utente quando invia un messaggio al bot. Il modello linguistico definisce anche le entità che LUIS può estrarre dall'input dell'utente, ad esempio l'origine o l'aeroporto di destinazione.

Dopo ogni elaborazione dell'input utente, DialogBot salva lo stato corrente di UserState e ConversationState. Dopo aver raccolto tutte le informazioni necessarie, l'esempio di codifica crea una prenotazione demo di prenotazione dei voli. In questo articolo verranno illustrati gli aspetti LUIS di questo esempio. Tuttavia, il flusso generale dell'esempio è:

  • Quando un nuovo utente si connette e visualizza una scheda di benvenuto, viene effettuata una chiamata a OnMembersAddedAsync.
  • Per ogni input utente ricevuto, viene effettuata una chiamata a OnMessageActivityAsync,

Class diagram outlining the structure of the C# sample.

Il modulo OnMessageActivityAsync esegue il dialogo appropriato tramite il metodo di estensione del dialogo Run. Il dialogo principale chiama quindi l'helper LUIS per trovare la finalità dell'utente con il punteggio più alto. Se la finalità con il punteggio massimo per l'input dell'utente restituisce "BookFlight", l'helper compila le informazioni dell'utente restituite da LUIS. Successivamente, il dialogo principale avvia BookingDialog, che acquisisce eventuali informazioni aggiuntive necessarie all'utente, ad esempio:

  • Origin: la città di origine
  • TravelDate: la data per cui prenotare il volo
  • Destination: la città di destinazione

Questo articolo illustra come aggiungere LUIS a un bot. Per informazioni sull'uso dei dialoghi o dello stato, vedere rispettivamente come raccogliere l'input degli utenti con una richiesta di dialogo o salvare i dati dell'utente e della conversazione.

Creare un'app LUIS nel portale LUIS

  1. Accedere al portale LUIS e, se necessario , creare un account e una risorsa di creazione.
  2. Nella pagina App di conversazione in LUIS selezionare Importa, quindi Importa come JSON.
  3. Nella finestra di dialogo Importa nuova app :
    1. Scegliere il file FlightBooking.json nella cartella CognitiveModels dell'esempio.
    2. Immettere FlightBooking come nome facoltativo dell'app e selezionare Fine.
  4. Il sito può visualizzare Come creare un'app LUIS efficace e Aggiornare le finestre di dialogo delle entità composite. È possibile ignorare questi dialoghi e continuare.
  5. Eseguire il training dell'app, quindi pubblicare l'app nell'ambiente di produzione . Per altre informazioni, vedere la documentazione di LUIS su come eseguire il training e pubblicare un'app.

Perché usare le entità

Le entità LUIS consentono al bot di comprendere gli eventi oltre le finalità standard. In questo modo è possibile raccogliere informazioni aggiuntive dagli utenti, in modo che il bot possa porre domande e rispondere in modo più intelligente. Insieme alle definizioni per le tre finalità LUIS 'Book Flight', 'Cancel' e 'None', il file FlightBooking.json contiene anche un set di entità come 'From.Airport' e 'To.Airport'. Queste entità consentono a LUIS di rilevare e restituire le informazioni aggiuntive contenute nell'input originale dell'utente quando ha richiesto una nuova prenotazione di viaggio.

Ottenere i valori per connettersi all'app LUIS

Dopo aver pubblicato l'app LUIS, è possibile accedere all'app dal proprio bot. È necessario registrare diversi valori per accedere all'app LUIS dall'interno del bot. È possibile recuperare tali informazioni usando il portale LUIS.

Recuperare le informazioni sull'applicazione dal portale LUIS.ai

Il file di impostazioni (appsettings.json, .env o config.py) riunisce tutti i riferimenti del servizio in un'unica posizione. Le informazioni recuperate verranno aggiunte a questo file nella sezione successiva.

  1. Selezionare l'app LUIS pubblicata da luis.ai.

  2. Con l'app LUIS pubblicata aperta, selezionare la scheda MANAGE (Gestione).

  3. Selezionare la scheda Impostazioni sul lato sinistro e registrare il valore visualizzato per ID applicazione come <YOUR_APP_ID>.

    Screenshot of the Manage page displaying your application ID.

  4. Selezionare Risorse di Azure e quindi Risorsa previsione. Registrare il valore visualizzato per Location come <YOUR_REGION> e Primary Key come <YOUR_AUTHORING_KEY>.

    Screenshot of the Manage page displaying your location and primary key.

    In alternativa, è possibile usare l'area e la chiave primaria per la risorsa di creazione.

Aggiornare il file di impostazioni

Aggiungere le informazioni necessarie per accedere all'app LUIS, inclusi l'ID applicazione, la chiave di creazione e l'area nel appsettings.json file. Nel passaggio precedente questi valori sono stati recuperati dall'app LUIS pubblicata. Il nome host dell'API deve essere nel formato <your region>.api.cognitive.microsoft.com.

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

Configurare il bot per l'uso dell'app LUIS

Assicurarsi che per il progetto sia installato il pacchetto NuGet Microsoft.Bot.Builder.AI.Luis.

Per connettersi al servizio LUIS, il bot esegue il pull delle informazioni aggiunte al file appsetting.json. La classe FlightBookingRecognizer contiene il codice con le impostazioni dal file appsetting.json ed esegue una query sul servizio LUIS chiamando il metodo RecognizeAsync.

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs contiene la logica per estrarre From, To e TravelDate, estende la classe parziale FlightBooking.cs usata per archiviare i risultati di LUIS quando si chiama FlightBookingRecognizer.RecognizeAsync<FlightBooking> da MainDialog.cs.

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

LUIS è ora configurato e connesso per il bot.

Test del bot

Scaricare e installare l'ultima versione di Bot Framework Emulator

  1. Eseguire l'esempio in locale nel computer. Se sono necessarie istruzioni, vedere il file per l'esempio README C#, l'esempio JS o l'esempio Python.

  2. Nell'emulatore digitare un messaggio come "travel to paris" o "going from paris to berlin". Usare qualsiasi espressione disponibile nel file FlightBooking.json per eseguire il training della finalità "Book flight".

Se la finalità principale restituita da LUIS viene risolta in "Prenota volo", il bot chiederà altre domande fino a quando non dispone di informazioni sufficienti archiviate per creare una prenotazione di viaggio. A quel punto, restituirà le informazioni su questa prenotazione all'utente.

A questo punto, la logica del bot del codice verrà reimpostata e sarà possibile continuare a creare altre prenotazioni.

Informazioni aggiuntive

Per altre informazioni su LUIS, vedere la documentazione di LUIS:

Suggerimento

Diverse parti dell'SDK definiscono classi di entità o elementi separati. Per le entità di messaggio, vedere Entità e tipi di attività.