您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn.

机器人的工作原理

适用于: SDK v4

机器人是用户使用文本、图形(例如卡片或图像)或语音通过聊天的方式与之进行交互的应用。 Azure 机器人服务是一个云平台。 它承载了 bot,并使它们可供通道使用。

机器人框架服务是 Azure Bot 服务的一个组件,它在用户的机器人连接应用 (例如 Facebook 或时差等之间发送信息,我们将 通道 ) 和机器人。 每个通道可以在发送的活动中包含其他信息。 在创建机器人之前,必须了解机器人如何使用活动对象来与其用户通信。 首先,让我们了解在运行简单的聊天机器人时交换的活动。

活动示意图

此处演示了两种活动类型:聊天更新和消息。

当某一方参与聊天时,Bot Framework Service 可以发送聊天更新。 例如,使用 Bot Framework Emulator 开始聊天时,会看到两个聊天更新活动(一个活动指出用户正在参与聊天,另一个活动指出机器人正在参与聊天)。 若要区分这些会话更新活动,请检查活动的 " 添加的成员 " 属性中包含的用户。

消息活动承载参与方之间的聊天信息。 在聊天机器人示例中,消息活动承载简单的文本,通道呈现这些文本。 消息活动也可以承载要讲述的文本、建议的操作或要显示的卡片。

在此示例中,机器人创建并发送了一个消息活动,以响应它收到的入站消息活动。 但是,bot 可以通过其他方式对接收的消息活动进行响应;机器人通过在消息活动中发送一些欢迎文本,来响应会话更新活动的情况并不少见。 有关详细信息,请参阅如何 欢迎用户

机器人框架 SDK

机器人框架 SDK 允许构建可在 Azure Bot 服务上托管的机器人。 该服务定义了一个 REST API 和一个活动协议,用于处理机器人和频道或用户之间的交互方式。 SDK 基于此 REST API 构建并提供服务的抽象,因此你可以专注于对话逻辑。 尽管不需要了解 REST 服务来使用 SDK,但了解其某些功能可能会很有帮助。

机器人是具有对话接口的应用。 可以使用机器人将简单的重复性任务(例如订餐或收集个人资料信息)转移给不再需要直接人为干预的自动化系统来完成。 用户使用文本、交互卡和语音与机器人聊天。 机器人交互可以是快速的问答式交互,也可以是复杂的聊天,通过聊天以智能方式提供对服务的访问权限。

备注

对 SDK 和 REST API 提供的功能的支持因通道而异。 你可以使用 Bot Framework 模拟器测试机器人,但你还应在你打算使机器人可用的每个通道上测试机器人的所有功能。

交互涉及活动的交换,这些 活动中进行处理。

活动

用户 (或通道) 之间的每个交互,bot 表示为 活动 。 机器人框架 活动架构 定义可以在用户或通道与机器人之间进行交换的活动。 活动可以表示人为文本或语音、应用程序到应用程序的通知、对其他消息的反应等等。

轮次

在聊天时,人们通常一次说一句话,并且会轮流说话。 使用机器人时,通常是由机器人对用户输入进行响应。 在 Bot Framework SDK 中,一轮通话既包含用户传给机器人的活动,又包含机器人发回用户的作为即时响应的活动。 可以将转变成与接收给定活动的机器人关联的处理。

例如,用户可能会要求机器人执行特定任务。 机器人可能会对问题做出响应,以获取有关该任务的详细信息,此时将结束。 接下来,机器人会接收来自用户的一条新消息,该消息可能包含机器人问题的答案,或者可能表示使用者的更改或请求忽略初始请求来执行任务。

机器人应用程序结构

SDK 定义了一个 机器人 类,用于处理机器人应用程序的对话推理。 机器人类:

  • 识别并解释用户的输入。
  • 输入和执行相关任务的原因。
  • 生成有关机器人正在执行或已完成的操作的响应。

SDK 还定义了用于处理与通道的连接的 适配器 类。 适配器:

  • 提供一个方法,用于处理来自的请求和用于向用户的通道生成请求的方法。
  • 包括中间件管道,其中包括关闭机器人处理程序的过程。
  • 调用机器人的 turn 处理程序,并捕获未在 turn 处理程序中处理的错误。

此外,bot 经常需要每轮检索并存储状态。 这是通过 存储bot 状态属性访问器 类处理的。 SDK 并不提供内置存储,而是为存储提供抽象并为存储层提供一些实现。 管理状态主题介绍了这些状态和存储功能。

