了解机器人概念

机器人的交互可以使用文本、语音、图像或视频。 它处理用户的输入以了解其请求,并评估输入以执行相关任务。 机器人可以请求信息或启用对服务的访问权限,并响应用户。

机器人范围

Microsoft Teams 中的机器人可以进行一对一对话、群聊或参与团队的频道。 每个范围都为聊天机器人提供了独特的机会和挑战。

在频道中 在群组聊天中 在一对一聊天中
广阔的范围 成员数减少 传统方式
简洁的个人交互 @mention 到机器人 问答机器人
@mention 到机器人 类似于频道 讲笑话和做笔记的机器人

在频道中

频道包含多个用户之间的线程对话,甚至多达 2000 人。 这可能会让机器人拥有广阔的范围,但是个人交互需要简洁。 传统的多轮次交互不起作用。 相反,必须查找使用交互式卡片或对话 (TeamsJS v1.x) 中称为任务模块,或将对话移动到一对一对话以收集大量信息。 机器人仅有权访问其所在的 @mentioned消息。 可以使用 Microsoft Graph 和组织级别权限从对话中检索额外的消息。

在以下情况下,机器人在频道中效果更好:

  • 通知,特别是在为用户提供交互卡以便获取额外信息时。
  • 像投票和调查这样的反馈场景。
  • 单个请求或响应周期可解决交互,结果对多个成员对话非常有用。
  • 可以通过社交或娱乐机器人得到很棒的猫图像,随机挑选赢家等。

在群组聊天中

群聊是在三个及以上人员之间进行的非按线索组织的对话。 其中的成员一般比频道中的少且更短暂。 与通道类似,机器人只能直接访问消息 @mentioned

在频道中工作得更好的机器人在群聊中也能更好地工作。

在一对一聊天中

一对一聊天是对话机器人与用户进行交互的传统方式。 一对一对话机器人的一些示例包括:

  • 问答机器人
  • 在其他系统中启动工作流的机器人。
  • 讲笑话的机器人。
  • 记录笔记的机器人。 在创建一对一聊天机器人之前,请考虑基于对话的界面是否是展示功能的最佳方式。

活动处理程序和机器人逻辑

若要创建满足需求的机器人应用,必须了解Microsoft Teams 活动处理程序和机器人逻辑。 这两个关键组件协同工作来组织对话逻辑。

  • Teams 活动处理程序:Teams 活动处理程序通过添加对特定于 Teams 的事件和交互的支持来扩展标准机器人的功能。 这些事件可能包括频道创建、团队成员添加以及 Teams 环境特有的其他操作。 通过利用 Teams 活动处理程序,机器人可以在 Teams 平台中提供更集成、更无缝的用户体验。

  • 机器人逻辑:机器人对象(包含机器人的对话逻辑)负责根据用户输入做出决策。 它公开轮次处理程序,该方法接受来自机器人适配器的传入活动。 机器人逻辑可确保正确处理会话的每一轮,从而促进机器人的整体一致性和有效性。

这两个组件协同工作,创建引人入胜的对话体验。 活动处理程序处理用户所说的内容,而机器人逻辑会找出最佳响应。 它们共同实现:

  • 了解对话的上下文
  • 个性化交互
  • 高效检索信息
  • 维护自适应对话流

通过了解活动处理程序和机器人逻辑,可以设计和实现智能、用户友好的聊天 AI 和传统的机器人解决方案。

Teams 活动处理程序

活动处理程序是机器人功能的核心,用于管理和处理用户交互。 它基于Microsoft Bot Framework的活动处理程序,并在处理任何非 Teams 特定活动之前路由所有 Teams 活动。 它充当用户输入和机器人响应之间的中介:

  • 接收传入消息。
  • 从用户输入检索关键数据。
  • 使用自然语言处理 (NLP) 标识用户意向。
  • 维护对话上下文和状态。
  • 根据用户输入和意向生成响应。

