Aracılığıyla paylaş


Beceri içindeki iletişim kutularını kullanma

ŞUNLAR IÇIN GEÇERLIDIR: SDK v4

Bu makalede, birden çok eylemi destekleyen bir becerinin nasıl oluşturulacağı gösterilmektedir. İletişim kutularını kullanarak bu eylemleri destekler. Ana iletişim kutusu beceri tüketicisinden ilk girişi alır ve ardından uygun eylemi başlatır. İlişkili örnek kod için beceri tüketicisini uygulama hakkında bilgi için bkz. İletişim kutularını kullanarak beceri kullanma.

Bu makalede, beceri oluşturma konusunda zaten bilgi sahibi olduğunuz varsayılır. Genel olarak beceri botu oluşturma hakkında bilgi için bkz. Beceri uygulama.

Not

Bot Framework JavaScript, C# ve Python SDK'ları desteklenmeye devam edecektir, ancak Java SDK'sı son uzun vadeli destek Kasım 2023'te sona erecek şekilde kullanımdan kaldırılacaktır.

Java SDK ile oluşturulan mevcut botlar çalışmaya devam edecektir.

Yeni bot derlemesi için Microsoft Copilot Studio'yu kullanmayı göz önünde bulundurun ve doğru copilot çözümünü seçme hakkında bilgi edinin.

Daha fazla bilgi için bkz . Bot oluşturmanın geleceği.

Önkoşullar

Not

Language Understanding (LUIS) 1 Ekim 2025'te kullanımdan kaldırılacaktır. 1 Nisan 2023'e kadar yeni LUIS kaynakları oluşturamayacaksınız. Dil anlamanın daha yeni bir sürümü artık Azure AI Dili'nin bir parçası olarak kullanılabilir.

Azure AI Dili'nin bir özelliği olan konuşma dili anlama (CLU), LUIS'in güncelleştirilmiş sürümüdür. Bot Framework SDK'sında dil anlama desteği hakkında daha fazla bilgi için bkz . Doğal dil anlama.

Bu örnek hakkında

Beceri becerileriDialog örneği iki bota yönelik projeleri içerir:

  • Beceriyi kullanmak için beceri iletişim kutusu sınıfını kullanan iletişim kutusu kök botu.
  • Beceri tüketicilerinden gelen etkinlikleri işlemek için bir iletişim kutusu kullanan iletişim kutusu beceri botu. Bu beceri, çekirdek bot örneğinin bir uyarlamasıdır. (Çekirdek bot hakkında daha fazla bilgi için bkz . Botunuza doğal dil anlama ekleme.)

Bu makalede, birden çok eylemi yönetmek için beceri botu içindeki bir iletişim kutusunun nasıl kullanılacağına odaklanmaktadır.

Beceri tüketici botu hakkında bilgi için bkz. İletişim kutularını kullanarak beceri kullanma.

Kaynaklar

Dağıtılan botlar için bot-bot kimlik doğrulaması, katılan her bot için geçerli bir kimliğe sahip olmasını gerektirir. Ancak kimlik bilgileri olmadan Bot Framework Öykünücüsü ile becerileri ve beceri tüketicilerini yerel olarak test edebilirsiniz.

Beceriyi kullanıcıya yönelik botların kullanımına açmak için beceriyi Azure'a kaydedin. Daha fazla bilgi için bkz. Azure AI Bot Hizmeti ile bot kaydetme.

İsteğe bağlı olarak, beceri botu uçuş rezervasyonu LUIS modelini kullanabilir. Bu modeli kullanmak için CognitiveModels/FlightBooking.json dosyasını kullanarak LUIS modelini oluşturun, eğitin ve yayımlayın.

Uygulama yapılandırması

  1. İsteğe bağlı olarak, becerinin kimlik bilgilerini becerinin yapılandırma dosyasına ekleyin. (Beceri veya beceri tüketicisi bir kimlik belirtiyorsa, her ikisi de belirtmelidir.)

  2. LUIS modelini kullanıyorsanız LUIS uygulama kimliğini, API anahtarını ve API ana bilgisayar adını ekleyin.

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

