这段时间主要是根据理解到的rasa的原理,实现一个可以调用天气功能的bot。简要分享一下自己遇到的坑,以及解决方式。
01 当测通要调用的天气接口的API后,选择要传的参数城市后,才能得到不同城市的天气情况。所以如何定位到位置信息,是需要解决的第一步。
rasa提供了实体(entity),通过实体可以将地址信息(address)识别出来。但是有一个问题需要注意,因为我和bot的对话是用中文写的,所以在配置pipeline的时候,要注意到
自带的WhitespaceTokenizer是不会识别中文实体的,所以要改为可以识别中文实体的component,我选择的是jieba自带的compoent(JiebaTokenizer),这个组件可以识别中文的实体信息,一定要把language改为'zh'。
02 通过response的action调用api action,在action.py文件中配置天气的函数。然后获得天气的信息后,通过
dispatcher.utter_message(text=detail)
返回给user。
03在rasa train的时候,遇到一个问题,当我问完具体位置的天气怎么样的时候,bot却预测不到action的信息。而这个信息在story的部分是有设置的。
- story: request_weather
steps:
- intent: greet
- action: utter_greet
- intent: weather_inform
- action: action_ask_weather
- intent: affirm
- action: utter_thanks
- intent: goodbye
- action: utter_goodbye
如代码中的action_ask_weather并没有被识别出来,当把pipeline中core部分的RulePolicy去掉后,就可以调用到action_ask_weather了。
04 在action.py中,是通过track的slot来捕获,识别到的实体部分的。所以要把实体可以在action.py中调用得到,一定要通过slots记住实体,通过get_slot获得。
address=tracker.get_slot('address')
entities:
- address
slots:
address:
type: text
influence_conversation: false
05 在识别出action的api后,在调用后面的内容的时候,发现每次预测的都是action调用的api部分,并没有按照自己的story部分的情节去进行。然后重新回到pipeline部分,将epoch的100改为300,然后就可以正常识别到后面的内容了。可能的原因是100的时候,泛化能力还是不强的原因吧。
06 一定要细心,我发现在这次设计bot的时候,对于不熟悉的事情,一定要遵照原有的格式进行,而不是自己瞎折腾。一定要细心,我就是因为这个问题,浪费了很多本可以去做别的事情的时间。
07 rasa shell --debug这个命令很有用,可以看到是哪里出错误了,对于理解rasa可以更方便,也更容易找到自己的错误。