大型数据集(2000+)的RASA映射常见问题解答

时间:2018-11-03 10:06:52

标签: nlp artificial-intelligence chatbot rasa-nlu rasa-core

RASA是由RASA NLU + Core组成的,我已经测试过,了解一些有关它的内容。 我尝试将其放入示例实践中,并且它的工作原理是完美的。

我计划将其带入下一个级别,我希望借助“ tensorflow”后端创建基于RASA堆栈的FAQ系统。

我获得了1200多对问题和答案。首先,NLU将负责理解和分类意图以及实体提取。 第二,它将json响应传递到RASA core,Answers将映射或响应给用户。听起来很简单,但是在我去检查一下RASA时,它给出了一些不同的东西。通常,RASA核心将根据预定义的故事以及==>“ utter_”响应用户。预定义的故事很好,但仅适用于少量数据集。我们必须手动编写。

当数据集或基于知识库的内容越来越大(例如1000+或5000+)时,如何处理,我们无法手动进行映射。我尝试环顾四周,但找不到任何合适的方法来解决它。

以前,我使用[Retrieval Model] Sklean Tfidf-vectorizer作为单词袋以及consine-similairy来比较并返回最相似的问题索引,当找到索引时Answer将基于索引进行选择,但是这种解决方案是无效的,因为含义会丢失,还会带来更多问题。

任何人对此都有很好的解决方案?

谢谢

2 个答案:

答案 0 :(得分:2)

首先,我想澄清一下实际架构:

  1. 用户将其消息发送到聊天机器人
  2. Rasa Core拾取这些消息并将其传递给Rasa NLU,后者进行意图识别(理解用户的目标)并从输入中提取实体
  3. 根据公认的意图,实体和对话历史记录,Rasa Core会预测机器人的下一步操作

在您的情况下(FAQ机器人,很多问题),您可以尝试以下操作,从而得出相对简单的故事:

## User asks for price
* ask_location{"place": "a entity which is extracted by NLU}
  - action_utter_place

# User asks for location
* ask_price{"item": "a entity which is extracted by NLU}
  - action_utter_price

[...]

当然,我会添加更多路径,例如如果用户对答案不满意,或者用户尝试与您的等闲聊。

在下一步中,我将在您的NLU训练数据中提供所有可能的问题,并根据问题所在提取不同的实体。例如:

## intent:ask_location
- Where is the [cinema](place)
- How do I get to the next [supermarket](place)
- What's the closest [doctor](place)

## intent:ask_price
- How much is it
- What does it cost
- How much is a [ticket](item) for the [cinema](place)

总而言之,我不会对每个问题做一个意图,而是将几个问题归为一个意图,然后提取实体,将其缩小为具体问题。

然后可以使用CMS生成答案,也可以使用custom actions。然后,根据提取的实体(例如 place item ),您可以查询数据库并生成答案。

答案 1 :(得分:0)

我不确定您说 *but this kind of solution is not effective since the meaning will lost and much more problem.*在这里的意思。对于单回合问题/答案,官方Rasa方法将是按照您的建议使用检索操作。我们发现这有点麻烦,并且在通用编码器嵌入的基础上实现了一个简单的分类器。

即该机器人具有ask_faq意图,可以将所有〜1000个单匝问题分组。所有这些都映射到动作action_answer_faq。在行动中,我们专门针对这〜1000个问题构建的二级分类器将用于推断正确的响应ID。内部数据库将包含响应文本(可以根据业务用户的需要进行更改,而无需更改模型)。