Фреймворк для ботов - Адаптивный диалог

Я работаю с адаптивным диалогом фреймворка бота. У меня проблема с получением намерений и разрешенных сущностей при чтении данных luis с помощью распознавателя. получение только максимального результата в ответе путем чтения "turn.recognized" в дочернем адаптивном диалоговом окне. Я перенес свой luis на v3 и установил для свойства IncludeAllIntents значение true при вызове luis. я пропустил установку какого-либо свойства в LuisAdaptiveRecognizer.? Может ли кто-нибудь помочь мне решить эту проблему, потому что у меня есть сценарий для проверки второго лучшего результата в боте. Это проблема с адаптивным диалогом?

Я использовал Ms docs для создания адаптивного диалога бота.

И еще кое-что. Есть ли способ извлечь разрешенные объекты luis как тип RecognizerResult из результата turn.recognized.

Корневой диалог:

var rootDialog = new AdaptiveDialog(nameof(AdaptiveDialog))
{
    Recognizer = new LuisAdaptiveRecognizer()
    {
        ApplicationId = Configuration["LuisAppId"],
        EndpointKey = Configuration["LuisAPIKey"],
        Endpoint = Configuration["LuisAPIHostName"],
        PredictionOptions = new Microsoft.Bot.Builder.AI.LuisV3.LuisPredictionOptions
        {
            IncludeAllIntents = true,
            IncludeInstanceData = true,
            IncludeAPIResults = true,
            PreferExternalEntities = true,
            Slot = "producton"
        }
    },
    Triggers = new List<OnCondition>()
    {
         new OnIntent("Greetings")
        {
            Actions = new List<Dialog>()
            {
                new SendActivity("${HelpRootDialog()}")
            }
        },
    },

Дочерний диалог:

public FindLinks(IConfiguration configuration) : base(nameof(FindLinks))
{
    _configuration = configuration;
    this.LinksDialog = new AdaptiveDialog(nameof(FindLinks))
    {
        Triggers = new List<OnCondition>()
        {
            new OnBeginDialog()
            {
                Actions = new List<Dialog>()
                    {
                        new CodeAction(ResolveAndSendAnswer)
                    }
            },
        }
    };

    AddDialog(this._findLinksDialog);
    InitialDialogId = nameof(FindLinks);
}

private async Task<DialogTurnResult> ResolveAndSendAnswer(DialogContext dialogContext, System.Object options)
{
    JObject jObject;
    IList<string> queries = new List<string>();
    dialogContext.State.TryGetValue("turn.recognized", out jObject);

    ....This is how i resolved the luis data from the turn.
}

1 ответ

Решение

К сожалению, адаптивные диалоги предназначены для включения только одного намерения в turn.recognizedнезависимо от того, какой распознаватель вы используете. Вы можете увидеть это в исходном коде здесь:

result.Intents.Clear();
result.Intents.Add(topIntent, topScore);

Похоже, что единственное место, где можно получить доступ к другим интентам, - это ваша телеметрия. Итак, у вас есть несколько вариантов, хотя я знаю, что они не идеальны.

  1. Вызов конечной точки LUIS явно вместо того, чтобы полагаться на LuisAdaptiveRecognizer. Это можно сделать с помощью HTTP-запроса в качестве действия внутри адаптивного диалогового окна или вне диалогового окна.
  2. Загрузите дополнительные намерения из зарегистрированной телеметрии. Возможно, это будет проще всего, если вы создадите собственный клиент телеметрии, который сделает данные доступными в локальной памяти вашего бота.
  3. Сделайте запрос функции на GitHub, попросив их сделать все намерения доступными в адаптивных диалогах: https://github.com/microsoft/botbuilder-dotnet/issues/new/choose
Другие вопросы по тегам