L. В полном объеме, если вы следовали инструкциям на портале Azure для создания бота QnA из шаблона , вам потребуется немного настроить код, чтобы он работал локально, и, в свою очередь, работать в эмуляторе.
После того, как вы создали своего бота, используя шаблон (что звучит так, как вы это сделали), в ABS перейдите к Build (в разделе «Управление ботами»)> " Скачайте zip-файл ", вы получите копию своего проекта локально.
Если вы посмотрите на шаблон Bot-кода, он работает в Azure, потому что, в итоге, он получает доступ к вашим учетным данным QnA в настройках вашего приложения на портале Azure, но локально вам нужно будет поместить учетные данные где-то, как ваше. файл конфигурации.
В конечном счете, теперь нам нужно подключить ваши учетные данные QnA в файл .config вашего проекта, поскольку он не загружается автоматически в код при загрузке zip-файла.
Ниже я просто использую бота QnA Template, который вы можете найти на портале Azure (Создать ресурс> AI + Машинное обучение> Бот веб-приложения с шаблоном бота «Вопрос и ответ»)
В Web.config добавить пары ключ-значение для AzureWebJobsStorage (если используется), QnAAuthKey, QnAKnowledgebaseId и QnAEndpointHostName
Ваши собственные учетные значения можно найти в Настройки приложения портала Azure
<appSettings>
<!-- update these with your Microsoft App Id and your Microsoft App Password-->
<add key="MicrosoftAppId" value="" />
<add key="MicrosoftAppPassword" value="" />
<add key="AzureWebJobsStorage" value="DefaultEndpointsProtocol=https...."/>
<add key="QnAAuthKey" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
<add key="QnAKnowledgebaseId" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" />
<add key="QnAEndpointHostName" value="https://YOURQNA.azurewebsites.net/qnamaker" />
<add key="QnASubscriptionKey" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
</appSettings>
В вашем диалоге (шаблон QnA по состоянию на 7/5/18 имеет файл диалога по умолчанию с именем BasicQnAMakerDialog.cs), вместо Utils (по умолчанию в шаблон), мы будем использовать ConfigurationManager.AppSettings ["KeyName"] для доступа к значениям, которые вы только что поместили в свой Web.config :
Ниже вы можете видеть, что я изменил (закомментировал) переменные в шаблоне QnA для получения значений с помощью ConfigurationManager.AppSettings. Вам также может потребоваться изменить переменные в вашем операторе if, в зависимости от логики, необходимой вашему приложению.
In Root Dialog
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result as Activity;
// OLD
//var qnaAuthKey = GetSetting("QnAAuthKey");
//var qnaKBId = Utils.GetAppSetting("QnAKnowledgebaseId");
//var endpointHostName = Utils.GetAppSetting("QnAEndpointHostName");
// NEW
var qnaAuthKey = ConfigurationManager.AppSettings["QnAAuthKey"];
var qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
var endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];
// QnA Subscription Key and KnowledgeBase Id null verification
if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
{
// Forward to the appropriate Dialog based on whether the endpoint hostname is present
if (string.IsNullOrEmpty(endpointHostName))
await context.Forward(new BasicQnAMakerPreviewDialog(), AfterAnswerAsync, message, CancellationToken.None);
else
await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
}
else
{
await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
}
}
- В дочерних диалогах, которые вызываются вашим корнем (например, BasicQnAMakerDialog), обязательно замените все, что вызывает ключ QnA, на ConfigurationManager.AppSettings ["KeyName"] .
Например, в BasicQnAMakerDialog:
[Serializable]
public class BasicQnAMakerDialog : QnAMakerDialog
{
static readonly string qnaAuthKey = ConfigurationManager.AppSettings["QnAAuthKey"];
static readonly string qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
static readonly string endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];
public BasicQnAMakerDialog() : base(new QnAMakerService(
new QnAMakerAttribute
(
qnaAuthKey,
qnaKBId,
"No good match in FAQ.",
0.5,
1,
endpointHostName
)))
{
}
}