DuerOS中的代理机制
代理,在架构设计中是一种常见的机制,在DuerOS 开发平台(DuerOS Bot Platform,DBP)中的设计同样如此。在《当你问代理机制的时候?指的是Agent,Proxy,Broker还是Delegate呢?》谈到了4种代理机制,在DBP中使用的是哪些代理机制呢?
Bot Delegate
Delegate 是委托性或者指派性代理,一般地,管理进程指派给代理方,并在代理方执行管理操作,而不涉及管理方。Delegate 不具备自主移动的能力,需要借助外力,通过指派协议从一个地址空间移动到另一个地址空间。只要需要Delegate 执行任务,它就一直处于执行状态。
在DBP 中,开发者用到的哪个功能使用了Delegate 代理机制呢?
意图测试
开发者在DBP 开发技能的时候,在创建意图之后,可以测试该意图能否被DuerOS争取召回。
具体在在DBP的控制台“意图”页面,可以输入query,就可以看到DuerOS 召回的意图结果。这个功能就是通过DBP 的bot delegate 实现的。
在《一个Bot的自白》中我们了解到, DuerOS 通过bot 协议与技能进行通信,而在开发者配置意图的时候可能还没有创建物理bot,那么难道DuerOS用了什么特殊的技巧来召回开发者测试的意图么?实际上,DuerOS 为了保证架构的一致性,仍然采用了bot 协议,只不过通信的对象是Bot Delegate,由 Bot Delegate 代理了开发者的测试请求,扮成了一个bot 的模样与DuerOS进行通信,然后将DuerOS 的召回结果返回给了开发者。
另外,在DuerOS目前的6个对话指令中,Dialog.Delegate指令也采用了委托式代理,将对话指派给DuerOS完成,DuerOS的询问和确认槽位的话术使用的是开发者在技能开放平台默认配置的话术。例如,在查询个人所得税场景中,因为需要填写多个槽位,开发者可以在技能开放平台配置默认的填槽话术,并将整个会话过程代理给DuerOS。DuerOS会自动询问和确认必要的槽位或意图。会话中,每一轮与用户的交互结果都会返回给技能,技能可以根据自身资源决定下一轮是否继续代理过程。
Bot Proxy
Proxy是一种透传性代理,是为了能有效地访问远程服务或其他代理。这里的“远程”并非一定是地域上的远近, 而是涉及网络拓扑或计算复杂度上的成本。
DuerOS 系统自身有很多的bot,例如闹钟,天气预报,音乐,音视频播放等等,还支持了成千上万第三方bot,即合作伙伴开发的技能服务。为了从架构层面缩小故障域以及安全隔离,Bot Proxy 承担起了 DuerOS 与 第三方Bot 之间的代理职责。
也就是说,用户的请求到达DuerOS系统,DuerOS 系统完成自然语言理解及相关处理后,将请求以结构化数据的形式通过Bot Proxy 发送给开发者的bot。开发者的Bot响应这些请求,也是通过Bot Proxy 返回给DuerOS,并最终返回给终端用户的。
那么,Bot Proxy 如何知道将哪些请求发送给哪些bot呢?开发者在部署技能服务的时候,需要明确物理bot 的主机地址:
在技能通过审核之后,开发者申请上线,Bot的服务部署地址以及相关属性会注册到 Bot Proxy。当DuerOS 发送用户用户请求的时候,会智能地给出Bot ID,Bot Proxy 根据Bot ID 映射到对应的服务地址,进而建立连接,透传请求。同理, 当技能下线的时候, Bot Proxy 会从bot的注册表中摘除对于的Bot id 及相关属性。
另外,技能服务的健康检查也是通过Bot Proxy 完成的。根据一个周期性的策略,Bot Proxy 会从DuerOS 系统的多个机房,通过 http 的 head 方法,完成对开发者技能服务的探活。很多开发者在提交技能上线,会遇到一个错误提示“请检查部署地址是否支持https 和head 请求”,处于安全性考虑,支持https是很容易理解的,而对head 请求的要求就是处于对Bot Proxy 进行健康检查的需要。
Bot Broker
Broker 是一种中介性代理。在网络与分布计算中, 两个层次上的对等实体, 若不便彼此直接交往, 则可通过Broker实现通信。这些可以有各种各样的定义和实现, 也表现在不同的层次上。简单一点, Broker提供了分布式服务和资源的透明访问,屏蔽了异构组件之间的差异。
“来而不往非礼也”,如果开发者的技能需要直接访问DuerOS怎么办呢?
先看看有哪些典型的应用场景:
请求用户地理位置权限
请求用户打印机设备服务权限
请求用户百度账号信息权限
定时提醒服务
例如,当开发者的技能服务需要获取用户的相关信息的时候,在交互中用户完成授权后,bot会主动发送请求到DuerOS请求相应的用户信息。
那么,这时候Bot 是直接与DuerOS 通信么?当然不是。
出于安全性的考量,DuerOS 引入了Bot Broker。Bot Broker 与Bot 之间进行安全通信,采用了PKI的安全机制, 这就是开发者在开发相关特性是在DBP 的控制台设置鉴权加密的原因。
关于与Bot Broker 安全通信的相关内容,可以参考《放心用吧!浅谈DuerOS的安全性》。
另一个典型的应用场景是推送服务。DBP开放平台向开发者开放了技能内推送机制,技能内推送意味着开发者能够在用户的会话周期内,调用推送接口向设备端推送相关内容或协议。目前DBP平台提供了两大类的推送,分别为文本和BOT协议。文本又分为纯文本,使用该类型将在设备端底部展示一个通知,同时内容为文本内容;另一种是TTS,设备端将用语音播报相关的TTS;BOT协议提供了更丰富的设备端内容展示的情景。当然, 推送服务也是由DuerOS Broker 来承载的。
Bot Agent
Agent是分布智能的基础单元。它具有一定程度的独立行为能力与智能,同时又遵从分布系统中某种统一的标准。在分布式环境中,Agent 可以和客户端不在一台主机上。
不论是bot broker 和 bot proxy,还是 bot delegate,都是DBP 平台中的一个子系统。那么, 在DBP 平台中有bot Agent 么?答案是 有的。
在《DuerOS的零编程技能实现》中谈了小技能,就是通过Bot Agent机制实现的。小技能是DuerOS 平台自动为用户生成的技能,在限定交互场景之后,开发者只需提供内容,即可在小度系列的智能语音设备上播放这些内容。目前小技能功能包括话术类、音频类,图片类和视频类的小技能,播放方式约定为顺序播放,随机播放和播放一个之后关闭。DBP中的小技能bot agent面对的是用户需求固定的资源,并且用户与技能的交互形式相对固定,如仅需要“再来一个”、“跳过”、“下一个”、“上一个”等切换资源内容的话术,bot agent通过类似工厂模式那样更加开发者的输入动态生成bot并关联这些小技能。类似的应用场景很多,如讲个故事,播放音乐,播放视频等。
当然,DuerOS 内部还有很多模块涉及到了代理机制,由于不是开发者直接可见的,就不一一介绍了。
DuerOS 的近期彩蛋
“懂畅有快”一直是DuerOS 追求的目标,就在上个月,DuerOS 可以更“懂”用户的说话了。DuerOS的开发者们可以在DBP 平台在意图配置页面 勾选“深度模型”,就可以得到更好的用户体验了, 欢迎咱们可爱的开发者们使用,感谢大家为DuerOS用户带来的便捷与快乐!