活动处理程序提高了用户体验、效率、准确性、可伸缩性和灵活性。

当 Teams 机器人获取活动时,它将通过活动处理程序进行路由。 所有活动都经过名为轮次处理程序的基处理程序,该处理程序随后调用相应的活动处理程序。 Teams 机器人派生自 TeamsActivityHandler 类,类来自 Bot Framework 的 ActivityHandler 类。

注意

如果机器人活动处理时间超过 15 秒,Teams 会向机器人终结点发送重试请求,因此你可能会看到重复的请求。

机器人是使用 Bot Framework 生成的。 当机器人收到消息时,轮次处理程序会收到通知,并将其发送到 OnMessageActivityAsync 处理程序。 这在 Teams 中的工作方式相同。 如果机器人获取聊天更新,轮次处理程序会将它发送到 OnConversationUpdateActivityAsync。 Teams 活动处理程序首先查找任何特定于 Teams 的事件。 如果没有,则将其传递给 Bot Framework 的活动处理程序。

在 Teams 活动处理程序类中,有两个主要的 Teams 活动处理程序:

  • OnConversationUpdateActivityAsync 路由所有会话更新活动。
  • OnInvokeActivityAsync 路由所有 Teams 调用活动。

如果要实现特定活动处理程序 Teams 逻辑,必须覆盖机器人中的方法,如机器人逻辑部分所示。 这些处理程序没有基本实现。 因此,请在替代中添加所需的逻辑。

若要为特定于 Teams 的活动处理程序设置逻辑,必须重写机器人中的方法,如 机器人逻辑 部分所示。 这些处理程序没有默认实现,因此只需在替代中添加所需的逻辑即可。

Teams 活动处理程序的代码片段:

OnTeamsChannelCreatedAsync


protected override Task OnTeamsChannelCreatedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            // Code logic here
        }

OnTeamsChannelDeletedAsync


protected override Task OnTeamsChannelDeletedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            // Code logic here
        }

OnTeamsChannelRenamedAsync


