azure-language-understanding - 如何拥有多个相同问题但答案不同的常见问题解答(KB)?
问题描述
我无法保留聊天机器人对话的上下文(FAQ)。
我已经根据此文档成功集成了 LUIS+QnAmaker。 https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/tutorials/integrate-qnamaker-luis
我有大约 3 KB 包含相同的问题但不同的答案。聊天机器人应该能够过滤到所需的常见问题解答,并且以下答案应该来自用户选择的常见问题解答。目前,它只返回答案的第一个 KB,除非我以这种方式表达我的问题:我可以得到 FAQ1 的答案吗?或者我可以得到FAQ2的答案吗?
希望我能在这里得到社区的一些帮助。谢谢!
解决方案
当您使用具有相同问题的多个 KB 时,您可以通过将不同的元数据添加到您的问题/答案集中来隔离答案。元数据只是名称/值对的集合。使用 QnAMakerDialog 时,您可以设置过滤或提升元数据,这将作为任何查询的一部分传递给 QnA Maker 服务。
您可以创建 QnA Maker 对话框并将单个名称/值元数据对添加到对话框上的 MetadataFilter 属性。这将导致对话框仅接收标记有相同名称/值元数据的答案。
消息控制器:
public class MessagesController : ApiController
{
internal static IDialog<object> MakeRoot()
{
var qnaDialog = new Dialogs.MyQnADialog
{
MetadataFilter = new List<Metadata>()
{
new Metadata()
{
Name = "knowledgeBase",
Value = "kb1"
}
}
};
return qnaDialog;
}
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, MakeRoot);
}
else
{
HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
}
同样,如果要使用其他知识库,可以传递其他元数据名称/值对。例如,{ Name="knowledgeBase",Value="kb2" }
QnAMAker 对话框:
[QnAMakerService("https://xxxx.azurewebsites.net/qnamaker/", "{EndpointKey_here}", "{KnowledgeBaseId_here}",1)]
public class MyQnADialog : QnAMakerDialog<object>
{
public override async Task NoMatchHandler(IDialogContext context, string originalQueryText)
{
await context.PostAsync($"Sorry, I couldn't find an answer for '{originalQueryText}'.");
context.Done(false);
}
public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
{
if (result.Answers.FirstOrDefault().Score > 80)
{
await context.PostAsync($"I found {result.Answers.Length} answer(s) that might help...{result.Answers.First().Answer}.");
}
else
{
await context.PostAsync($"Sorry, I couldn't find an answer for '{originalQueryText}'.");
}
context.Done(true);
}
}
当您对其进行测试时,结果将如下所示:
- 有知识库:kb1
- 有知识库:kb2
希望这可以帮助!!!
推荐阅读
- graphdb - 未在 graphdb 中计算的面积
- css - 背景指南不适用于子菜单
- amazon-dynamodb - 使用 .Net Core API 的 DynamoDB 子项过滤器
- python - Discord.py - 如何使用此人的 ID 向某人发送私人消息?
- php - 使用 API Token 认证的 Laravel 限速 API
- sql - 从给定数据库中选择所有表时,如何将 [dbo] 前缀附加到表名?
- powershell - foreach 循环中的 where 语句,比较日期
- c++ - 2>链接:致命错误LNK1104:无法打开文件'dxerr.lib'
- java - 我的应用程序在单击按钮开始活动时崩溃,但在模拟器中工作
- java - 将 spring 1.2 升级到 spring 4.3.9 后事务回滚异常