首先,关于那个教程:
本文使用 Bot Framework v3 SDK。请参阅这篇 Bot Framework 文章,如果您对 Bot Framework v4 SDK 版本的此信息感兴趣。
它很旧并且使用 Bot Framework SDK 的 V3。我强烈推荐在 V4 中构建任何新的机器人。请改用添加自然语言理解教程。
InternalServerError
表示您的机器人代码在某个地方存在问题。
您可以尝试以下一些可能导致问题的方法:
编写处理 No Answer 的代码
官方QnAMaker 示例在这里执行此操作:
// Query QnAMaker for Answer
var response = await qnaMaker.GetAnswersAsync(turnContext);
// If we have an answer, send it to the user
if (response != null && response.Length > 0)
{
await turnContext.SendActivityAsync(MessageFactory.Text(response[0].Answer), cancellationToken);
}
// If we don't have an answer, tell that to the user
else
{
await turnContext.SendActivityAsync(MessageFactory.Text("No QnA Maker answers were found."), cancellationToken);
}
确保您的 QnAMaker 服务具有DefaultAnswer
如果您将机器人设置为从 QnAMaker 服务获取默认的非回答,这可能只是一个问题。
在Azure Portal > Resource Group > QnA App Service > Configuration
(注意:这不是您的机器人的应用服务;这是特定于 QnAMaker 的),确保DefaultAnswer
已设置:

调试
假设您的机器人实际上仅在没有找到 QnA 答案时才发生故障,那么这两件事应该是您唯一需要进行故障排除的事情。否则,这是调试机器人的方法:
视觉工作室/C#:
- 在 Visual Studio 中,按 F5 或单击运行您的机器人:

在模拟器中打开你的机器人
在 Visual Studio 中,转到Debug > Windows > Exception Settings
:

- 在 Exception Settings 窗口中,全选“Common Language Runtime Exceptions”

- 在模拟器中,做让你的机器人崩溃的事情。出现错误时,机器人应自动停止。在这里,我强迫了一个:

如您所见,它说System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
这意味着我的数组response
没有第一个0
元素,因为没有返回任何答案。
其他问题将显示其他错误。如果您需要更多详细信息,您通常可以通过阅读错误详细信息并在网络上搜索错误代码来相当容易地查明问题。
VS 代码
- 在 VS Code 中,通过按 F5 并选择“Node.js”(适用于 Node/TypeScript 机器人)或
.NET Core
(适用于 C# 机器人)来运行您的机器人:

在模拟器中打开你的机器人
在 VS Code 中,打开调试菜单:

- 在“BREAKPOINTS”下,选中“All Exceptions”(注意:在选中此框之前运行您的机器人很重要,因为在机器人启动时会发生正常异常):

- 在模拟器中,做让你的机器人崩溃的事情。出现错误时,机器人应自动停止。在这里,我强迫了一个:

如您所见,它说Exception has occurred: TypeError TypeError: Cannot read property 'answer' of undefined
这意味着qnaResults[0]
未定义或不存在,这表明没有返回任何答案。
其他问题将显示其他错误。如果您需要更多详细信息,您通常可以通过阅读错误详细信息并在网络上搜索错误代码来相当容易地查明问题。