人们有时候会用“今天天气不错啊!”这样的方式作为搭讪的开始,通过聊两句天气,展开后续对话。那么,是否也能用类似方法开启和聊天机器人的交互呢?
之前我用的方法是在nlu中定义独立的聊天气intent,如下图。
对于三种天气,分别定义了要下雨了,正在下雨和好天气三个聊天意图,然后在domain中针对这三个intent又分别定义了对应的utter_***话术。同理,stories中也定义了三个新的场景故事。
这么做,的确能以天气为由头开展和rasa bot的对话。但是问题来了,天气的种类远远不止上述三种,那么我是不是要每一种天气开头的聊天都要单独定义一遍?
答案不是不可以,可会让人觉得有点傻。于是,我决定把所有以天气聊天作为开始的对话意图归拢为一条,即talk_about_weather。
同样的,domain里也不需要设置多个utter话术了,直接变成一个action_about_weather,story也合并成一个。做完这三个文件的修改后,接下来怎么在action中实现对话交互呢?
还记得上一篇文章《label+actions实现rasa bot的问答交互-CSDN博客》吗?我在里面通过tracker.get_slot获取label标签,并与自定义的关键字key做配比,从而实现针对性问答。同样的方法,但这次不用get_slot,而是直接获取最新的用户话本(user text)来做配对。要获取rasa聊天记录中最近一次用户话本,可以用:text = tracker.latest_message(‘text’)
如下是完整的对应action代码:
class ActionAboutWeather(Action):
def name(self) -> Text:
return "action_about_weather"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
weaKey = [
["阴天", "看不到太阳"],
["天黑", "阴沉", "天暗"],
["雨"],
["好天气", "太阳", "晴"],
["雾"],
["多云"],
["风"],
["雪"]
]
weather = ["身边带把伞,以防突然下雨。",
"要下雨了,快点回家收衣服。",
"下雨天,还是待在屋子里好。",
"好天气适合去户外走走。",
"雾天走路开个手电。",
"今天的天气还不错。",
"看看家里的门窗关紧了吗?"
"希望雪能积起来,这样就能堆雪人了。"]
wflag = False
n = 0
resp = tracker.latest_message['text']
for wea in weaKey:
for key in wea:
index0 = resp.find(key)
if index0 != -1:
wflag = True
break
if wflag:
break
else:
n += 1
if wflag:
msg = weather[n]
else:
msg = "你说的对。"
dispatcher.utter_message(text=msg)
return [ ]
完成rasa train,启动你的rasa shell,用谈论天气来打开聊天机器人的话匣子吧!