机器人具有连接和推理元素以及状态的抽象

SDK 不需要使用特定的应用程序层来发送和接收 web 请求。 机器人框架包含用于 ASP.NET (c # ) 、restify (JavaScript) 和 aiohttp (Python) 的模板和示例。 但是,你可以选择对你的应用程序使用不同的应用程序层。

使用 SDK 创建机器人时,提供用于接收 HTTP 流量并将其转发到适配器的代码。 机器人框架提供了几个模板和示例,可用于开发自己的机器人。

机器人逻辑

机器人对象包含会话推理或逻辑,并公开 turn 处理程序 ,这是可接受机器人适配器传入活动的方法。

SDK 提供了用于管理机器人逻辑的几个不同的模式。

  • 活动处理程序 提供事件驱动模型,其中传入的活动类型和子类型都是事件。 这对于与用户进行有限的交互的 bot 非常合适。
    • 使用 活动处理程序 ,并为机器人将识别并做出反应的每个活动类型或子类型实现处理程序。
    • 使用 团队活动处理程序 创建可连接到团队渠道的机器人。 (团队通道需要机器人来处理特定于通道的行为。 )
  • 对话框库提供基于状态的模型来管理与用户的长时间运行的会话。
    • 将活动处理程序和 组件对话框 用于主要的顺序对话。 有关详细信息,请参阅 关于组件和瀑布对话框
    • 使用 对话框管理器自适应对话框 ,可处理可处理更广泛用户交互的灵活会话流。 有关详细信息,请参阅 自适应对话框简介
  • 实现自己的机器人类,并提供自己的逻辑来处理每个转变。 有关此示例的示例,请参阅如何 创建您自己的提示来收集用户输入

机器人适配器

该适配器具有用于启动轮流操作的 " 处理" 活动 方法。

  • 它将请求主体 (请求负载,转换为活动) 并将请求标头转换为参数。
  • 它检查身份验证标头是否有效。
  • 它为 turn 创建 上下文 对象。
  • 它通过其 中间件 管道来运行。
  • 它将活动发送到机器人对象的 turn 处理程序。

该适配器还能:

  • 格式化并发送响应活动。 这些响应通常是用户的消息,但也可以包括用户渠道直接使用的信息。
  • 使用 Bot 连接器提供的其他方法 REST API,例如 更新消息删除消息
  • 捕获未被捕获的错误或异常。

Turn 上下文

轮次上下文对象提供有关活动的信息,例如发送方和接收方、通道,以及处理该活动所需的其他数据。 使用该对象还能在机器人的不同层中处理轮次期间添加信息。

轮次上下文是 SDK 中最重要的抽象之一。 它不仅会将入站活动发送到所有中间件组件和应用程序逻辑,还提供了一种机制,通过该机制,中间件组件和机器人逻辑可以发送出站活动。

中间件

中间件非常类似于其他任何消息传送中间件,由一组线性组件构成,其中每个组件按顺序执行,并有机会对活动运行。 中间件管道的最后一个阶段是回调已由应用程序注册到适配器 process activity 方法的机器人类中的轮次处理程序。 中间件实现适配器调用的 on turn 方法。

Turn 处理程序使用 turn 上下文作为其参数,通常在 turn 处理程序函数内运行的应用程序逻辑处理入站活动的内容,并生成一个或多个活动的响应,并使用 turn 上下文的 send 活动 函数发送这些活动。 调用轮次上下文中的 send activity 会导致针对出站活动调用中间件组件。 中间件组件在 bot 的 turn 处理程序函数之前和之后执行。 执行是本质上嵌套的,因此有时称为绘图纸。

中间件主题详细介绍了中间件。

机器人状态和存储

与其他 web 应用一样,bot 本质上是无状态的。 机器人内的状态与新式 web 应用程序遵循相同的模式,Bot Framework SDK 提供了存储层和状态管理抽象,使状态管理更容易。

管理状态主题介绍了这些状态和存储功能。

消息传递终结点和设置

通常,你的应用程序将需要一个 REST 终结点来接收消息。 还需要根据你决定使用的平台为你的机器人预配资源。

按照 (c #JavaScriptPython) 中的快速入门之一,创建和测试简单的 echo 机器人。

HTTP 详细信息

活动通过 HTTP POST 请求从 Bot Framework Service 抵达机器人。 机器人使用 200 HTTP 状态代码响应入站 POST 请求。 从机器人发送到通道的活动通过单独的 HTTP POST 发送到 Bot Framework Service。 而此请求也会通过 200 HTTP 状态代码得到确认。

协议未指定这些 POST 请求及其确认的执行顺序。 但是,为了适应常见的 HTTP 服务框架,这些请求通常会嵌套,这意味着,出站 HTTP 请求将在入站 HTTP 请求的范围内从机器人发出。 前面的关系图对此模式进行了说明。 由于两个不同的 HTTP 连接相继出现,安全模型必须能够应对这种情况。

备注

机器人有15秒钟的时间,用于在大多数通道上使用状态200确认呼叫。 如果机器人在15秒内没有响应,则会出现 HTTP GatewayTimeout 错误 (504) 。

活动处理堆栈

让我们深入探讨上一个序列图,重点介绍消息活动的到达。

活动处理堆栈

在上述示例中,机器人使用包含相同文本消息的另一个消息活动回复了原始消息活动。 处理工作从 HTTP POST 请求(包含以 JSON 有效负载形式传递的活动信息)抵达 Web 服务器时开始。 在 c # 中,这通常是一个 ASP.NET 项目,在 JavaScript Node.js 项目中,这可能是一个热门框架,如 Express 或 restify。

适配器(SDK 的集成组件)是 SDK 运行时的核心。 活动以 JSON 形式承载在 HTTP POST 正文中。 此 JSON 将反序列化以创建 活动 对象,然后通过其 进程活动 方法将该对象传递到适配器。 收到活动时,适配器会创建轮次上下文并调用中间件。

如前所述,轮次上下文提供一个机制来让机器人发送出站活动(主要是为了响应入站活动)。 为实现此目的,turn 上下文提供 发送更新删除活动 响应方法。 每个响应方法都在异步进程中运行。

重要

线程处理主机器人轮次完成后处理上下文对象释放。 确保 await 任何活动调用,以便主线程等待生成的活动,再完成处理并释放轮次上下文。 否则,如果某个响应(包括其处理程序)在已占用大量时间的情况下尝试对上下文对象执行操作,则会出现“上下文已释放”错误。

机器人模板

需要为应用选择应用程序层使用;但是,Bot 框架包含 ASP.NET (c # ) 、restify (JavaScript) 和 aiohttp (Python) 的模板和示例。 编写文档的前提是使用这些平台之一,但 SDK 不需要使用。 有关如何访问和安装模板的说明,请参阅快速入门 (c #JavaScriptPython) 。

机器人是一个 web 应用程序,并为每个语言版本的 SDK 提供了模板。 所有模板都提供默认终结点实现和适配器。 每个模板包括:

  • 资源预配
  • 将传入活动路由到适配器的特定于语言的 HTTP 终结点实现。
  • 适配器对象
  • 机器人对象

不同模板类型之间的主要区别在于机器人对象。 模板为:

  • 空机器人
    • 包含一个活动处理程序,该处理程序通过在第一次打开会话时发送一个 "hello world" 消息欢迎用户加入会话。
  • 回显机器人
    • 将活动处理程序用于欢迎用户并回显用户输入。
  • 核心机器人
    • 汇集了 SDK 的许多功能,并演示了机器人的最佳实践。
    • 将活动处理程序用于欢迎用户。
    • 使用组件对话框和子对话来管理会话。
    • 对话框使用语言理解 (LUIS) 和 QnA Maker 功能。

其他信息

管理机器人资源

需要适当管理机器人资源,例如连接的服务的应用 ID、密码、密钥或机密。 有关如何执行此操作的详细信息,请参阅 Bot 框架安全指南 和有关 管理机器人资源的信息。

通道适配器

SDK 还允许使用通道适配器,其中,适配器本身还会执行机器人连接器服务对通道的正常操作。

SDK 提供某些语言的几个通道适配器。 可以通过 Botkit 和社区存储库获得更多通道适配器。 有关更多详细信息,请参阅机器人 Framework SDK 存储库的 通道和适配器表。

机器人连接器 REST API

机器人框架 SDK 在 REST API 的机器人连接器上进行包装和构建。 如果要了解支持 SDK 的基础 HTTP 请求,请参阅连接器 身份验证 和相关文章。 机器人发送和接收的活动符合 Bot 框架活动架构

后续步骤