为 QnAMaker 后续提示显示文本

Geo*_*per 3 microsoft-cognitive azure-cognitive-services azure-qna-maker

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

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

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

Kyl*_*ney 5

Multi-turn QnA Maker 对话仍处于预览阶段,目前没有 SDK 可以帮助您构建一个知道如何与后续提示 API 交互的机器人。您最终拥有控制权,因此您可以让机器人按照自己的意愿处理显示文本。所有“显示文本”都是您插入到知识库中的答案中的值,以便在调用generateAnswer.

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

请记住,在进行后续提示时,您指定的不仅仅是显示文本。您还可以链接到特定的 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有关多轮对话的更多信息,请参阅此答案