python - 使用 RASA 和 Python 和 Flask 的聊天机器人
问题描述
我正在尝试使用 RASA 学习和创建一个聊天机器人,它必须将输入从 cmdline 传递到作为 Flask API 公开的 Python Dataframe 并获取响应。
所有的点点滴滴都可以单独运行,但是当我拼接在一起时,我无法将输入参数从 RASA cmdline 传递给 Pandas。
以下是我到目前为止所做工作的总体摘要:
- 创建了一个 Panda Dataframe 并将其作为 Flask API 公开。
- 能够手动点击它并在浏览器中查看输出。
- 将 Flask API 路由修改为 "@app.route("/webhook")" 以收集来自 RASA 的输入。
- RASA endpoint.yml 还包含“webhook”地址。
- 创建了一个自定义操作并提到了 domain.yml 文件。自定义操作的内容 - actions.py 如下所述。
- Domain.yml 也有这个声明“action_factory:remote”,我认为它是利用自定义操作。不过不确定。
class ActionBookSearch(Action): def name(self): return 'action_genre_search' def run(self, dispatcher, tracker, domain): import pyflask_api ### File name of the Python Flask code genre_val = tracker.get_slot('genre') ### Defined slots in domain.yml print(genre_val) ### This always gives None :( That's the issue. Not able to get the value from cmdline genre_results = pyflask_api.get_genre(genre="Action") ### Method present in pyflask_api.py code if genre_results: dispatcher.utter_message(genre_results) return [SlotSet("genre", genre_results if genre_results is not None else "Nothing Matched. Please Try again")]
解决方法:
由于我无法从 Bot cmdline 获取值,因此我在下面的行中进行了硬编码以进行检查:
Genre_results = pyflask_api.get_genre(genre="Action")
该值将发送到 Flask 代码并从 Panda 数据帧中提取数据,并将响应成功返回到命令行。
需要做什么 :
因此,唯一未决的事情是我应该从 cmdline 成功获取值,以便每当 print(genre_val) 在 actions.py 代码中执行时,它应该返回它从 cmdline 获取的值,而不是像现在那样返回“None”。
更新 :
domain.yml 的内容:
entities:
- genre
slots:
genre:
type: text
action_factory: remote
intents:
- greet
- book_search
- thanks
- goodbye
actions:
- utter_greet
- utter_goodbye
- action_genre_search
- utter_happy_reading
stories.md 的内容:
#create your story here
## greet
* greet
- utter_greet
## get genre
* book_search{"genre": "Fantasy"}
- action_genre_search
## good bye
* goodbye
- utter_goodbye
## Thank you
* thanks
- utter_happy_reading
nlu_data.md 的内容:
## intent:greet
- hey
- hello
## intent:book_search
- I want to read some Fantasy books
- I want to read some Classics books
- I want to read some Fictional books
## intent:thanks
- perfect
- very good
## intent:goodbye
- bye
解决方案
您必须注释您的 NLU 示例,例如:
## intent:book_search
- I want to read some [Fantasy](genre) books
- I want to read some [Classics](genre) books
- I want to read some [Fictional](genre) books
您还必须添加更多示例以使实体提取更加健壮。要完成这项工作,请确保ner_crf在您的 NLU 管道中。
推荐阅读
- javascript - jQuery:如果单击相同的元素,则删除类
- asp.net-mvc - 使用 .Net Core 发送 HTTP Post
- python - 取张量中每一行的最大值 [PyTorch]
- python - 如何使用 BeautifulSoup 提取文本 FAST 'N FREE
- r - 计算在 R 中的骰子数量上掷出的 6 的数量
- apache - 我应该将黑客/黑客脚本重定向到哪里?
- python-3.x - 导入 Statsmodels 问题
- excel - Excel VBA中的CountIf和SumProduct
- c++ - extern "C" Demangling 导致奇怪的链接器错误
- php - 在数组中复制行的最高效方式