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将基于索引进行选择,但是这种解决方案是无效的,因为含义会丢失,还会带来更多问题。
任何人对此都有很好的解决方案?
谢谢
答案 0 :(得分:2)
首先,我想澄清一下实际架构:
在您的情况下(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。内部数据库将包含响应文本(可以根据业务用户的需要进行更改,而无需更改模型)。