本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目微服务架构设计,着重对Rasa Agent(也称作Rasa server,或者Rasa dialogue management)和action server之间如何使用HTTP通信协议进行交互的过程进行详细的分析,包括微服务代码示例及Rasa SDK specification等。
一、Rasa对话机器人项目实战之教育领域Education Bot项目微服务架构设计及通信协议解密
- Rasa 3.X Architecure视角下的Agent和Action Server交互过程详解
根据下面的架构图,当对话机器人预测一个自定义action时,Rasa Agent需要调用微服务,首先会通过aiohttp库发送HTTP POST请求给Rasa action server,这个POST请求的payload是使用JSON格式封装了请求的数据,然后在action server端接收到这个请求后就会执行相应的微服务action,之后会以JSON格式的payload返回responses和events给Rasa Agent,Rasa Agent会把responses发送给用户,并且把这些events添加到对话跟踪器tracker中,从而完成一个微服务的调用过程。Rasa提供的action server的SDK是使用Python开发的,当然你可以使用其它语言来开发自己的action server。
2. Rasa 3.X Architecure视角下的Message Handling生命周期详解
下面这幅图显示了Rasa对话机器人进行消息处理的基本步骤,但是没有包括以下内容:
-针对输入的用户消息,直接使用ResponseSelector进行处理,譬如FAQ的场景
-Action返回的response是发送到Rasa Agent,然后再通过channel返回给用户
这幅图表达的基本步骤是,当对话机器人接收到用户输入信息后,首先经过NLU部分的处理产生intents和entities,然后交给tracker处理,再由Policy使用tracker的内容做出预测,调用相应的微服务action,之后输出responses给Rasa Agent,同时把微服务返回的events添加到tracker中来更新tracker状态。
3. Endpoint Request 四大核心next_action、sender_id、tracker、domain详解
Rasa Agent发送HTTP POST请求给action server时,这个request的payload会包括以下数据:
-根据Dialogue Policies预测得到的action的名称
-对话ID
-tracker的状态信息
-domain配置信息
4. Endpoint Request 中Payload示例JSON内容详解
REQUEST BODY SCHEMA: application/json,包含以下四个部分的内容:
-next_action:需要在action server上被执行的action
-sender_id:当前对话用户的唯一标识ID
-tracker:存储对话状态的对话跟踪器
-domain:对话机器人作用域(Rasa系统配置)
以下是request payload样例,包含上面4部分的详细的内容:
{
"next_action": "string",
"sender_id": "string",
"tracker": {
"conversation_id": "default",
"slots": {
"slot_name": "slot_value"
},
"latest_message": {
"entities": [
{
"start": 0,
"end": 0,
"value": "string",
"entity": "string",
"confidence": 0
}
],
"intent": {
"confidence": 0.6323,
"name": "greet"
},
"intent_ranking": [
{
"confidence": 0.6323,
"name": "greet"
}
],
"text": "Hello!"
},
"latest_event_time": 1537645578.314389,
"followup_action": "string",
"paused": false,
"events": [
{
"event": "slot",
"timestamp": 1559744410
}
],
"latest_input_channel": "rest",
"latest_action_name": "action_listen",
"latest_action": {
"action_name": "string",
"action_text": "string"
},
"active_loop": {
"name": "restaurant_form"
}
},
"domain": {
"config": {
"store_entities_as_slots": false
},
"intents": [
{
"property1": {
"use_entities": true
},
"property2": {
"use_entities": true
}
}
],
"entities": [
"person",
"location"
],
"slots": {
"property1": {
"auto_fill": true,
"initial_value": "string",
"type": "string",
"values": [
"string"
]
},
"property2": {
"auto_fill": true,
"initial_value": "string",
"type": "string",
"values": [
"string"
]
}
},
"responses": {
"property1": [
{
"text": "string"
}
],
"property2": [
{
"text": "string"
}
]
},
"actions": [
"action_greet",
"action_goodbye",
"action_listen"
]
}
}
5. Endpoint Response两大核心events和response详解
在Rasa中,对话是以事件序列来表示的,通过调用微服务action返回事件来改变对话状态,从而影响对话过程,所以Rasa对话过程是事件驱动的。并不是所有事件都是由自定义action来返回的,Rasa会自动跟踪一些事件譬如用户消息,而有些事件只有从微服务action返回后才能被跟踪到。
6. Endpoint Response中Payload示例JSON内容详解
RESPONSE SCHEMA: application/json,
返回code为200,表示action执行成功,response包含以下内容:
events:action返回的events
responses:需要返回给用户的responses列表
返回code为400,表示action执行被拒绝(譬如用户没有权限执行这个微服务action),等同于返回一个ActionExecutionRejected,response包含以下内容:
-action:被拒绝执行的action
-error:错误消息
返回code为500,表示action server在执行action时发生了异常。
以下是返回code为200的response payload样例:
{
"events": [
{
"event": "slot",
"timestamp": 1559744410
}
],
"responses": [
{
"text": "string",
"buttons": [
{
"title": "string",
"payload": "string"
}
],
"elements": [],
"custom": {},
"image": "string",
"attachment": "string",
"template": "string",
"property1": "string",
"property2": "string",
"response": "string"
}
]
}
7. Education Bot项目微服务过程及代码示例解析
在下面的微服务代码中,微服务的逻辑是在run方法中执行的,譬如通过dispatcher调用utter_message来输出信息,在return语句中可以根据需要返回事件,在下面的代码中,返回事件为空:
8. Rasa 3.X微服务OpenAPI specification逐行解析
你可以从Rasa官网下载OpenAPI specification。考虑到Rasa开放式的松耦合架构,Rasa Agent和action server版本可以不完全一致。从下载的specification来看,版本为3.0.2:
你可以运行以下命令来升级Rasa版本:
Rasa Agent需要以下配置来找到action server,下面是本地开发模式:
这是在项目中的endpoints.yml文件中使用的配置:
从action server实际输出信息可以看到:
在specification中,Rasa Agent发送HTTP POST请求给action server时需要使用以下配置:
下面这些是关于response定义的描述: