Megosztás a következőn keresztül:


Párbeszédpanelek használata egy adott képességen belül

A KÖVETKEZŐKRE VONATKOZIK: SDK v4

Ez a cikk bemutatja, hogyan hozhat létre olyan készséget, amely több műveletet támogat. Párbeszédpanelek használatával támogatja ezeket a műveleteket. A fő párbeszédpanel megkapja a kezdeti bemenetet a készségfelhasználótól, majd elindítja a megfelelő műveletet. A képességfelhasználónak a társított mintakódhoz való implementálásával kapcsolatos információkért tekintse meg, hogyan használhat fel készséget párbeszédpanelek használatával.

Ez a cikk feltételezi, hogy már ismeri a készségek létrehozását. A képességrobotok általános létrehozásához tekintse meg, hogyan valósíthat meg készséget.

Feljegyzés

A Bot Framework JavaScript, C# és Python SDK-k továbbra is támogatottak lesznek, a Java SDK-t azonban 2023 novemberében végső hosszú távú támogatással kivonják.

A Java SDK-val létrehozott meglévő robotok továbbra is működni fognak.

Az új robotépítéshez fontolja meg a Microsoft Copilot Studio használatát, és olvassa el a megfelelő copilot-megoldás kiválasztását.

További információ: A robotépítés jövője.

Előfeltételek

Feljegyzés

A Language Understanding (LUIS) 2025. október 1-jén megszűnik. 2023. április 1-től nem hozhat létre új LUIS-erőforrásokat. Az Azure AI Language részeként már elérhető a nyelvértés újabb verziója.

Az Azure AI Language egyik funkciója, a beszélgetési nyelv megértése (CLU) a LUIS frissített verziója. További információ a Bot Framework SDK nyelvfelismerési támogatásáról: Természetes nyelvfelismerés.

A minta ismertetése

A skillDialog minta két robot projektjeit tartalmazza:

  • A párbeszédpanel gyökérrobotja, amely egy készség-párbeszédpanel-osztály használatával használ fel egy készséget.
  • A párbeszédpanel készségrobotja, amely egy párbeszédpanelt használ a készségfelhasználóktól érkező tevékenységek kezeléséhez. Ez a képesség az alapvető robotminta adaptálása. (Az alaprobottal kapcsolatos további információkért tekintse meg, hogyan adhat hozzá természetes nyelvfelismerést a robothoz.)

Ez a cikk azt ismerteti, hogyan használhat párbeszédpanelt egy képességroboton belül több művelet kezeléséhez.

A készségfelhasználó robottal kapcsolatos információkért tekintse meg, hogyan használhat fel készséget párbeszédpanelek használatával.

Források

Az üzembe helyezett robotok esetében a robotok között történő hitelesítéshez minden résztvevő robotnak érvényes identitással kell rendelkeznie. A Bot Framework Emulator segítségével azonban identitásadatok nélkül helyileg tesztelheti a készségeket és a készségfelhasználókat.

Ha elérhetővé szeretné tenni a képességet a felhasználói robotok számára, regisztrálja a képességet az Azure-ban. További információ: robot regisztrálása az Azure AI Bot Service-ben.

A képességrobot opcionálisan járatfoglalási LUIS-modellt is használhat. A modell használatához használja a CognitiveModels/FlightBooking.json fájlt a LUIS-modell létrehozásához, betanításához és közzétételéhez.

Alkalmazáskonfiguráció

  1. Ha szükséges, adja hozzá a képesség identitásadatait a képesség konfigurációs fájljába. (Ha a képesség- vagy képességfelhasználó identitást határoz meg, mindkettőnek meg kell.)

  2. Ha a LUIS-modellt használja, adja hozzá a LUIS-alkalmazásazonosítót, az API-kulcsot és az API-gazdagép nevét.

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": [ "*" ]
}

Tevékenység-útválasztási logika

A képesség számos különböző funkciót támogat. Lefoglalhat egy repülőt, vagy lekérheti a város időjárását. Ezenkívül, ha az üzenet ezen környezetek bármelyikén kívül kap üzenetet, a LUIS használatával megpróbálhatja értelmezni az üzenetet. A képesség jegyzékfájlja ismerteti ezeket a műveleteket, azok bemeneti és kimeneti paramétereit, valamint a képesség végpontjait. A képesség képes kezelni a "BookFlight" vagy a "GetWeather" eseményt. Képes kezelni az üzenettevékenységeket is.

A képesség egy tevékenység-útválasztási párbeszédpanelt határoz meg, amellyel kiválaszthatja, hogy melyik műveletet kezdeményezi a képességfelhasználótól érkező kezdeti tevékenység alapján. Ha meg van adva, a LUIS-modell képes felismerni a könyv szerinti repülési és a get-weather szándékokat egy kezdeti üzenetben.

A book-flight művelet egy többlépéses folyamat, amely külön párbeszédpanelként van implementálva. A művelet megkezdése után a bejövő tevékenységeket az adott párbeszédpanel kezeli. A get-weather művelet helyőrző logikával rendelkezik, amelyet egy teljes mértékben implementált robot helyettesítene.

A tevékenység-útválasztás párbeszédpanel a következő kódot tartalmazza:

A képességben használt párbeszédpanelek az összetevő párbeszédpanelosztályától öröklődnek . Az összetevők párbeszédpaneljeiről további információt a párbeszédpanelek összetettségének kezelésével kapcsolatban talál.

A párbeszédpanel inicializálása

A tevékenység-útválasztás párbeszédpanel tartalmaz egy gyermek párbeszédpanelt egy járat foglalásához. A fő vízesés párbeszédpanel egy lépéssel indít el egy műveletet a kapott kezdeti tevékenység alapján.

