【问题标题】:When Published in MS Teams Channel, the Chat Bot Name is getting included in the user utterance thus providing incorrect utterance to LUIS在 MS Teams 频道中发布时,聊天机器人名称将包含在用户话语中,从而向 LUIS 提供不正确的话语
【发布时间】:2020-02-05 17:16:53
【问题描述】:

enter image description here 我们在使用 Azure 上托管的 Microsoft Botframework V4 开发聊天机器人时遇到了问题。聊天在 MS Teams 频道中发布时会出现问题,但相同的聊天机器人在 MS Teams 私人聊天甚至网络聊天上都可以正常工作,即都指向 Azure 上的相同 Microsoft APP ID。

来自 MS Teams 频道:

当用户从 MS Teams 频道内与 ChatBot 聊天时,ChatBot 会收到错误的用户话语。

错误:###

 如屏幕截图所示,用户键入“hi”,聊天机器人从聊天步骤上下文 (stepContext.Context.Activity.Text) 返回文本“VA Check ID Bothi”。这是不正确的,因为机器人名称“VA Check ID Bot”被包含在用户话语中。 • 因此,不正确的意图被 LUIS 识别,即“帮助”意图。

 一个简单的 echo Bot 在 Teams 频道中发布时也有同样的问题,但在 MS Teams 私人聊天中可以正常工作。

来自 Teams 内的私人聊天

o 当用户从 MS Teams 的私人聊天中与同一个聊天机器人聊天时,聊天机器人会获得正确的用户话语。 o 如您在屏幕截图中所见,用户键入“hi”,聊天机器人从聊天步骤上下文 (stepContext.Context.Activity.Text) 返回相同的文本“hi”。这是正确的。

 因此,正确的 Intent 被 LUIS 识别,即“问候” Intent。

由于在 MS Azure 上托管具有相同 MS APP ID 的相同聊天机器人,因此在 MS Teams 私人聊天或 MS 团队频道中使用时,聊天机器人的行为应该相同。

聊天机器人在 Azure 门户上的网络聊天中也能正常工作

【问题讨论】:

    标签: c# botframework microsoft-teams


    【解决方案1】:

    是的,这是 Microsoft Teams 中长期以来的工作行为。

    我们所做的是添加一个基本上检查activity.ChannelId 的MicrosoftTeamsMiddleware,如果是msteams,则替换activity.Text 中的机器人名称。

    您可以访问活动,因为中间件收到了 ITurnContext。管道的其余部分可以看到对此活动的修改,因此一切顺利,机器人的其余部分不知道此问题。

    我建议您检查/记录活动文本,因为在我们的例子中它类似于<at>Bot Name</at>。所以你需要用一个空字符串替换所有这些。

    如果您还使用中间件查询 LUIS,请确保在 LUIS 中间件之前注册此新中间件,以便在 LUIS 中间件起作用之前,activity.Text 正常。

    【讨论】:

    • 修复无效,Luis 继续发送不正确的 Intent,即使我们成功替换了用户 uttrance 中的机器人名称: public class TeamsUttranceObserver : IMiddleware { public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate接下来,CancellationToken cancelToken ) { if (turnContext.Activity.ChannelId.Equals("msteams")) turnContext.Activity.Text = turnContext.Activity.Text.Replace("RPA Chat Bot", ""); } }
    • Andre 提供的解决方案部分完成了工作,它从话语中删除了 Bot 名称,但不知何故 > 仍保留在文本中。因此,我不得不添加包含尖括号的话语 LUIS
    【解决方案2】:

    您可以使用像 Andre 建议的中间件,但我只是直接对每个活动的 activity.text 进行了正则表达式替换。你会看到来自团队的标签,但我也覆盖了@以防万一。以下是我介绍的场景:

    • 提及以 @ 或 <at> 开头(可选检查尾随 </at>
    • 提及使用机器人短名称(例如 YourBot)
    • 提及使用机器人长名称(例如您的机器人长名称)
    • 提及可能后跟一个空格(可能不会)

    这是我的代码。我正在使用 nodejs,这个机器人使用了一个较旧的 4.3 模板作为 core_bot,但类似的方法应该适用于 C# 和其他 SDK 版本。

    async onTurn(context) {
        if (context.activity.type === ActivityTypes.Message) {
            context._activity.text = context._activity.text.replace(/(@|<at>)((YourBot)|(Your Bot Long Name))(<\/at>)? ?/g, '');
    
            const results = await this.luisRecognizer.recognize(context);
    

    这涵盖了上述所有场景。由于我在调用 LUIS 识别器和/或 QnA Maker 之前在回合开始时执行此操作,因此发送到这些服务的文本不包含提及。

    【讨论】:

    • 我更改了 stepContext.Context.Activity.Text = stepContext.Context.Activity.Text.Replace("RPA Chat Bot", "") 但是,LUIS 仍然以某种方式返回了错误的意图。 .这是否意味着,仅仅替换“stepContext.Context.Activity.Text”是行不通的,我们必须替换上下文对象中其他一些属性的值?我附上代码的屏幕截图..
    • 您能否在 LUIS 中签入“hi”并查看返回的内容?对屏幕截图中意图的置信度非常低,因此可能是最高得分的意图。为了处理低置信度意图,如果置信度低于 0.5,我将用“无”替换 topIntent。您在返回识别器结果之后和在 topIntent 上切换大小写之前执行此操作(或者您正在对结果中的意图信息进行操作)。
    • Andre 提供的解决方案完成了部分工作,它从话语中删除了 Bot 名称,但不知何故 > 仍保留在文本中。因此,我不得不添加包含尖括号的话语 LUIS
    • 如果你想尝试一下,我上面提到的正则表达式确实会处理括号。
    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2021-01-22
    相关资源
    最近更新 更多