Udostępnij za pośrednictwem


Używanie okien dialogowych w ramach umiejętności

DOTYCZY: ZESTAW SDK w wersji 4

W tym artykule pokazano, jak utworzyć umiejętności obsługujące wiele akcji. Obsługuje te akcje przy użyciu okien dialogowych. Główne okno dialogowe odbiera początkowe dane wejściowe od konsumenta umiejętności, a następnie uruchamia odpowiednią akcję. Aby uzyskać informacje na temat implementowania konsumenta umiejętności dla skojarzonego przykładowego kodu, zobacz, jak korzystać z umiejętności przy użyciu okien dialogowych.

W tym artykule założono, że wiesz już, jak tworzyć umiejętności. Aby dowiedzieć się, jak utworzyć bota umiejętności, zobacz, jak zaimplementować umiejętności.

Uwaga

Zestawy SDK języka JavaScript, C# i Python platformy Bot Framework będą nadal obsługiwane, jednak zestaw SDK języka Java jest wycofywany z ostatecznym długoterminowym wsparciem kończącym się w listopadzie 2023 r.

Istniejące boty utworzone za pomocą zestawu JAVA SDK będą nadal działać.

W przypadku tworzenia nowych botów rozważ użycie programu Microsoft Copilot Studio i przeczytaj o wyborze odpowiedniego rozwiązania copilot.

Aby uzyskać więcej informacji, zobacz Przyszłość tworzenia botów.

Wymagania wstępne

Uwaga

Usługa Language Understanding (LUIS) zostanie wycofana 1 października 2025 r. Od 1 kwietnia 2023 r. nie będzie można tworzyć nowych zasobów usługi LUIS. Nowsza wersja interpretacji języka jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.

Język konwersacyjny (CLU), funkcja języka AI platformy Azure, to zaktualizowana wersja usługi LUIS. Aby uzyskać więcej informacji na temat obsługi języka w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.

Informacje o tym przykładzie

Przykład umiejętnościDialog zawiera projekty dla dwóch botów:

  • Bot główny okna dialogowego, który używa klasy okna dialogowego umiejętności do korzystania z umiejętności.
  • Bot umiejętności okna dialogowego, który używa okna dialogowego do obsługi działań pochodzących od użytkowników umiejętności. Ta umiejętność jest adaptacją podstawowego przykładu bota . (Aby uzyskać więcej informacji na temat podstawowego bota, zobacz dodawanie interpretacji języka naturalnego do bota).

W tym artykule skupiono się na sposobie używania okna dialogowego w botze umiejętności do zarządzania wieloma akcjami.

Aby uzyskać informacje na temat bota konsumenta umiejętności, zobacz, jak korzystać z umiejętności przy użyciu okien dialogowych.

Zasoby

W przypadku wdrożonych botów uwierzytelnianie bot-to-bot wymaga, aby każdy uczestniczący bot miał prawidłową tożsamość. Możesz jednak testować umiejętności i umiejętności użytkowników lokalnie za pomocą emulatora bot framework bez informacji o tożsamości.

Aby udostępnić umiejętności botom dostępnym dla użytkowników, zarejestruj umiejętności na platformie Azure. Aby uzyskać więcej informacji, zobacz jak zarejestrować bota w usłudze Azure AI Bot Service.

Opcjonalnie bot umiejętności może używać modelu usługi LUIS rezerwacji lotów. Aby użyć tego modelu, użyj pliku CognitiveModels/FlightBooking.json, aby utworzyć, wytrenować i opublikować model usługi LUIS.

Konfiguracja aplikacji

  1. Opcjonalnie dodaj informacje o tożsamości umiejętności do pliku konfiguracji umiejętności. (Jeśli użytkownik umiejętności lub umiejętności określa tożsamość, oba muszą).

  2. Jeśli używasz modelu usługi LUIS, dodaj identyfikator aplikacji usługi LUIS, klucz interfejsu API i nazwę hosta interfejsu API.

DialogSkillBot\appsettings.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "ConnectionName": "",

  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": "",

  // This is a comma separate list with the App IDs that will have access to the skill.
  // This setting is used in AllowedCallersClaimsValidator.
  // Examples: 
  //    [ "*" ] allows all callers.
  //    [ "AppId1", "AppId2" ] only allows access to parent bots with "AppId1" and "AppId2".
  "AllowedCallers": [ "*" ]
}

