У меня есть виртуальный помощник, который передает управление навыкам базы знаний, использующим 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, чтобы получить их?
Я читал эти статьи, но изо всех сил пытаюсь их использовать:
- Использование нескольких моделей LUIS и QnA
- Добавить NLP к своему боту
- Используйте QnA Maker, чтобы отвечать на вопросы
// 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);
}
}