【问题标题】:Rasa agent stop responding after one story has spokenRasa 特工在讲完一个故事后停止回应
【发布时间】:2019-02-12 12:35:27
【问题描述】:

我使用 rasa 编写了一个简单的机器人。为了处理消息,我创建了烧瓶应用程序并将代理加载到该应用程序中。我从请求中接收到用户消息和 ID,并将其放入代理的 handle_text 方法,然后我得到了响应。问题是,在我讲完一个在我的 story.md 中定义的故事后,我的代理停止了回答。

这是我的烧瓶应用程序

app = Flask(__name__)


# Define rasa interpreter
interpreter = None

# Define rasa agent
agent = None


@app.route('/')
def index():

    # Receive message from request
    message = request.args.get('msg')

    # Receive user id from request
    user_id = request.args.get('uid')

    #  Validation
    if not message:
        return 'No message specified in field \'msg\''
    if not user_id:
        return 'No user id specified in field \'uid\''

    # Put received message into rasa agent
    answers = agent.handle_text(message, sender_id=user_id)

    # Define text for the response
    text = None

    if len(answers) > 0:
        text = "User: {} | {}".format(user_id, answers[0].get('text'))
    else:
        text = "User: {} | Nothing to answer".format(user_id)

    return text


if __name__ == '__main__':

    # Load rasa interpreter
    interpreter = RasaNLUInterpreter(NLU_PATH)

    # Load rasa agent
    agent = Agent.load(CORE_PATH, interpreter=interpreter)

    app.run()


我的 stories.md 是

## Simple flow
* greet
  - utter_greet
* bye 
  - utter_bye 
## Order pizza
* greet
  - utter_greet
* order_pizza_type
  - utter_finish_order_pizza
* bye
  - utter_bye
## Story
* order_pizza_type
  - utter_finish_order_pizza
## Generated Story -1054914010798310995
* greet
    - utter_greet
* order_pizza_type{"Country": "mexican"}
    - utter_finish_order_pizza
* bye
    - utter_bye
## New Story
* greet
  - utter_greet
* order_pizza_wish
  - utter_finish_order_pizza
* bye
    - utter_bye

还有我的 config.yml

language: "en"

pipeline:
- name: "nlp_spacy"
- name: "tokenizer_spacy"
- name: "ner_crf"
- name: "tokenizer_whitespace"
- name: "intent_featurizer_count_vectors"
- name: "intent_classifier_tensorflow_embedding"
  intent_tokenization_flag: true
  intent_split_symbol: "+"

policies:
  - name: "KerasPolicy"
    featurizer:
    - name: MaxHistoryTrackerFeaturizer
      max_history: 5
      state_featurizer:
        - name: BinarySingleStateFeaturizer
  - name: "MemoizationPolicy"
    max_history: 5
  - name: "FallbackPolicy"
    nlu_threshold: 0.4
    core_threshold: 0.3

我的预期结果

$ curl -X GET "https://localhost?msg=hello&uid=1"
$ curl -X GET "https://localhost?msg=I want to order pizza&uid=1"
$ curl -X GET "https://localhost?msg=Bye&uid=1"
$ curl -X GET "https://localhost?msg=hello&uid=1"

回应

> User: 1 | Hey! How are you?
> User: 1 | Ok I will deliver pizza for you
> User: 1 | Bye
> User: 1 | Hey! How are you?

但我的实际结果是

$ curl -X GET "https://localhost?msg=hello&uid=1"
$ curl -X GET "https://localhost?msg=I want to order pizza&uid=1"
$ curl -X GET "https://localhost?msg=Bye&uid=1"
$ curl -X GET "https://localhost?msg=hello&uid=1"

回应

> User: 1 | Hey! How are you?
> User: 1 | Ok I will deliver pizza for you
> User: 1 | Bye
> User: 1 | Nothing to answer

您可以看到,在讲完一个故事情节后,第二条消息“你好”没有任何回应。

【问题讨论】:

  • 你能与所有这些文件共享整个项目吗?
  • 好的,我会放到Github上。一分钟。
  • 您可以在交互式学习模式下调试您的机器人。交互式学习模式会告诉您机器人识别的所有内容以及它会如何反应。最重要的是,您可以直接纠正错误。
  • 下单后重新开始互动或许会有帮助

标签: python flask rasa-nlu rasa-core


【解决方案1】:

与 cmets 中的建议相同,我建议使用 interactive learning 调试您的机器人并创建新的培训故事。目前您的训练数据非常稀少。

您是否使用augmentation 进行培训?如果您没有以不同方式指定参数,则默认扩充设置为20

如果您正在使用增强,我建议您还添加另一个短篇故事来处理独立的greet

## Simple flow
* greet
  - utter_greet

还有一点: 建议使用一般意图并通过识别的实体来区分它们。 因此,与order_pizza_typeorder_pizza_wish 相比,最好有一个意图order_pizza 甚至order,然后是food_typeproduct_to_order 的插槽(例如pizza)等等。如果您有非常相似的意图,例如order_pizza_typeorder_pizza_wish,NLU 将很难区分它们。

【讨论】:

  • 感谢您的帮助。我添加了更多训练数据,它解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2017-04-20
  • 2014-02-14
相关资源
最近更新 更多