Logika routingu działań

Umiejętność obsługuje kilka różnych funkcji. Może zarezerwować lot lub uzyskać pogodę dla miasta. Ponadto, jeśli otrzyma komunikat poza jednym z tych kontekstów, może użyć usługi LUIS, aby spróbować zinterpretować komunikat. Manifest umiejętności opisuje te akcje, ich parametry wejściowe i wyjściowe oraz punkty końcowe umiejętności. Należy pamiętać, że umiejętności mogą obsługiwać wydarzenie "BookFlight" lub "GetWeather". Może również obsługiwać działania komunikatów.

Umiejętność definiuje okno dialogowe routingu działań, którego używa do wybrania akcji do zainicjowania na podstawie początkowego działania przychodzącego od użytkownika umiejętności. Jeśli zostanie podany, model usługi LUIS może rozpoznać intencje book-flight i get-weather w początkowym komunikacie.

Akcja book-flight jest procesem wieloetapowym zaimplementowanym jako osobne okno dialogowe. Po rozpoczęciu akcji działania przychodzące są obsługiwane przez to okno dialogowe. Akcja get-weather ma logikę zastępczą, która zostanie zastąpiona w w pełni zaimplementowanym botem.

Okno dialogowe routingu działań zawiera kod umożliwiający:

Okna dialogowe używane w umiejętności dziedziczą po klasie okna dialogowego składnika. Aby uzyskać więcej informacji o oknach dialogowych składników, zobacz jak zarządzać złożonością okna dialogowego.

Inicjowanie okna dialogowego

Okno dialogowe routingu działań zawiera okno dialogowe podrzędne do rezerwacji lotu. Główne okno dialogowe kaskadowe zawiera jeden krok, który spowoduje uruchomienie akcji na podstawie otrzymanego początkowego działania.

Akceptuje również rozpoznawanie usługi LUIS. Jeśli to rozpoznawanie zostanie zainicjowane, okno dialogowe użyje go do zinterpretowania intencji początkowego działania komunikatu.

DialogSkillBot\Dialogs\ActivityRouterDialog.cs

private readonly DialogSkillBotRecognizer _luisRecognizer;

public ActivityRouterDialog(DialogSkillBotRecognizer luisRecognizer)
    : base(nameof(ActivityRouterDialog))
{
    _luisRecognizer = luisRecognizer;

    AddDialog(new BookingDialog());
    AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[] { ProcessActivityAsync }));

    // The initial child Dialog to run.
    InitialDialogId = nameof(WaterfallDialog);
}

Przetwarzanie początkowego działania

W pierwszym kroku (i tylko) głównego okna dialogowego kaskadowego umiejętność sprawdza typ działania przychodzącego.

  • Działania zdarzeń są przekazywane do programu obsługi działań zdarzeń, który uruchamia odpowiednią akcję na podstawie nazwy zdarzenia.
  • Działania komunikatów są przekazywane do programu obsługi działań komunikatów, który wykonuje dodatkowe przetwarzanie przed podjęciem decyzji o tym, co należy zrobić.

Jeśli umiejętność nie rozpoznaje typu działania przychodzącego lub nazwy zdarzenia, wysyła komunikat o błędzie i kończy się.

DialogSkillBot\Dialogs\ActivityRouterDialog.cs

private async Task<DialogTurnResult> ProcessActivityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // A skill can send trace activities, if needed.
    await stepContext.Context.TraceActivityAsync($"{GetType().Name}.ProcessActivityAsync()", label: $"Got ActivityType: {stepContext.Context.Activity.Type}", cancellationToken: cancellationToken);

    switch (stepContext.Context.Activity.Type)
    {
        case ActivityTypes.Event:
            return await OnEventActivityAsync(stepContext, cancellationToken);

        case ActivityTypes.Message:
            return await OnMessageActivityAsync(stepContext, cancellationToken);

        default:
            // We didn't get an activity type we can handle.
            await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Unrecognized ActivityType: \"{stepContext.Context.Activity.Type}\".", inputHint: InputHints.IgnoringInput), cancellationToken);
            return new DialogTurnResult(DialogTurnStatus.Complete);
    }
}
// This method performs different tasks based on the event name.
private async Task<DialogTurnResult> OnEventActivityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var activity = stepContext.Context.Activity;
    await stepContext.Context.TraceActivityAsync($"{GetType().Name}.OnEventActivityAsync()", label: $"Name: {activity.Name}. Value: {GetObjectAsJsonString(activity.Value)}", cancellationToken: cancellationToken);

    // Resolve what to execute based on the event name.
    switch (activity.Name)
    {
        case "BookFlight":
            return await BeginBookFlight(stepContext, cancellationToken);

        case "GetWeather":
            return await BeginGetWeather(stepContext, cancellationToken);

        default:
            // We didn't get an event name we can handle.
            await stepContext.Context.SendActivityAsync(MessageFactory.Text($"Unrecognized EventName: \"{activity.Name}\".", inputHint: InputHints.IgnoringInput), cancellationToken);
            return new DialogTurnResult(DialogTurnStatus.Complete);
    }
}

