首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示QnAMaker后续提示的文本

显示QnAMaker后续提示的文本
EN

Stack Overflow用户
提问于 2019-10-02 21:57:35
回答 1查看 1K关注 0票数 3

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

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

我对此理解正确了吗?我认为文档并没有把这一点说清楚...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 06:09:50

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

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

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

代码语言:javascript
复制
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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58203069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档