【问题标题】:Display Text for QnAMaker follow-on prompts显示 QnAMaker 后续提示的文本
【发布时间】:2020-01-31 19:47:40
【问题描述】:

我尝试在 QnAMaker 中使用后续提示,但对“后续提示”创建对话框中标记为“显示文本”的字段的用途感到困惑。 https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/multiturn-conversation 将此字段描述为“在后续提示中显示的自定义文本。”。对我来说,这表明它只是后续提示的标签,通常呈现为按钮。因此,我假设文本除了作为标签之外没有其他用途,并且按钮将直接链接到所选的问题/答案对。但是,通过使用 QnAMaker 知识库进行试验,似乎“显示文本”实际上已传递给 QnAMaker 服务,并且此文本用于搜索答案。这意味着必须选择“显示文本”值来标记按钮并成功找到后续答案。

这意味着我不能使用简短的后续提示,例如“我该如何付款?”或“我如何加入它?”其中主要的 Q/A 对与各种服务之一相关,因为这些字符串不会可靠地返回预期的答案。相反,提示必须是更详细的“我如何为服务 A 付费”和“我如何加入服务 A”。

我是否理解正确?我认为文档根本没有说明这一点......

【问题讨论】:

  • 我的回答可以接受吗?

标签: microsoft-cognitive azure-cognitive-services qnamaker


【解决方案1】:

多轮 QnA Maker 对话仍处于预览阶段,目前没有 SDK 可帮助您构建知道如何与后续提示 API 交互的机器人。您最终处于控制之中,因此您可以让您的机器人随心所欲地处理显示文本。所有“显示文本”都是您在知识库中插入答案的值,以便在调用 generateAnswer 后与答案一起返回。

让您的显示文本与您链接到的问题的文本相匹配会非常有帮助,因为这样提示的显示文本可用于访问正确的后续 QnA 对,只要包含上下文在 API 调用中。这就是this sample 中发生的事情。听起来您希望在不让提示的显示文本与后续问题的文本匹配的情况下使其工作。这可能会很棘手,但您可以这样做。

请记住,在进行后续提示时,您指定的不仅仅是显示文本。您还可以链接到特定的 QnA 对。这允许 API 将该 QnA ID 与显示文本一起返回给您。您尚未提及您的机器人所针对的频道,但如果您使用的频道支持 postBackmessageBack 操作,那么您可以将 QnA ID 不可见地传递给您的机器人,然后您的机器人可以使用它来访问答案。如果你走这条路,你甚至可能不需要担心对话框或状态。你也没有提到你用什么语言编写你的机器人,但这里有一个如何在 Node.js 中实现的例子:

async testQnAMaker(turnContext) {
    var qna = new QnAMaker({
        knowledgeBaseId: '<GUID>',
        endpointKey: '<GUID>',
        host: 'https://<APPNAME>.azurewebsites.net/qnamaker'
    });

    var value = turnContext.activity.value;
    var qnaId = value && value.qnaId;
    // qnaId will be undefined if value is empty
    var results = await qna.getAnswers(turnContext, { qnaId });
    var firstResult = results[0];

    if (firstResult) {
        var answer = firstResult.answer;
        var resultContext = firstResult.context;
        var prompts = resultContext && resultContext.prompts;

        if (prompts && prompts.length) {
            var card = CardFactory.heroCard(
                answer,
                [],
                prompts.map(prompt => ({
                    type: 'messageBack',
                    title: prompt.displayText,
                    displayText: prompt.displayText,
                    text: prompt.displayText,
                    value: { qnaId: prompt.qnaId }
                }))
            );

            answer = MessageFactory.attachment(card);
        }

        await turnContext.sendActivity(answer);
    } else {
        await turnContext.sendActivity("I can't answer that");
    }
}

请注意,这确实有一些限制。因为它通过从活动的 value 属性中检索 QnA ID 来工作,所以如果用户手动键入按钮的文本而不是单击按钮,它可能无法找到正确的 QnA 对。

如果您想在不依赖 QnA ID 的情况下让显示文本独立工作,您可以保存自己的映射,以便您的机器人知道哪些显示文本值对应于每个上下文中的每个 QnA ID。但是,您也可以考虑仅添加显示文本作为 QnA 对中问题的替代措辞。因此,“我如何为服务 A 付款”和“我如何为服务 B 付款”都可以将“我如何为它付款”作为问题的一种形式。由于您现在在多个 QnA 对中存在重复的短语,因此您需要将调用中的上下文传递给 generateAnswer 以使其正常工作。

有关多轮对话的更多信息,请参阅this answer

【讨论】:

  • 我能够在 C# 中以 MS Teams 作为渠道,使用此答案作为指南。捕获和使用 qnaid 来检索后续数据很好地解决了当前 SDK 对此功能缺乏支持的问题。
猜你喜欢
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多