【问题标题】:How do identify if the reply is user input or suggest action click - Bot Framework如何识别回复是用户输入还是建议操作点击 - Bot Framework
【发布时间】:2020-04-21 12:42:18
【问题描述】:

我们使用 BotFramework V4 和 C# (.Net Core) 在我们的组织中构建了一个 QnA 机器人供内部使用。 我们还想使用 Bing 拼写检查来修复问题中的拼写错误。

但“更正”在一些多轮对话中会造成麻烦:Bing 拼写检查可能会取代缩写和特殊术语,然后 QnA 服务可能无法捕捉到正确的问题和答案。

我们以教程中的例子为例,使用CardAction提示相关问题:

foreach (var prompt in result.Context.Prompts) {
    buttonList.Add(
        new CardAction()
        {
            Value = prompt.DisplayText,
            Type = ActionTypes.ImBack,
            Title = prompt.DisplayText,
        });
}

以下是在 Microsoft Teams 上使用机器人时的示例(法语):

我的问题是: 如何确定消息是否来自用户单击建议按钮(例如,获取对象CardAction 及其属性Type)? 我查看了OnMessageActivityAsync 方法中提供的turnContext 参数。但什么也没找到。

我想直接对用户输入应用 Bing 拼写检查,但不适用于建议操作。

谢谢。 (附注)我发现了一个与 botframework v3 类似的问题,但没有接受答案,我正在使用 v4。

【问题讨论】:

    标签: c# botframework chatbot microsoft-teams qnamaker


    【解决方案1】:

    在诸如 Teams 之类的频道中,有一个不同于 postBackmessageBack 的特定 imBack 操作类型,通常无法区分传入的 imBack 操作和输入的消息。

    要获得所需的行为,您应该使用postBackmessageBack。它们在 Teams 中的工作方式彼此相同,但 messageBack 将更好地传达您的意图。这个想法是,您将在从用户到机器人的同一条消息中发送可见文本和不可见元数据。

    foreach (var prompt in result.Context.Prompts) {
        buttonList.Add(
            new CardAction()
            {
                Type = ActionTypes.MessageBack,
                Value = new { source = "button" },
                Title = prompt.DisplayText,
                Text = prompt.DisplayText,
                DisplayText = prompt.DisplayText,
            });
    }
    

    为什么我们在这里使用prompt.DisplayText 三次?标题显示为按钮上的标签,文本填充活动的Text 属性,显示文本是对话中呈现的内容。

    在 Teams 中,postBackmessageBackValue 属性必须是对象而不是字符串。如果你试图说Value = "button",那么你会在传入的活动中得到一个空对象。由于操作的Value 属性填充了活动的Value 属性,因此您可以判断传入的活动是否来自如下按钮:

    if (turnContext.Activity.Value != null
        && JToken.FromObject(turnContext.Activity.Value) is JObject value
        && value["source"] == "button")
    

    由于到目前为止我的测试表明键入的消息永远不会填充Value 属性,因此您可以将检查简化为:

    if (turnContext.Activity.Value != null)
    

    请注意,此答案仅适用于团队。有不同的规则来确定活动是否来自不同频道上的按钮,并且这些规则目前没有记录在任何地方。如果你有兴趣,I have written a method for my cards library that accomplishes the task of determining if an activity came from a button on any channel。库发布后,您可以调用该方法并查看它是否返回 null。

    【讨论】:

    • 感谢您的详细解释。实际上,机器人是供内部使用的,我们只会使用 Teams 作为渠道。也许稍后会用于 Web 和 DirectLine,因为它与 Web 应用程序集成。期待那个卡片库。我尝试了建议的方法,它对我有用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多