Obsługa działań komunikatów

Jeśli rozpoznawanie usługi LUIS jest skonfigurowane, umiejętność wywołuje usługę LUIS, a następnie uruchamia akcję na podstawie intencji. Jeśli rozpoznawanie usługi LUIS nie jest skonfigurowane lub intencja nie jest obsługiwana, umiejętność wysyła komunikat o błędzie i kończy się.

DialogSkillBot\Dialogs\ActivityRouterDialog.cs

// This method just gets a message activity and runs it through LUIS. 
private async Task<DialogTurnResult> OnMessageActivityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var activity = stepContext.Context.Activity;
    await stepContext.Context.TraceActivityAsync($"{GetType().Name}.OnMessageActivityAsync()", label: $"Text: \"{activity.Text}\". Value: {GetObjectAsJsonString(activity.Value)}", cancellationToken: cancellationToken);

    if (!_luisRecognizer.IsConfigured)
    {
        await stepContext.Context.SendActivityAsync(MessageFactory.Text("NOTE: LUIS is not configured. To enable all capabilities, add 'LuisAppId', 'LuisAPIKey' and 'LuisAPIHostName' to the appsettings.json file.", inputHint: InputHints.IgnoringInput), cancellationToken);
    }
    else
    {
        // Call LUIS with the utterance.
        var luisResult = await _luisRecognizer.RecognizeAsync<FlightBooking>(stepContext.Context, cancellationToken);

        // Create a message showing the LUIS results.
        var sb = new StringBuilder();
        sb.AppendLine($"LUIS results for \"{activity.Text}\":");
        var (intent, intentScore) = luisResult.Intents.FirstOrDefault(x => x.Value.Equals(luisResult.Intents.Values.Max()));
        sb.AppendLine($"Intent: \"{intent}\" Score: {intentScore.Score}");

        await stepContext.Context.SendActivityAsync(MessageFactory.Text(sb.ToString(), inputHint: InputHints.IgnoringInput), cancellationToken);

        // Start a dialog if we recognize the intent.
        switch (luisResult.TopIntent().intent)
        {
            case FlightBooking.Intent.BookFlight:
                return await BeginBookFlight(stepContext, cancellationToken);

            case FlightBooking.Intent.GetWeather:
                return await BeginGetWeather(stepContext, cancellationToken);

            default:
                // Catch all for unhandled intents.
                var didntUnderstandMessageText = $"Sorry, I didn't get that. Please try asking in a different way (intent was {luisResult.TopIntent().intent})";
                var didntUnderstandMessage = MessageFactory.Text(didntUnderstandMessageText, didntUnderstandMessageText, InputHints.IgnoringInput);
                await stepContext.Context.SendActivityAsync(didntUnderstandMessage, cancellationToken);
                break;
        }
    }

    return new DialogTurnResult(DialogTurnStatus.Complete);
}

Rozpoczynanie akcji wieloetapowej

Akcja book-flight rozpoczyna wieloetapowe okno dialogowe, aby uzyskać szczegóły rezerwacji od użytkownika.

Akcja get-weather nie jest implementowana. Obecnie wysyła komunikat zastępczy, a następnie kończy się.

DialogSkillBot\Dialogs\ActivityRouterDialog.cs