Etkinlik yönlendirme mantığı

Beceri birkaç farklı özelliği destekler. Bir uçuş rezervasyonu yapabilir veya bir şehrin hava durumunu alabilir. Ayrıca, bu bağlamlardan herhangi birinin dışında bir ileti alırsa, iletiyi yorumlamayı denemek için LUIS kullanabilir. Becerinin bildiriminde bu eylemler, bunların giriş ve çıkış parametreleri ve becerinin uç noktaları açıklanır. Not: Beceri bir "BookFlight" veya "GetWeather" olayını işleyebilir. İleti etkinliklerini de işleyebilir.

Beceri, beceri tüketicisinden gelen ilk etkinliğe göre hangi eylemin başlatıldığını seçmek için kullandığı bir etkinlik yönlendirme iletişim kutusunu tanımlar. Sağlanırsa, LUIS modeli ilk iletide kitap uçuşu ve hava durumu alma amaçlarını tanıyabilir.

Kitap dağıtımı eylemi, ayrı bir iletişim kutusu olarak uygulanan çok adımlı bir işlemdir. Eylem başladıktan sonra, gelen etkinlikler bu iletişim kutusu tarafından işlenir. Hava durumu alma eylemi, tam olarak uygulanan bir botta değiştirilecek yer tutucu mantığına sahiptir.

Etkinlik yönlendirme iletişim kutusu şunların kodunu içerir:

Beceride kullanılan iletişim kutuları bileşen iletişim kutusundan devralır. Bileşen iletişim kutuları hakkında daha fazla bilgi için bkz. İletişim kutusu karmaşıklığını yönetme.

İletişim kutusunu başlatma

Etkinlik yönlendirme iletişim kutusu, uçuş rezervasyonu için bir alt iletişim kutusu içerir. Ana şelale iletişim kutusunda, alınan ilk etkinliğe göre bir eylem başlatacak bir adım vardır.

Ayrıca bir LUIS tanıyıcısı kabul eder. Bu tanıyıcı başlatılırsa, iletişim kutusu bunu ilk ileti etkinliğinin amacını yorumlamak için kullanır.

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

İlk etkinliği işleme

Ana şelale iletişim kutusunun ilk (ve yalnızca) adımında beceri, gelen etkinlik türünü denetler.

  • Olay etkinlikleri, olayın adına göre uygun eylemi başlatan bir olay etkinliği işleyicisine iletilir.
  • İleti etkinlikleri, ne yapacağına karar vermeden önce ek işlem gerçekleştiren bir ileti etkinliği işleyicisine iletilir.

Beceri gelen etkinliğin türünü veya olayın adını tanımıyorsa bir hata iletisi gönderir ve biter.

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

İleti etkinliklerini işleme

LUIS tanıyıcısı yapılandırıldıysa, beceri LUIS'i çağırır ve amaç temelinde bir eylem başlatır. LUIS tanıyıcı yapılandırılmadıysa veya amaç desteklenmiyorsa, beceri bir hata iletisi gönderir ve biter.

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

Çok adımlı eylem başlatma

Kitap dağıtımı eylemi, kullanıcıdan rezervasyon ayrıntılarını almak için çok adımlı bir iletişim kutusu başlatır.

Hava durumu alma eylemi uygulanmaz. Şu anda bir yer tutucu ileti gönderir ve ardından biter.

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

Sonuç döndürme

Beceri, kitap-uçuş eylemi için bir rezervasyon iletişim kutusu başlatır. Etkinlik yönlendirme iletişim kutusunun tek bir adımı olduğundan, rezervasyon iletişim kutusu sona erdiğinde etkinlik yönlendirme iletişim kutusu da sona erer ve rezervasyon iletişim kutusundan gelen iletişim kutusu, etkinlik yönlendirme iletişim kutusunun iletişim kutusu sonucu olur.

Hava durumu alma eylemi, bir dönüş değeri ayarlamadan biter.

Çok adımlı eylemi iptal etme

