显示 QnAMaker 后续提示的文本

Display Text for QnAMaker follow-on prompts

我正在尝试在 QnAMaker 中使用后续提示,但对 "Follow-up prompt" 创建对话框中标记为 "Display text" 的字段的用途感到困惑。 https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/multiturn-conversation 将此字段描述为 "The custom text to display in the follow-up prompt."。对我来说,这表明它只是后续提示的标签,通常呈现为按钮。因此,我假设该文本除了作为标签外没有其他用途,并且该按钮将直接链接到所选的问题/答案对。然而,从 QnAMaker 知识库的实验来看,"Display text" 似乎实际上传递给了 QnAMaker 服务,并且此文本用于搜索答案。这意味着必须选择 "Display text" 值,以便标记按钮和成功找到后续答案。

这意味着我不能使用简短的后续提示,例如 "How do I pay for it?" 或 "How do I join it?",其中主要的 Q/A 对与各种服务之一相关,因为这些字符串不会可靠地 return 预期的答案。相反,提示必须更详细 "How do I pay for service A" 和 "How do I join service A".

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

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

让您的显示文本与您link要回答的问题的文本相匹配会非常有帮助,因为这样提示的显示文本可用于访问正确的后续 QnA 对,只要上下文包含在 API 调用中。这就是 this sample 中发生的事情。听起来您想在提示的显示文本不与后续问题的文本匹配的情况下让它工作。这可能会变得棘手,但您可以做一些事情。

请记住,在进行后续提示时,您指定的不仅仅是显示文本。您还 link 到特定的 QnA 对。这允许 API 到 return 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");
    }
}

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

如果您想让显示文本独立工作而不依赖于 QnA ID,您可以保存自己的映射,以便您的机器人知道在每个上下文中哪些显示文本值对应于每个 QnA ID。但是,您也可以考虑只添加显示文本作为 QnA 对中问题的替代措辞。因此 "How do I pay for service A" 和 "How do I pay for service B" 都可以将 "How do I pay for it" 作为问题的一种形式。因为您现在将在多个 QnA 对中有重复的措辞,所以您需要将调用中的上下文传递给 generateAnswer 才能正常工作。

有关多轮对话的详细信息,请参阅