【问题标题】:Chatbot using RASA with Python and Flask使用 RASA 和 Python 和 Flask 的聊天机器人
【发布时间】:2019-01-04 19:51:18
【问题描述】:

我正在尝试使用 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

story.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

【问题讨论】:

  • 嗨 JKC,插槽是如何设置的?您是否为此目的使用 NLU?如果是这样,请检查插槽是否设置正确?您也可以分享您的 stories.md 文件吗?
  • @KarthikSunil 我在 domain.yml 文件中包含了插槽,并在 stories.md 中引用了它们,但不确定它是否设置正确:(。也许你可以通过参考这些内容来帮助我我在问题中更新了
  • @JKC: action_factory: remote 不是必需的。将action_genre_search 添加到actions 部分就足够了。这似乎是一个实体提取问题。您在使用 NLU,NLU 训练数据如何,您的管道配置是什么?
  • 嗨@Tobias 是的,我正在使用 NLU,我的 NLU 训练数据现在已添加到问题中(最后)。请看一下

标签: python flask rasa-nlu rasa-core


【解决方案1】:

你必须annotate your NLU examples 例如:

## 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 管道中。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多