Rezervasyon iletişim kutusu ve alt tarih çözümleyici iletişim kutusu, kullanıcıdan gelen iletileri denetleyen temel iptal ve yardım iletişim kutusundan türetilir.

  • "yardım" veya "?" üzerinde bir yardım iletisi görüntüler ve ardından konuşma akışına aşağıdaki sırayla devam eder.
  • "İptal" veya "çık"da, beceriyi sona erdiren tüm iletişim kutularını iptal eder.

Daha fazla bilgi için bkz. Kullanıcı kesintilerini işleme.

Hizmet kaydı

Bu beceri için gereken hizmetler, genel olarak beceri botu için gereken hizmetlerle aynıdır. Gerekli hizmetlerle ilgili bir tartışma için nasıl beceri uygulayacaklarına bakın.

Beceri bildirimi

Beceri bildirimi, becerinin gerçekleştirebileceği etkinlikleri, giriş ve çıkış parametrelerini ve becerinin uç noktalarını açıklayan bir JSON dosyasıdır. Bildirim, beceriye başka bir bottan erişmek için ihtiyacınız olan bilgileri içerir.

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

Beceri bildirimi şeması , beceri bildiriminin şemasını açıklayan bir JSON dosyasıdır. En son şema sürümü v2.1'dir.

Beceri botunu test edin

Öykünücüdeki beceriyi beceri tüketicisiyle test edebilirsiniz. Bunu yapmak için hem beceri hem de beceri tüketici botlarını aynı anda çalıştırmanız gerekir. Beceriyi yapılandırma hakkında bilgi için bir beceriyi kullanmak için iletişim kutusunun nasıl kullanılacağını öğrenin.

En son Bot Framework Öykünücüsü'ne indirin ve yükleyin.

  1. İletişim kutusu beceri botunu ve iletişim kutusu kök botunu makinenizde yerel olarak çalıştırın. Yönergelere ihtiyacınız varsa C#, JavaScript, Java veya Python için örneğin README dosyasına bakın.
  2. Botu test etmek için Öykünücü'yü kullanın.
    • Konuşmaya ilk katıldığınızda bot bir karşılama iletisi görüntüler ve size hangi beceriyi çağırmak istediğinizi sorar. Bu örnek için beceri botunun tek bir becerisi vardır.
    • DialogSkillBot'ı seçin.
  3. Ardından bot, beceri için bir eylem seçmenizi ister. "BookFlight" öğesini seçin.
    1. Beceri, kitap-uçuş eylemine başlar; istemleri yanıtlayın.
    2. Beceri tamamlandığında kök bot, aramak istediğiniz beceriyi yeniden sormadan önce rezervasyon ayrıntılarını görüntüler.
  4. DialogSkillBot'ı yeniden ve "BookFlight" öğesini seçin.
    1. İlk istemi yanıtlayın, ardından eylemi iptal etmek için "iptal et" yazın.
    2. Beceri botu eylemi tamamlamadan sona erer ve tüketici çağırmak istediğiniz beceriyi ister.

Hata ayıklama hakkında daha fazla bilgi

Beceri ve beceri tüketicileri arasındaki trafiğin kimliği doğrulandığından, bu tür botlarda hata ayıklama sırasında ek adımlar vardır.

  • Beceri tüketicisi ve doğrudan veya dolaylı olarak tükettiği tüm beceriler çalışıyor olmalıdır.
  • Botlar yerel olarak çalışıyorsa ve botlardan herhangi birinin uygulama kimliği ve parolası varsa, tüm botların geçerli kimlikleri ve parolaları olmalıdır.
  • Botların tümü dağıtıldıysa ngrok kullanarak herhangi bir kanaldan bir botta hata ayıklamayı öğrenin.
  • Botlardan bazıları yerel olarak çalışıyorsa ve bazıları dağıtıldıysa, beceri veya beceri tüketicisinde hata ayıklamayı öğrenin.

Aksi takdirde, bir beceri tüketicisinde veya beceride, diğer botlarda hata ayıkladığınız gibi hata ayıklayabilirsiniz. Daha fazla bilgi için bkz. Botta hata ayıklama ve Bot Framework Öykünücüsü ile Hata Ayıklama.

Ek bilgi