Ошибка перечисления Luis Skill Recognizer - необходимо обновить файлы .luis и .qna с изменениями

У меня есть виртуальный помощник, который передает управление навыкам базы знаний, использующим QnA maker. В конечном итоге у меня будет несколько баз знаний QnA, но прямо сейчас я столкнулся с проблемой, заставляющей работать первую. Я создал / отредактировал, обучил и опубликовал / выпустил базу знаний QnA maker KB, модель навыков Луиса из базы знаний и модель диспетчеризации Virtual Assistant.

Исключение создается после успешной отправки навыка, когда модель Луиса моей базы знаний возвращает намерение. У меня есть оператор switch, который в конечном итоге будет указывать на базу знаний, соответствующую вопросу пользователя.

text: "Exception Message: Could not convert string 'helpdesk_faq' to dictionary key type
'Luis.KnowledgeBaseSkillLuis+Intent'. Create a TypeConverter to convert 
from the string to the key type object.

Я обновил свое KnowledgeBaseSkillLuis.cs перечисление намерений, указав имя нового намерения (показано ниже), но мне интересно, не нужно ли мне этого делать. Я заметил, что в моих файлах KnowledgeBaseSkill.luis и Faq.qna нет обновленных изменений; что подводит меня к моему вопросу -

Как перенести обновленные модели в мою локальную среду? Нужно ли мне запускать команду botskills или dispatch, чтобы вставить недавно опубликованные намерения в код, или я был прав, вручную обновив перечисление намерений с помощью моего нового навыка? Нужно ли мне повторно публиковать Ассистента и / или Навык с моего локального компьютера в Azure, чтобы получить их?

Я читал эти статьи, но изо всех сил пытаюсь их использовать:

// Full file included lower in the post
public enum Intent
{
    Sample,
    q_Faq,
    helpdesk_faq, // Newly created intent (others were auto generated with Deploy scripts provided in skill template
    None
};

MainDialog.cs:

...
switch (intent)
{
    case KnowledgeBaseSkillLuis.Intent.Sample:
        {
            await innerDc.BeginDialogAsync(_sampleDialog.Id);
            break;
        }
    case KnowledgeBaseSkillLuis.Intent.helpdesk_faq:
        {
            cognitiveModels.QnAServices.TryGetValue("Faq", out var qnaService); // "Faq" is the name of the QnA maker knowledge base. 

            if (qnaService == null)
            {
                await innerDc.Context.SendActivityAsync("I'm having issues looking up the information for you.");
                throw new Exception("QnA Maker Service could not be found in the Bot Services Configuration."); 
            }
            else
            {
                var answers = await qnaService.GetAnswersAsync(innerDc.Context, null, null);

                if (answers != null && answers.Count() > 0)
                {
                    await innerDc.Context.SendActivityAsync(answers[0].Answer);
                }
                else
                {
                    await innerDc.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale("ConfusedMessage"));
                }
            }
            break;
        }
    case KnowledgeBaseSkillLuis.Intent.None:
    default:
        {
            // intent was identified but not yet implemented
            await innerDc.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale("UnsupportedMessage"));
            break;
        }
}
...

KnowledgeBaseSkillLuis.cs:

 public class KnowledgeBaseSkillLuis : IRecognizerConvert
{
    public string Text;
    public string AlteredText;
    public enum Intent
    {
        Sample,
        q_Faq,
        helpdesk_faq,
        None
    };
    public Dictionary<Intent, IntentScore> Intents;

    public class _Entities
    {

        // Instance
        public class _Instance
        {
        }
        [JsonProperty("$instance")]
        public _Instance _instance;
    }
    public _Entities Entities;

    [JsonExtensionData(ReadData = true, WriteData = true)]
    public IDictionary<string, object> Properties { get; set; }

    public void Convert(dynamic result)
    {
        var app = JsonConvert.DeserializeObject<KnowledgeBaseSkillLuis>(JsonConvert.SerializeObject(result));
        Text = app.Text;
        AlteredText = app.AlteredText;
        Intents = app.Intents;
        Entities = app.Entities;
        Properties = app.Properties;
    }

    public (Intent intent, double score) TopIntent()
    {
        Intent maxIntent = Intent.None;
        var max = 0.0;
        foreach (var entry in Intents)
        {
            if (entry.Value.Score > max)
            {
                maxIntent = entry.Key;
                max = entry.Value.Score.Value;
            }
        }
        return (maxIntent, max);
    }
}

person Roy    schedule 26.11.2019    source источник


Ответы (1)


LUISGen - это инструмент, который создает / обновляет класс распознавателя (KnowledgeBaseSkillLuis) в вашем случае.

Как перенести обновленные модели в мою локальную среду? Нужно ли мне запускать команду botskills или dispatch, чтобы вставить недавно опубликованные намерения в код, или я был прав, вручную обновив перечисление намерений с помощью моего нового навыка?

Вы должны использовать сценарий update_cognitive_models.ps1 (в папке Deployments\Scripts) с переключателем RemoteToLocal. Это обновит онлайн-модели до локальных файлов.

Нужно ли мне повторно публиковать Ассистента и / или Навык с моего локального компьютера в Azure, чтобы получить их?

Вы должны повторно опубликовать новый код (для обновленного KnowledgeBaseSkillLuis) после того, как он будет обновлен скриптом.

Больше информации:

https://microsoft.github.io/botframework-solutions/virtual-assistant/handbook/deployment-scripts/#scripts

https://microsoft.github.io/botframework-solutions/virtual-assistant/handbook/devops/

person Dana V    schedule 02.12.2019