【问题标题】:How to add QnA Maker to the CoreBot Sample如何将 QnA Maker 添加到 CoreBot 示例
【发布时间】:2020-04-20 09:34:27
【问题描述】:

我正在开发一个基于 C# Core-Bot 示例的机器人。

如何添加 QnA Maker 实例?如果 Intent 为“none”,则应调用它。

谢谢

编辑:

 switch (topIntent)
        {
            case "None":
                //connect with QnA Maker
                return await stepContext.BeginDialogAsync(nameof(QnADialog), topIntent, cancellationToken);

QnADialog 应该是什么样子?

【问题讨论】:

    标签: c# botframework chatbot azure-language-understanding qnamaker


    【解决方案1】:

    您是否在 core-bot 中遇到特定问题?如果您可以分享一些代码并为您正在尝试做的事情添加更多方向,我们也许可以给出更具体的答案。

    我正在使用类似的功能,并且基于 Dispatch Bot Sample(nodejs 但也应该有 C# 版本)。本质上,如果 Intent 为 None,您只需让它调用您的 QnA Maker 函数。或者实际上,您可以创建一个默认案例,它将获取 None 以及您未明确定义的任何其他意图。

    上面链接的示例调用本地函数,但您可以轻松调用 QnA Maker 对话框或使用任何其他方法为该默认情况调用 QnA Maker。基本上任何调用 QnA Maker 的样本都可以插入那里。实际上,我不久前将我的函数调用交换为使用 Prompts 示例调用实验性 QnA Maker 的帮助器,该示例被称为对话框,因此我可以确认这两种方法都有效。

    编辑: 在 nodejs 中,我在 switch 语句中调用对话框。由于我设置它的方式,我需要做一些额外的处理来发送实际的活动。正如我所指出的,这是基于带有提示示例的实验性 QnA Maker。

    default:
        var processResult = await this.qnaDialog.processAsync(userDialog.qnaState, context.activity);
        userDialog.qnaState = processResult[0];
        await this.userDialogStateAccessor.set(context,userDialog);
        var output = processResult[1];
        await dc.context.sendActivity(output);      
        break;
    

    【讨论】:

    • 我看到了你提到的样本。但我从 CoreBot 示例开始。代码/类完全不同。 QnA 对话框长什么样子(return await stepContext.BeginDialogAsync(nameof(QnADialog), CatchedIntent, cancelToken);)?
    • 我看到您使用的是 C#,所以我不能准确地说。但我会将我对 QnA Dialog 的调用添加到我在 nodejs 中的答案中,希望这会有所帮助。
    • 您是否也可以从您的 qnaDialog 添加代码?查看我上面的代码。我不知道 QnA 对话框应该是什么样子。我只想将我的 QnA Maker (Chitchat) 连接到 Intent “None”。
    • 如果您只想要闲聊并且您不必担心提示,您可以在不调用对话框的情况下执行此操作。为了清楚起见,我想我会为此创建一个单独的答案,但请留下这个,因为有一些额外的信息可能对其他人有帮助。
    【解决方案2】:

    随着仅为聊天数据库创建 QnA Maker 连接器的更新范围,为了清楚起见,我创建了一个单独的答案。有关从您的机器人调用 QnA Maker 的选项的更多信息,请查看其他答案。

    首先,您需要创建连接器/识别器。您可以直接调用 API,但这要容易得多。然后只需在您的 switch 语句中调用识别器。就我个人而言,我一直在这里而不是在 QnA Maker 服务上设置默认消息,但这取决于你。

    const { QnAMaker } = require('botbuilder-ai');
    
    constructor() {
        this.qnaRecognizer = new QnAMaker({
            knowledgeBaseId: process.env.kbid,
            endpointKey: process.env.endpointKey,
            host: process.env.hostname
        });
    }
    
    // <<LUIS call and other code here>>
    
    switch (topIntent) {
        case "None":
            //connect with QnA Maker
            // Set value for number of answers and confidence threshold, e.g. 1, 0.5
            const qnaResult = await this.qnaRecognizer.generateAnswer(context.activity.text, QNA_TOP_N, QNA_CONFIDENCE_THRESHOLD);
            if (!qnaResult || qnaResult.length === 0 || !qnaResult[0].answer) {
                await turnContext.sendActivity(`I'm sorry, I don't know how to help with that.`);
            } else {
                await context.sendActivity(qnaResult[0].answer);
            }
        break;
    }
    

    如果你愿意,我也可以分享一个对话示例,但我的要复杂得多(对话有两个嵌套调用,一个用于业务知识库,第二个用于闲聊,这些调用在单独的帮助程序中处理直接调用 API 而不是使用连接器/识别器的函数)。我认为这应该足以满足您的需求。

    【讨论】:

    • 谢谢,我将外包我的 QnA Maker,在 MainDialog 中使用它。听起来并不那么容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多