Luis-felismerőt is elfogad. Ha ez a felismerő inicializálva van, a párbeszédpanel egy kezdeti üzenettevékenység szándékának értelmezésére fogja használni.

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);
}

Kezdeti tevékenység feldolgozása

A fő vízesés párbeszédpanel első (és egyetlen) lépésében a képesség ellenőrzi a bejövő tevékenység típusát.

  • Az eseménytevékenységeket egy eseménytevékenység-kezelő továbbítja, amely az esemény neve alapján elindítja a megfelelő műveletet.
  • Az üzenettevékenységek továbbítva lesznek egy üzenettevékenység-kezelőnek , amely további feldolgozást végez, mielőtt eldöntené, hogy mit kell tennie.

Ha a képesség nem ismeri fel a bejövő tevékenység típusát vagy az esemény nevét, hibaüzenetet küld, és véget ér.

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);
    }
}

Üzenettevékenységek kezelése

Ha a LUIS-felismerő konfigurálva van, a képesség meghívja a LUIS-t, majd elindít egy műveletet a szándék alapján. Ha a LUIS-felismerő nincs konfigurálva, vagy a szándék nem támogatott, a képesség hibaüzenetet küld, és véget ér.

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);
}

Többlépéses művelet indítása

A foglalási művelet egy többlépéses párbeszédpanelt indít el a foglalás részleteinek lekéréséhez a felhasználótól.

A get-weather művelet nincs implementálva. Jelenleg egy helyőrző üzenetet küld, majd véget ér.

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);
}

Eredmény visszaadása

A képesség elindít egy foglalási párbeszédpanelt a foglalási művelethez. Mivel a tevékenység-útválasztás párbeszédpanelnek csak egy lépése van, a foglalási párbeszédpanel végén a tevékenység-útválasztás párbeszédpanel is véget ér, és a foglalási párbeszédpanelen kapott párbeszédpanel lesz a tevékenység-útválasztás párbeszédpanel párbeszédpanel eredménye.

A get-weather művelet egyszerűen véget ér a visszatérési érték megadása nélkül.

Többlépéses művelet megszakítása

A foglalási párbeszédpanel és a gyermekdátum-feloldó párbeszédpanel egyaránt az alapszintű lemondási és súgó párbeszédpanelből származik, amely ellenőrzi a felhasználótól érkező üzeneteket.

  • A "súgó" vagy a "?", akkor megjelenik egy súgóüzenet, majd folytatja a beszélgetési folyamatot a következő sor.
  • A "mégse" vagy a "kilépés" lehetőségnél megszakítja az összes párbeszédpanelt, ami befejezi a készséget.

További információkért tekintse meg a felhasználói megszakítások kezelését.

Szolgáltatásregisztráció

Az ehhez a képességhez szükséges szolgáltatások megegyeznek a képességrobotok általános szolgáltatásaival. Megtudhatja, hogyan valósíthat meg készséget a szükséges szolgáltatások megvitatásához.

Készségjegyzék

A képességjegyzék egy JSON-fájl, amely leírja a képesség által elvégezhető tevékenységeket, azok bemeneti és kimeneti paramétereit, valamint a képesség végpontjait. A jegyzék tartalmazza azokat az információkat, amelyekre szüksége van a képesség eléréséhez egy másik robottól.

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"
        }
      }
    }
  }
}

A képességjegyzék-séma egy JSON-fájl, amely leírja a képességjegyzék sémáját. A legújabb sémaverzió a 2.1-es verzió.

A képességrobot tesztelése

A készséget az Emulátorban tesztelheti a készségfelhasználóval. Ehhez egyszerre kell futtatnia a készség- és készségfelhasználó robotokat is. Megtudhatja, hogyan használhat egy párbeszédpanelt a képesség konfigurálására vonatkozó információkért.

Töltse le és telepítse a legújabb Bot Framework Emulatort.

  1. Futtassa a párbeszédpanel-képességrobotot és a párbeszédpanel gyökérrobotját helyileg a számítógépen. Ha útmutatásra van szüksége, tekintse meg a C#, JavaScript, Java vagy Python mintafájlját.README
  2. Az Emulator használatával tesztelje a robotot.
    • Amikor először csatlakozik a beszélgetéshez, a robot üdvözlő üzenetet jelenít meg, és megkérdezi, hogy milyen készséget szeretne meghívni. A minta készségrobotja csak egy képességgel rendelkezik.
    • Válassza a DialogSkillBot lehetőséget.
  3. Ezután a robot arra kéri, hogy válasszon egy műveletet a képességhez. Válassza a "BookFlight" lehetőséget.
    1. A képesség megkezdi a könyv-repülési tevékenységet; válaszoljon a kérdésekre.
    2. Ha a képesség befejeződött, a gyökérrobot megjeleníti a foglalás részleteit, mielőtt újra rákérdez a meghívni kívánt képességre.
  4. Válassza ismét a DialogSkillBot és a "BookFlight" lehetőséget.
    1. Válaszoljon az első kérdésre, majd a művelet megszakításához írja be a "mégse" szöveget.
    2. A képességrobot a művelet befejezése nélkül ér véget, és a fogyasztó kéri a meghívni kívánt készséget.

További információ a hibakeresésről

Mivel a készségek és a készségfelhasználók közötti forgalom hitelesítése megtörtént, az ilyen robotok hibakereséséhez további lépések is szükségesek.

Ellenkező esetben ugyanúgy hibakeresést végezhet egy képességfelhasználón vagy képességen, mint más robotok. További információ: Robot hibakeresése és hibakeresés a Bot Framework Emulator használatával.

További információk

  • Egy készséget használó párbeszédpanel használatával megtudhatja, hogyan használhat fel készséget egy készség párbeszédpanel használatával.