protected override Task OnTeamsChannelRenamedAsync(ChannelInfo channelInfo, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
  {
   // Code logic here
  }

OnTeamsTeamRenamedAsync


protected override Task OnTeamsTeamRenamedAsync(TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
  {
   // Code logic here
  }

OnTeamsMembersAddedAsync


protected override Task OnTeamsMembersAddedAsync(IList<TeamsChannelAccount> teamsMembersAdded, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
  {
   // Code logic here
  }

OnTeamsMembersRemovedAsync


protected override Task OnTeamsMembersRemovedAsync(IList<TeamsChannelAccount> teamsMembersRemoved, TeamInfo teamInfo, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken);
  {
   // Code logic here
  }

OnTeamsMessageEditAsync

protected override async Task OnTeamsMessageEditAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
  { 
   // Code logic here 
  } 

OnTeamsMessageUndeleteAsync

protected override async Task OnTeamsMessageUndeleteAsync(ITurnContext<IMessageUpdateActivity> turnContext, CancellationToken cancellationToken)
  { 
   // Code logic here 
  } 

OnTeamsMessageSoftDeleteAsync

 protected override async Task OnTeamsMessageSoftDeleteAsync(ITurnContext<IMessageDeleteActivity> turnContext, CancellationToken cancellationToken)
  { 
   // Code logic here 
  } 

机器人活动处理程序示例

以下代码提供了频道团队范围的机器人活动示例:


protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var mention = new Mention
    {
        Mentioned = turnContext.Activity.From,
        // EncodeName: Converts the name to a valid XML name.
        Text = $"<at>{XmlConvert.EncodeName(turnContext.Activity.From.Name)}</at>",
    };
    
    // MessageFactory.Text(): Specifies the type of text data in a message attachment.
    var replyActivity = MessageFactory.Text($"Hello {mention.Text}.");
    replyActivity.Entities = new List<Entity> { mention };

    // Sends a message activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(replyActivity, cancellationToken);
}

以下代码提供了一对一聊天的机器人活动示例:


// Handle message activity
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    // Remove recipient mention text from Text property.
    // Use with caution because this function is altering the text on the Activity.
    turnContext.Activity.RemoveRecipientMention();
    var text = turnContext.Activity.Text.Trim().ToLower();

    // Sends a message activity to the sender of the incoming activity.
    await turnContext.SendActivityAsync(MessageFactory.Text($"Your message is {text}."), cancellationToken);
}

机器人逻辑

机器人逻辑包含决定机器人操作和交互的基本规则和决策框架。 它概述了机器人如何解释用户输入、表述响应和参与对话。

在 Teams 中,机器人逻辑处理来自一个或多个机器人通道的传入活动,并在响应中生成传出活动。 从 Teams 活动处理程序类派生的机器人仍然如此,该类首先检查 Teams 活动。 检查 Teams 活动后,会将所有其他活动传递给 Bot Framework 的活动处理程序。

核心 Bot Framework 处理程序

注意

  • 已添加已删除成员的活动外,本部分中介绍的所有活动处理程序继续与非 Teams 机器人一样运行。
  • onInstallationUpdateActivityAsync() 方法用于在将机器人添加到 Teams 时获取 Teams 区域设置。

活动处理程序在团队的上下文中有所不同,其中新成员将添加到团队而不是消息线程。

ActivityHandler 定义的处理程序列表包括以下事件:

事件 处理程序或 SDK 方法 说明
收到的任何活动类型 OnTurnAsync() 此方法根据收到的活动类型调用其他处理程序之一。
收到的消息活动 OnMessageActivityAsync() 可以重写此方法来处理 Message 活动。
收到的消息更新活动 OnMessageUpdateActivityAsync() 可以重写此方法来处理消息更新活动。
收到的邮件删除活动 OnMessageDeleteActivityAsync() 可以重写此方法来处理消息删除活动。
收到的对话更新活动 OnConversationUpdateActivityAsync() 如果机器人以外的成员已加入或离开对话,则此方法在活动上 ConversationUpdate 调用处理程序。
非机器人成员加入了对话 OnMembersAddedAsync() 可以重写此方法来处理加入会话的成员。
非机器人成员离开了对话 OnMembersRemovedAsync() 可以重写此方法来处理离开会话的成员。
收到的事件活动 OnEventActivityAsync() 此方法在 Event 活动上调用特定于事件类型的处理程序。
收到的令牌响应事件活动 OnTokenResponseEventAsync() 可以重写此方法来处理令牌响应事件。
收到的非令牌响应事件活动 OnEventAsync() 可以重写此方法来处理其他类型的事件。
收到的其他活动类型 OnUnrecognizedActivityTypeAsync() 可以重写此方法以处理任何未处理的活动类型。

Teams 特定的活动处理程序

扩展 TeamsActivityHandler 核心 Bot Framework 处理程序节中的处理程序列表,以包括以下事件:

事件 处理程序或 SDK 方法 说明
channelCreated OnTeamsChannelCreatedAsync() 可以重写此方法来处理正在创建的 Teams 频道。 有关详细信息,请参阅在对话更新事件中创建的通道
channelDeleted OnTeamsChannelDeletedAsync() 可以重写此方法来处理要删除的 Teams 频道。 有关详细信息,请参阅对话更新事件已删除的通道
channelRenamed OnTeamsChannelRenamedAsync() 可以重写此方法以处理要重命名的 Teams 频道。 有关详细信息,请参阅对话更新事件重命名的通道
teamRenamed OnTeamsTeamRenamedAsync() return Task.CompletedTask; 可以重写此方法来处理要重命名的 Teams 团队。 有关详细信息,请参阅在对话更新事件重命名的团队
MembersAdded OnTeamsMembersAddedAsync() 此方法调用 ActivityHandler 中的 OnMembersAddedAsync 方法。 可以重写此方法来处理加入团队的成员。 有关详细信息,请参阅对话更新事件中添加的团队成员
MembersRemoved OnTeamsMembersRemovedAsync() 此方法调用 ActivityHandler 中的 OnMembersRemovedAsync 方法。 可以重写该方法来处理离开团队的成员。 有关详细信息,请参阅对话更新事件中删除的团队成员
messageEdit OnTeamsMessageEditAsync() 可以重写此方法来处理 Teams 消息编辑事件。
messageUndelete OnTeamsMessageUndeleteAsync() 可以重写此方法以处理 Teams 消息取消删除事件。
messageSoftDelete OnTeamsMessageSoftDeleteAsync() 可以重写此方法来处理 Teams 消息软删除事件。

Teams 调用活动

从 Teams 活动处理程序调用的 OnInvokeActivityAsync Teams 活动处理程序列表包括以下调用类型:

调用类型 处理程序或 SDK 方法 说明
CardAction.Invoke OnTeamsCardActionInvokeAsync() 当连接器收到卡操作调用活动时,将调用此方法。
fileConsent/invoke OnTeamsFileConsentAcceptAsync() 当用户接受文件同意卡时,将调用此方法。
fileConsent/invoke OnTeamsFileConsentAsync() 当连接器收到文件同意卡活动时,将调用此方法。
fileConsent/invoke OnTeamsFileConsentDeclineAsync() 当用户拒绝文件同意卡时,将调用此方法。
actionableMessage/executeAction OnTeamsO365ConnectorCardActionAsync() 当连接器收到Microsoft 365 组操作活动的连接器卡时,将调用此方法。
signin/verifyState OnTeamsSigninVerifyStateAsync() 当连接器收到 signIn 验证状态活动时,将调用此方法。
task/fetch OnTeamsTaskModuleFetchAsync() 可以在派生类中重写此方法,以在提取 TeamsJS v1.x) 中称为任务模块的对话 (提供逻辑。
task/submit OnTeamsTaskModuleSubmitAsync() 可以在派生类中重写此方法,以在提交对话时提供逻辑。

本部分中列出的“调用”活动适用于 Teams 中的对话机器人。 Bot Framework SDK 还支持调用特定于消息扩展的活动。 有关详细信息,请参阅什么是消息扩展


现在,你已熟悉机器人活动处理程序,让我们看看机器人如何根据聊天以及它接收或发送的消息以不同的方式行为。

建议

机器人与用户之间的广泛对话是一种完成任务的缓慢而复杂的方法。 支持过多命令(尤其是各种命令)的机器人不会成功或被用户正面查看。

  • 避免在聊天中出现多轮次体验 广泛的对话要求开发人员维护状态。 若要退出此状态,用户必须超时或选择“ 取消”。 此外,这个过程也很繁琐。 例如,请查看以下对话方案:

    用户:安排与 Megan 的会议。

    机器人:我找到了 200 个结果,包括名字和姓氏。

    用户:安排与 Megan Bowen 的会面。

    机器人:好吧,要在什么时间与 Megan Bowen 见面?

    用户:下午 1:00。

    机器人:哪一天?

  • 支持六个或更少频率的命令 由于当前机器人菜单中只有六个可见命令,因此不太可能以任何频率使用更多命令。 深入到特定区域的机器人,而不是试图成为用途广泛的助理,工作状况和费用会更合理。

  • 优化知识库的大小以加快交互速度机器人的一个缺点是,很难使用未调调的响应维护大型检索知识库。 机器人最适合进行简短、快速的交互,而不适合在寻找答案的长列表之间切换。

探索其他机器人功能

除了传统的机器人功能,还可以探索 Teams 机器人应用中提供的高级功能:

代码示例

示例名称 Description .NET Node.js Python
Teams 对话自动程序 此示例应用演示如何使用 Bot Framework v4 中提供的不同机器人聊天事件。 View View View
机器人示例 Bot Framework v4 示例集。 View View View

后续步骤

另请参阅