private async Task<DialogTurnResult> BeginBookFlight(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var activity = stepContext.Context.Activity;
    var bookingDetails = new BookingDetails();
    if (activity.Value != null)
    {
        bookingDetails = JsonConvert.DeserializeObject<BookingDetails>(JsonConvert.SerializeObject(activity.Value));
    }

    // Start the booking dialog.
    var bookingDialog = FindDialog(nameof(BookingDialog));
    return await stepContext.BeginDialogAsync(bookingDialog.Id, bookingDetails, cancellationToken);
}
private static async Task<DialogTurnResult> BeginGetWeather(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var activity = stepContext.Context.Activity;
    var location = new Location();
    if (activity.Value != null)
    {
        location = JsonConvert.DeserializeObject<Location>(JsonConvert.SerializeObject(activity.Value));
    }

    // We haven't implemented the GetWeatherDialog so we just display a TODO message.
    var getWeatherMessageText = $"TODO: get weather for here (lat: {location.Latitude}, long: {location.Longitude}";
    var getWeatherMessage = MessageFactory.Text(getWeatherMessageText, getWeatherMessageText, InputHints.IgnoringInput);
    await stepContext.Context.SendActivityAsync(getWeatherMessage, cancellationToken);
    return new DialogTurnResult(DialogTurnStatus.Complete);
}

Zwracanie wyniku

Umiejętność rozpoczyna okno dialogowe rezerwacji dla akcji book-flight. Ponieważ okno dialogowe routingu działań ma tylko jeden krok, po zakończeniu okna dialogowego rezerwacji okno dialogowe routingu działań również kończy się, a wynik okna dialogowego z okna dialogowego rezerwacji staje się wynikiem okna dialogowego dla okna dialogowego routingu działań.

Akcja get-weather kończy się po prostu bez ustawiania wartości zwracanej.

Anulowanie akcji wieloetapowej

Okno dialogowe rezerwacji i okno dialogowe rozpoznawania dat podrzędnych pochodzą zarówno z podstawowego okna dialogowego anulowania i pomocy, które sprawdza komunikaty od użytkownika.

  • W obszarze "pomoc" lub "?", wyświetla komunikat pomocy, a następnie kontynuuje przepływ konwersacji po następnym kolei.
  • Na "anuluj" lub "zamknij", anuluje wszystkie okna dialogowe, co kończy umiejętności.

Aby uzyskać więcej informacji, zobacz, jak obsługiwać przerwy użytkowników.

Rejestracja usługi

Usługi potrzebne do wykonania tej umiejętności są takie same jak te, które są potrzebne do bota umiejętności. Zobacz, jak zaimplementować umiejętności, aby zapoznać się z omówieniem wymaganych usług.

Manifest umiejętności

Manifest umiejętności to plik JSON opisujący działania, które mogą wykonywać umiejętności, jego parametry wejściowe i wyjściowe oraz punkty końcowe umiejętności. Manifest zawiera informacje potrzebne do uzyskania dostępu do umiejętności innego bota.

DialogSkillBot\wwwroot\manifest\dialogchildbot-manifest-1.0.json

{
  "$schema": "https://schemas.botframework.com/schemas/skills/skill-manifest-2.0.0.json",
  "$id": "DialogSkillBot",
  "name": "Skill bot with dialogs",
  "version": "1.0",
  "description": "This is a sample skill definition for multiple activity types.",
  "publisherName": "Microsoft",
  "privacyUrl": "https://dialogskillbot.contoso.com/privacy.html",
  "copyright": "Copyright (c) Microsoft Corporation. All rights reserved.",
  "license": "",
  "iconUrl": "https://dialogskillbot.contoso.com/icon.png",
  "tags": [
    "sample",
    "travel",
    "weather",
    "luis"
  ],
  "endpoints": [
    {
      "name": "default",
      "protocol": "BotFrameworkV3",
      "description": "Default endpoint for the skill.",
      "endpointUrl": "https://dialogskillbot.contoso.com/api/messages",
      "msAppId": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "activities": {
    "bookFlight": {
      "description": "Books a flight (multi turn).",
      "type": "event",
      "name": "BookFlight",
      "value": {
        "$ref": "#/definitions/bookingInfo"
      },
      "resultValue": {
        "$ref": "#/definitions/bookingInfo"
      }
    },
    "getWeather": {
      "description": "Retrieves and returns the weather for the user's location.",
      "type": "event",
      "name": "GetWeather",
      "value": {
        "$ref": "#/definitions/location"
      },
      "resultValue": {
        "$ref": "#/definitions/weatherReport"
      }
    },
    "passthroughMessage": {
      "type": "message",
      "description": "Receives the user's utterance and attempts to resolve it using the skill's LUIS models.",
      "value": {
        "type": "object"
      }
    }
  },
  "definitions": {
    "bookingInfo": {
      "type": "object",
      "required": [
        "origin"
      ],
      "properties": {
        "origin": {
          "type": "string",
          "description": "This is the origin city for the flight."
        },
        "destination": {
          "type": "string",
          "description": "This is the destination city for the flight."
        },
        "travelDate": {
          "type": "string",
          "description": "The date for the flight in YYYY-MM-DD format."
        }
      }
    },
    "weatherReport": {
      "type": "array",
      "description": "Array of forecasts for the next week.",
      "items": [
        {
          "type": "string"
        }
      ]
    },
    "location": {
      "type": "object",
      "description": "Location metadata.",
      "properties": {
        "latitude": {
          "type": "number",
          "title": "Latitude"
        },
        "longitude": {
          "type": "number",
          "title": "Longitude"
        },
        "postalCode": {
          "type": "string",
          "title": "Postal code"
        }
      }
    }
  }
}

Schemat manifestu umiejętności to plik JSON opisujący schemat manifestu umiejętności. Najnowsza wersja schematu to wersja 2.1.

Testowanie bota umiejętności

Możesz przetestować umiejętności w emulatorze za pomocą użytkownika umiejętności. W tym celu należy jednocześnie uruchamiać boty konsumenckie umiejętności i umiejętności. Zobacz, jak używać okna dialogowego do korzystania z umiejętności , aby uzyskać informacje na temat konfigurowania umiejętności.

Pobierz i zainstaluj najnowszą wersję programu Bot Framework Emulator.

  1. Uruchom bota umiejętności okna dialogowego i lokalnego bota głównego okna dialogowego na maszynie. Jeśli potrzebujesz instrukcji, zapoznaj się z plikiem przykładu README dla języków C#, JavaScript, Java lub Python.
  2. Użyj emulatora, aby przetestować bota.
    • Po pierwszym dołączeniu do konwersacji bot wyświetla wiadomość powitalną i o umiejętności, które chcesz wywołać. Bot umiejętności dla tego przykładu ma tylko jedną umiejętność.
    • Wybierz pozycję DialogSkillBot.
  3. Następnie bot prosi o wybranie akcji dotyczącej umiejętności. Wybierz pozycję "BookFlight".
    1. Umiejętność rozpoczyna swoją akcję book-flight; odpowiedz na monity.
    2. Po ukończeniu umiejętności główny bot wyświetla szczegóły rezerwacji przed ponownym wyświetleniem monitu o umiejętności, które chcesz wywołać.
  4. Ponownie wybierz pozycję DialogSkillBot i "BookFlight".
    1. Odpowiedz na pierwszy monit, a następnie wprowadź "anuluj", aby anulować akcję.
    2. Bot umiejętności kończy się bez ukończenia akcji, a użytkownik monituje o umiejętności, które chcesz wywołać.

Więcej informacji o debugowaniu

Ponieważ ruch między umiejętnościami i użytkownikami umiejętności jest uwierzytelniany, podczas debugowania takich botów są wykonywane dodatkowe kroki.

  • Użytkownik umiejętności i wszystkie umiejętności, których używa, bezpośrednio lub pośrednio, muszą być uruchomione.
  • Jeśli boty działają lokalnie i jeśli którykolwiek z botów ma identyfikator aplikacji i hasło, wszystkie boty muszą mieć prawidłowe identyfikatory i hasła.
  • Jeśli wszystkie boty są wdrożone, zobacz, jak debugować bota z dowolnego kanału przy użyciu narzędzia ngrok.
  • Jeśli niektóre boty działają lokalnie, a niektóre są wdrażane, zobacz, jak debugować umiejętności lub umiejętności użytkownika.

W przeciwnym razie możesz debugować użytkownika umiejętności lub umiejętności podobne do debugowania innych botów. Aby uzyskać więcej informacji, zobacz Debugowanie bota i Debugowanie za pomocą emulatora platformy Bot Framework.

Dodatkowe informacje