基于Rasa框架多轮对话设计及实现
前言
- 此部分基于Rasa框架展开仅以Core为主,对NLU和NLG没有太多涉及。
- 设计了两场多轮对话并实现:
一、设计问天气的单场景多轮对话,实现对话能在地点与时间之间灵活切换。
二、设计一个集天气、景点、美食和住宿的多场景旅游综合多伦对话系统。要求对话机器人准确回答天气、景点、美食和住宿的多场景间相互切换的提问。 - 环境:Python3.6.6和Rasa1.4.3
一 对话系统概述
当前对话系统主要包括4类:
- 问答型对话系统
- 任务型对话系统
- 闲聊型问答系统
- 图谱型问答系统
问答型 | 任务型 | 闲聊型 | 图谱型 |
---|---|---|---|
1. QA bot | 1. Task bot | 1. Chat bot | 1. KBQA bot |
2. 单轮对话 | 2. 多轮对话 | 2. 多轮对话 | 2. 基于图谱的推理 |
3. 上下文无关 | 3. 针对特定场景(垂直领域) | 3. 自然交互(开放领域) | 3. 解决特定问题 |
4. 解决特定问题 | 4. 不解决问题 |
二 Rasa基础概要
1、Rasa介绍
Rasa是一个用于对话的开源机器学习框架。首先了解用户想说的内容(NLU),然后根据上下文信息对其进行适当的操作对话(Core)。
2、Rasa核心模块
NLU - 自然语言理解
Rasa是一个用于对话的开源机器学习框架。首先了解用户想说的内容(NLU),然后根据上下文信息对其进行适当的操作对话(Core)。Core - 对话管理
对话管理(Dialog Management,DM)控制着人机对话的进程,对话管理通过对自然语言理解模块的输出(即意图、槽位、槽位信息)的处理来进行和用户的交互和反应。针对带有明确意图的用户,在对话管理过程中用户不但可以完善或修正自己需求,管理系统也可以在用户需求不够具体的时候明确或澄清用户的需求,以达到最终的任务完成。
对话管理系统主要包括两部分:状态追踪和对话策略。对话策略通常作为对话管理的输出,如对该场景下缺失槽位的反问策略等。以某公司智能产品介绍系统的多伦对话为示例:
轮次 | Bot / 客户 | 对话内容 | 行为判别 |
---|---|---|---|
1 | Bot | 这里是XX公司,很高兴为您服务! | 开场白 |
2 | 客户 | 我想了解贵司有哪些AI产品 | 意图识别(产品咨询) |
3 | Bot | 好的,您有哪方面的业务需求? | 澄清需求,以便填槽 |
4 | 客户 | 需要支持语音识别并自动识别出风险信息 | 槽填充(语音&信息) |
5 | Bot | 对处理技术有要求吗? | 澄清需求 |
6 | 客户 | 最好有大数据处理能力 | 槽填充(大数据) |
7 | Bot | 好的,咱们XX产品非常符合您的需求! | 任务完成,反馈相关产品介绍 |
- NLG - 自然语言生成
基于多伦对话的自然语言生成,通常也采用基于模板、基于语法或模型等。模板与语法主要基于规则的策略,模型可以用如seq2seq等网络生成自然语言。
3、Rasa对话流程图
- 1.将用户输入的Message传递到Interpreter(NLU模块),并将信息打包为一个字典, 该模块负责识别Message中的"意图(intent)“和提取所有"实体”(entity)数据;
- 2.Rasa Core会将Interpreter提取到的意图和识别传给Tracker对象,保持对话状态(Conversation State);
- 3/4/5.利用Policy记录Tracker对象的当前状态,并选择执行相应的Action,其中,这个Action是被记录在Track对象中的;
- 6.将执行Action返回的结果输出,即完成一次人机交互(一轮对话结束)。
4、Rasa主要组件
三 多轮对话管理
对话元素是常见的对话模式,可以使用三种不同的抽象级别来讨论AI助手:
- 最低级别:意图,实体,操作,词槽位和模板
- 中层级别:对话元素
- 最高级别:用户目标(达成)
1、对话管理的核心模块
面向任务的对话系统整体流程由NLU、DST、DPL、NLG這4个主要模块组成。
NLU(自然语言理解)
DST(对话状态追踪)- 理解用户需求
DPL(对话策略学习)- 确定系统动作,意图+槽值
-
NLG(自然语言生成)
对话系统模块 DST模块:存储了当前的对话状态,包括意图和槽位,这一模块的目标是追踪用户需求并判断当前的对话状态。该模块以多轮对话历史、当前的用户动作为输入,通过总结和推理理解在上下文的环境下用户当前输入自然语言的具体含义。
DPL模块:也被称为对话策略优化(optimization),根据当前的对话状态,对话策略决定下一步执行什么系统动作。系统行动与用户意图类似,也由意图和槽位构成。
2、各模块输入输出伪代码
整体流程
输入:用户输入(sentence)
过程:
userAct <-- NLU(sentence)
dialogState <-- DST(userAct, dialogHistory)
systemAct <-- DPL(dialogState)
reply <-- NLG(systemAct)
输出:系统回复(reply)
NLU模块
输入:用户输入(sentence)
过程:
userAct.intent <-- intentRecognizer(sentence)
userAct.slotArray <-- slotFilling(sentence, userAct.intent)
输出:用户动作(userAct)
DST模块
输入:用户动作(uesrAct) & 对话历史(dialogHistory)
过程:
if userAct.intent is not None:
dialogState.intent <-- userAct.intent
dialogState.slotArray <-- userAct.slotArray
checkDefaultSlot(dialogState)
else:
dialogState.intent <-- getIntent(dialogHistory)
dialogState.slotArray <--
updateDialogState(userAct.slotArray, dialogHistory)
输出:对话状态(dialogState)
DPL模块
输入:对话状态(dialogState)
过程:
if dialogState.intent == "询问天气":
if dialogState.slotArray[0] is None:
systemAct.intent <-- "AskDate"
elif dialogState.slotArray[1] is None:
systemAct.intent <-- "AskLocation"
else:
systemAct.intent <-- "AskWeather"
systemAct.slotArray[0] <- getWeather(dialogState.slotArray)
elif dialogState.intent is None:
systemAct.intent <-- Exception("IntentError")
else:
OtherService
输出:系统动作(systemAct)
NLG模块
输入:系统动作(systemAct)
过程:
if systemAct.intent == "AskDate":
reply <-- "请输入时间"
elif systemAct.intent == "AskLocation":
reply <-- "请输入地点"
elif systemAct.intent == "AnswerWeather":
reply <-- systemAct.slotArray[0]
elif systemAct.intent == "IntentError":
reply <-- "抱歉,刚刚没听出,能再说一次吗"
else:
OthersystemAct
输出:系统回复(reply)
3、Stories - 对话场景
对话的场景流程。人机对话过程中可能出现的故事情节,训练得到人机对话系统所需的对话模型。
- 场景:用“##”表示
- 意图:用“*”表示
- 活动:用“-”表示
4、Domain - 机器人大脑
定义了对话机器人应知道的所有信息,相当于大脑框架,指定了意图intents, 实体entities, 词槽slots以及动作actions。
5、Slots - 词槽
词槽是机器人的记忆,以k-v存储。
词槽类型有:文本、布尔、分类、浮点、列表、只存但未用
6、Actions - 动作
Actions是接下来要执行的操作,包括要返回给用户的信息。有三种定义方法:
1. utter actions - 模板回复
2. utter default - 默认动作
默认的一组动作,无需定义,直接使用。有如下三种方法:
- action_listen:停止预测,等待用户的输入
- action_restart:重置整个对话
- action_default_fallback:撤销最后一条用户信息并返回机器人不理解该消息
3. dstom actions - 自定义动作
自定义动作,是多轮对话关键点,允许执行任何操作并反馈给用户。
- 在domain.yml文件中定义actions
- 在endpoint.yml文件中指定webserver的url地址,在指定的webserver中实现它
- 官方提供python sdk使用户自定义action,需继承Action并重写name和run方法
四 多轮对话设计实现(一)
单场景多伦对话:以询问天气为例,实现对话能在地点与时间之间相互切换。
1、功能分析
1. 分析对话案例(输入输出)
轮次 | 输入 | 输出 |
---|---|---|
1 | 北京明天天气如何? | 北京明天的具体天气 |
2 | 后天呢 | 北京后天的具体天气 |
3 | 那上海呢 | 上海后天的具体天气 |
4 | 那三亚明天呢 | 三亚明天的具体天气 |
- | 深圳 | 杭州 | ···呢 | 某地明天的具体天气 |
- | 今天 | 明天 | 后天呢 | 某地某时的具体天气 |
N | ··· | ··· |
2. 分析实体类别(槽值)
- 地址(暂时只考虑中国城市)
- 时间(暂时只考虑今天/明天/后天)
3. 分析意图类别
- 意图1:问候语(你好)
- 意图2:结束语(再见)
- 意图3:问地点(三亚会下雪吗)
- 意图4:问时间(明天会很热吗)
- 意图5:问地点和时间(三亚明天后下雪吗)
4. 分析对话场景
- [1] 直接询问:一句话中同时包含address + date。一轮实现
- [2] 直接多次询问:每次询问只含一个意图(此处为两个场景)。两轮实现
- [3] 先问候再直接询问:第一次问候,第二次同时包含两个意图。两轮实现
- [4] 结束语
5. 根据意图所采取的动作(Action模块分析)
- [1] 意图a --> 返回模板“你好,请输入城市和时间”
- [2] 意图b --> 返回模板“拜拜”
- [3] 意图c --> 返回模板“什么时候?”
- [4] 意图d --> 返回模板“哪座城市?”
- [5] 意图e(以及填槽完成)--> 返回具体城市具体时间的具体天气
6. 训练语料分析
- 意图1的标注语料(问候语 - 打招呼)
- 意图2的标注语料(结束语)
- 意图3的标注语料(地址 - 需标记城市实体词)
- 意图4的标注语料(时间 - 需标记时间实体词)
- 意图5的标注语料(地址&时间 - 需标记地址和时间的实体词)
2、功能实现
1. 初始化一个项目
rasa init
2. config.yml 配置文件
- 指定语言
- 指定pipeline
language: "zh"
pipeline:
- name: "nlp_mitie"
model: "data/total_word_feature_extractor_zh.dat" // 加载mitie模型
- name: "tokenizer_jieba" // 使用jieba分词
- name: "ner_mitie" // mitie的命名实体识别
- name: "ner_synonyms"
- name: "intent_featurizer_mitie" // 特征提取
- name: "intent_classifier_sklearn" // sklearn的意图分类模型
policies:
- name: MemoizationPolicy
- name: KerasPolicy
- name: MappingPolicy
3. stories.md 场景编写
- [1] ## address_date 直接询问的场景
- [2] ## address + date 直接多次询问(先问城市后问时间)
- [3] ## date + addresss 直接多次询问(先问时间后问地址)
- [4] ## greet + address_date 先问候再直接询问
- [5] ## goodbye
## greet
* greet OR weather
- utter_greet
## goodbye
* goodbye
- utter_goodbye
## weather 1 - address_date
* address_date{"address": "上海", "date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
* address{"address": "上海"} OR date{"date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
## weather 2 - address + date
* address{"address": "上海"}
- utter_date
* date{"date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
* address{"address": "上海"} OR date{"date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
## weather 3 - data + address
* date{"date": "明天"}
- utter_address
* address{"address": "上海"}
- utter_waiting
- action_report_weather
- utter_report_weather
* address{"address": "上海"} OR date{"date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
## weather 4 - greet_1
* greet_address_date{"address": "上海", "date-time": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
* address{"address": "上海"} OR date{"date": "明天"}
- utter_waiting
- action_report_weather
- utter_report_weather
4. domain.yml 对话管理
- [1] intents: 意图集
- [2] slots: 填槽集
- [3] entities: 实体集
- [4] actions: 执行集
- [5] templates: 回复模板集
intents:
- greet
- address_date
- address
- date
- goodbye
- waiting
slots:
address:
type: text
date:
type: text
matches:
type: unfeaturized
entities:
- address
- date
actions:
- utter_greet
- utter_address
- utter_date
- action_report_weather
- utter_report_weather
- utter_goodbye
- utter_waiting
templates:
utter_greet:
- text: "你好,请输入城市和时间"
utter_address:
- text: "哪座城市?"
utter_date:
- text: "什么时候?"
utter_waiting:
- text: "正在查询中..."
utter_goodbye:
- text: "拜拜"
utter_report_weather:
- text: "{matches}"
5. actions 动作执行
- [1] 编写一个天气报告类并继承FormAction类
- [2]重写name
- [3]重写submit方法并获取词槽中的address和date实体值,再通过pai接口(知心天气)将其实体值传入,最后将调取结果返回到对应actions的模板template中
- 将三方(知心天气)接口返回结果生成NLG,返回给用户
import logging
from typing import List
from rasa_core_sdk.forms import FormAction, EntityFormField
from rasa_core_sdk.events import SlotSet
from requests import (
ConnectionError,
HTTPError,
TooManyRedirects,
Timeout
)
from api import get_weather_by_day
logger = logging.getLogger(__name__)
class ActionReportWeather(FormAction):
RANDOMIZE = True
@staticmethod
def required_fields():
return [
EntityFormField("address", "address"),
EntityFormField("date", "date"),
]
def name(self):
# type: () -> Text
return "action_report_weather"
def submit(self, dispatcher, tracker, domain):
# type: (Dispatcher, DialogueStateTracker, Domain) -> List[Event]
address = tracker.get_slot('address')
date_time = tracker.get_slot('date')
logger.debug("get address and date: {}|{}".format(address, date_time))
date_time_number = text_date_to_number_date(date_time)
if isinstance(date_time_number, str): # parse date_time failed
return [SlotSet("matches", "暂不支持查询[{}{}]的天气".format(
address, date_time))]
else:
try:
weather_data = get_text_weather_date(address,
date_time,
date_time_number)
except:
return [SlotSet("matches", "暂不支持查询[{}{}]的天气".format(
address, date_time))]
return [SlotSet("matches", "{}".format(weather_data))]
6. 训练语料
- 按json格式标记出每一句话的意图,若有实体值需标记其值以及起始位置
- nlu.json文件中如下5类别意图的标注样例:
[
{
"intent": "greet",
"entities": [
],
"text": "你好"
},
{
"intent": "goodbye",
"entities": [
],
"text": "再见"
},
{
"intent": "address",
"entities": [
{
"start": 9,
"end": 11,
"value": "香港",
"entity": "address"
}
],
"text": "不好意思可以帮我查香港的天气"
},
{
"intent": "address_date",
"entities": [
{
"start": 0,
"end": 2,
"value": "今天",
"entity": "date"
},
{
"start": 2,
"end": 4,
"value": "台北",
"entity": "address"
}
],
"text": "今天台北天气如何"
},
{
"intent": "date",
"entities": [
{
"start": 0,
"end": 2,
"value": "今天",
"entity": "date"
}
],
"text": "今天去外边要穿薄毛衣吗"
}
]
7. 训练
- rasa train core - 训练Core模块
- rasa train nlu - 训练NLU模块
- rasa train (默认)
[...]
Epoch 100/100
601/601 [==============================] - 0s 191us/sample - loss: 0.0714 - acc: 0.9767
2020-03-07 17:44:05 INFO rasa.core.policies.keras_policy - Done fitting keras policy model
2020-03-07 17:44:06 INFO rasa.core.agent - Persisted model to 'C:\Users\ppo223\AppData\Local\Temp\tmp0cd3ld64\core'
Core model training completed.
NLU data/configuration did not change. No need to retrain NLU model.
Your Rasa model is trained and saved at 'D:\python\rasa\weather\design1\models\20200307-174406.tar.gz'.
8. 可视化场景流程图
rasa visualize --out htmls\ask_weather_030701.html
(rasa --help 查看命令)
[...]
Processed Story Blocks: 100%|████████████████████████████████████████████████████████| 16/16 [00:00<00:00, 1605.09it/s, # trackers=2]
2020-03-07 17:45:50 INFO rasa.core.visualize - Finished graph creation. Saved into file://D:\python\rasa\weather\design1\htmls\ask_weather_030701.html
9. 预测
# 先启动endpoint
python -m rasa_core_sdk.endpoint --actions bot(start /b python -m rasa_core_sdk.endpoint --actions bot # windows挂在后台)
(weather) D:\python\rasa\weather\Action>INFO:__main__:Starting action endpoint server...
INFO:rasa_core_sdk.executor:Registered function for 'action_report_weather'.
INFO:rasa_core_sdk.executor:Registered function for 'action_report_scenery'.
INFO:rasa_core_sdk.executor:Registered function for 'action_report_food'.
INFO:rasa_core_sdk.executor:Registered function for 'action_report_hotel'.
INFO:rasa_core_sdk.executor:Registered function for 'action_confirm'.
INFO:__main__:Action endpoint is up and running. on ('0.0.0.0', 5055)
# 开始预测
rasa shell
[...]
Your input -> 北京明天天气如何
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:46:56] "POST /webhook HTTP/1.1" 200 583 0.210861
北京 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:12-1 °C
Your input -> 后天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:05] "POST /webhook HTTP/1.1" 200 504 0.270544
北京 后天 (2020-03-09) 的天气情况为:白天:小雨;夜晚:晴;气温:10--1 °C
Your input -> 那上海呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:13] "POST /webhook HTTP/1.1" 200 512 0.233907
上海 后天 (2020-03-09) 的天气情况为:白天:小雨;夜晚:小雨;气温:15-9 °C
Your input -> 那三亚明天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:26] "POST /webhook HTTP/1.1" 200 584 0.162629
三亚 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:多云;气温:30-23 °C
Your input -> 深圳呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:35] "POST /webhook HTTP/1.1" 200 513 0.199864
深圳 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:28-20 °C
Your input -> 杭州呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:42] "POST /webhook HTTP/1.1" 200 512 0.188495
杭州 明天 (2020-03-08) 的天气情况为:白天:小雨;夜晚:大雨;气温:16-9 °C
Your input -> 今天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:50] "POST /webhook HTTP/1.1" 200 503 0.191735
杭州 今天 (2020-03-07) 的天气情况为:白天:阴;夜晚:小雨;气温:17-9 °C
Your input -> 明天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:47:57] "POST /webhook HTTP/1.1" 200 509 0.212674
杭州 明天 (2020-03-08) 的天气情况为:白天:小雨;夜晚:大雨;气温:16-9 °C
Your input -> 后天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:48:03] "POST /webhook HTTP/1.1" 200 510 0.224308
杭州 后天 (2020-03-09) 的天气情况为:白天:小雨;夜晚:小雨;气温:17-10 °C
Your input -> 香港明天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:48:15] "POST /webhook HTTP/1.1" 200 584 0.209823
香港 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:27-21 °C
Your input -> 伦敦今天呢
正在查询中...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 17:48:26] "POST /webhook HTTP/1.1" 200 385 0.196529
暂不支持查询[伦敦今天]的天气
Your input ->
五 多轮对话设计实现(二)
设计集天气、景点、美食和住宿的多场景旅游综合多伦对话系统。要求对话机器人准确回答天气、景点、美食和住宿多场景间相互切换的提问。
1、功能分析
1. 场景类别
- 天气
- 景点
- 美食
- 住宿
2. 意图分析
- 天气类
地址和日期
地址 + 日期
日期 + 地址
问候和地址和日期
问候 + 地址和日期
问候 + 地址 + 日期
问候 + 日期 + 地址
- 景点类
景点意图有地址
景点意图无地址 + 地址
- 美食类
美食意图有地址
美食意图无地址 + 地址
- 住宿类
住宿意图有地址和日期
住宿意图有地址 + 日期
住宿意图有日期 + 地址
住宿问候意图有地址和日期
问候 + 住宿意图地址和日期
问候 + 住宿意图地址 + 日期
问候 + 住宿意图日期 + 地址
3. 意图转换
1. 天气转天气
- 保留地址转换时间
- 保留时间转换地址
2. 切换景点地址
- 切换地址后回答切换后地址的景点
3. 切换美食地址
- 切换地址后回答切换后地址的美食
4. 住宿转住宿
- 保留地址转换时间
- 保留时间转换地址
4. 场景转换
1. 天气转换景点再转天气
2. 天气转换美食再转天气
3. 天气转换住宿再转天气
4. 景点转换天气再转景点、
5. 景点转换美食再转景点
6. 景点转换住宿再转景点
7. 美食转换天气再转美食
8. 美食转换景点再转美食
9. 美食转换住宿再转美食
10. 住宿转换天气再转住宿
11. 住宿转换景点再转住宿
12. 住宿转换美食再转住宿
3. 场景流程图
4. 预测
# 启动endpoint
python -m rasa_core_sdk.endpoint --actions bot
# 预测
rasa shell
Your input -> 北京后天下雨吗
[...]
127.0.0.1 - - [2020-03-07 21:58:15] "POST /webhook HTTP/1.1" 200 578 0.656985
北京 后天 (2020-03-09) 的天气情况为:白天:小雨;夜晚:晴;气温:10--1 °C
Your input -> 南京呢
小智正在查询[南京后天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 21:58:25] "POST /webhook HTTP/1.1" 200 512 0.260754
南京 后天 (2020-03-09) 的天气情况为:白天:小雨;夜晚:小雨;气温:12-8 °C
Your input -> 明天呢
小智正在查询[南京明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 21:58:32] "POST /webhook HTTP/1.1" 200 509 0.207639
南京 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:15-8 °C
Your input -> 杭州呢
小智正在查询[杭州明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 21:58:39] "POST /webhook HTTP/1.1" 200 512 0.208335
杭州 明天 (2020-03-08) 的天气情况为:白天:小雨;夜晚:大雨;气温:16-9 °C
Your input -> 北京呢
小智正在查询[北京明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 21:59:01] "POST /webhook HTTP/1.1" 200 512 0.220731
北京 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:12-1 °C
Your input -> 有什么风景
小智正在查询[北京的景点]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_scenery'
127.0.0.1 - - [2020-03-07 21:59:11] "POST /webhook HTTP/1.1" 200 299 0.007959
暂不支持[北京]的景点查询
Your input -> 上海呢
小智正在查询[上海的景点]...
[...]
127.0.0.1 - - [2020-03-07 21:59:23] "POST /webhook HTTP/1.1" 200 375 0.005011
上海的景点有:城隍庙、外滩、东方明珠、朱家角古镇
Your input -> 三亚呢
小智正在查询[三亚的景点]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_scenery'
127.0.0.1 - - [2020-03-07 21:59:29] "POST /webhook HTTP/1.1" 200 369 0.006945
三亚的景点有:天涯海角、蝴蝶谷、情人岛、亚龙湾
Your input -> 广州今天下雪吗
小智正在查询[广州今天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 21:59:49] "POST /webhook HTTP/1.1" 200 584 0.380998
广州 今天 (2020-03-07) 的天气情况为:白天:阵雨;夜晚:阵雨;气温:24-20 °C
Your input -> 明天呢
小智正在查询[广州明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 22:00:01] "POST /webhook HTTP/1.1" 200 510 0.217212
广州 明天 (2020-03-08) 的天气情况为:白天:阵雨;夜晚:阵雨;气温:24-20 °C
Your input -> 深圳呢
小智正在查询[深圳明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 22:00:07] "POST /webhook HTTP/1.1" 200 513 0.215811
深圳 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:小雨;气温:28-20 °C
Your input -> 三亚呢
小智正在查询[三亚明天]的天气...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_weather'
127.0.0.1 - - [2020-03-07 22:00:40] "POST /webhook HTTP/1.1" 200 513 0.213490
三亚 明天 (2020-03-08) 的天气情况为:白天:多云;夜晚:多云;气温:30-23 °C
Your input -> 我需要预定一间大床房
小智正在查询[三亚明天]的住宿...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_hotel'
127.0.0.1 - - [2020-03-07 22:00:51] "POST /webhook HTTP/1.1" 200 339 0.007978
三亚明天提供的住宿有:亚特兰蒂斯酒店
Your input -> 苏州呢
小智正在查询[苏州明天]的住宿...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_hotel'
127.0.0.1 - - [2020-03-07 22:01:10] "POST /webhook HTTP/1.1" 200 309 0.011966
苏州明天提供的住宿有:洲际
Your input -> 有什么风景
小智正在查询[苏州的景点]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_scenery'
127.0.0.1 - - [2020-03-07 22:01:34] "POST /webhook HTTP/1.1" 200 351 0.007978
苏州的景点有:寒山寺、拙政园、留园、虎丘
Your input -> 上海呢
小智正在查询[上海的景点]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_scenery'
127.0.0.1 - - [2020-03-07 22:01:58] "POST /webhook HTTP/1.1" 200 375 0.016958
上海的景点有:城隍庙、外滩、东方明珠、朱家角古镇
Your input -> 三亚呢
小智正在查询[三亚的景点]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_scenery'
127.0.0.1 - - [2020-03-07 22:02:05] "POST /webhook HTTP/1.1" 200 369 0.005984
三亚的景点有:天涯海角、蝴蝶谷、情人岛、亚龙湾
Your input -> 有什么好吃的
小智正在查询[三亚的美食]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_food'
127.0.0.1 - - [2020-03-07 22:02:17] "POST /webhook HTTP/1.1" 200 339 0.009944
三亚的美食有:和乐蟹、东山羊、椰子饭
Your input -> 苏州呢
小智正在查询[苏州的美食]...
[...]
DEBUG:rasa_core_sdk.executor:Successfully ran 'action_report_food'
127.0.0.1 - - [2020-03-07 22:02:35] "POST /webhook HTTP/1.1" 200 345 0.006982
苏州的美食有:苏式蜜饯、叫化鸡、桂花糕
Your input ->
六 总结
1、业内发展情况
整体来看,聊天机器人经历了从问答机器人到对话机器人的发展,但目前大部分的聊天机器人都属于问答机器人,也就是只能处理一问一答,不能很好地处理对话,或者说不能处理上下文,并不具备真正的人工智能特征。
聊天机器人还处于发展早期阶段,其在未来得到跨越式发展也是非常具有挑战,最大的挑战之一就是如何访问并获取大量的数据。收集数据后,聊天机器人在交互体验更加拟人化,更好理解、预测场景词汇中还有如下挑战:
- (1)整合语境的挑战:为了生成明智的回复,系统可能需要整合语言语境和物理语境,还可能整合其他类型语境数据如日期/时间/位置/用户信息等。
- (2)一致人格的挑战
- (3)意图与多样性挑战
2、对话系统业内难点
- (1)手工编写的对话策略难以涵盖所有对话场景
- (2)基于统计的方法和基于神经网络的方法都需要大量数据
- (3)需要大量的领域知识、对话知识和世界知识来生成有意义的回复语义表征。
在从少量样本中进行训练,或者在无任何样本的情况下进行信息补全,已解决对话系统的“冷启动”问题。基于深度的强化学习在对话管理领域主要被用于帮助系统在实际交互中通过最大化汇报函数(reward function)学习在特定状态下采取那种回复,从而不断增强对话模型中的优势策略,削弱负面策略的影响。这样一来,用户会觉得系统越来越人性化、个性化。SeqGAN采用对抗网络实现了离散序列数据的生成模型,解决了GAN难应于自然语言处理领域的问题,并且可以被用来选择最优的奖励函数及其参数。
七 主要参考资料
1.《rasa对外接口和core代码分析第1波》https://zhuanlan.zhihu.com/p/76623359
2.《rasa core源码分析第2波-对话管理》https://zhuanlan.zhihu.com/p/76935986
3.《Rasa使用指南01》https://terrifyzhao.github.io/2018/09/17/Rasa%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%9701.html
4.《Rasa使用指南02》https://terrifyzhao.github.io/2019/02/26/Rasa%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%9702.html
5.《深入理解rasa NLU:part1 - 意图分类》https://zhuanlan.zhihu.com/p/84075497
6.《rasa官网 - 使用自定义组件增强Rasa NLU模型》https://blog.rasa.com/enhancing-rasa-nlu-with-custom-components/
7.《基于RASA的task-orient对话系统解析(一)》https://zhuanlan.zhihu.com/p/75517803
8.《rasa对话系统踩坑记》(一到十)https://www.jianshu.com/p/5d9aa2a444a3