提问人:Stev Jane 提问时间:11/3/2018 最后编辑:Hack-RStev Jane 更新时间:5/28/2023 访问量:1299
使用 Rasa 映射大型数据集的常见问题解答 (2000+)
Mapping FAQ with Rasa for large dataset (2000+)
问:
RASA 由 Rasa NLU + Core 组成,我已经测试过了,我了解它的某些部分。我试着把它放到样本实践中,它工作得很好。
我计划将其提升到一个新的水平,我希望在“tensorflow”后端的帮助下创建一个基于 RASA 堆栈的 FAQ 系统。
我得到了超过1200 +对问题和答案。首先,NLU 将负责理解和分类意图以及实体提取。
其次,它将 JSON 响应传递给 Rasa 核心,其中 Answers 将映射或响应回用户。这听起来很简单,但是当我去检查Rasa时,它给出了一些不同的东西。通常,RASA 核心会根据预定义的故事以及 ==> “utter_” 来响应用户。预定义的故事很好,但仅适用于少量数据集。我们必须手动编写它。
当数据集或基于知识的数据集越来越大(例如1000+或5000+)时如何处理,我们无法手动映射它。我试着环顾四周,但还没有找到任何合适的方法来处理它。
以前,我使用[检索模型] sklearn TfidfVectorizer作为单词袋以及余弦相似度来比较并返回最相似的问题索引,当找到索引时,答案会根据索引进行选择,但这种解决方案是无效的,因为意义会丢失,问题更多。
有人对此有很好的解决方案吗?
答:
首先,我想向实际架构澄清一下:
- 用户向聊天机器人发送消息
- Rasa Core 获取这些消息并将它们传递给 Rasa NLU,后者进行意图识别(了解用户的目标)并从输入中提取实体
- 根据对话的公认意图、实体和历史记录,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
[...]
当然,我会添加更多路径,例如,如果用户对 anwer 不满意,或者用户尝试与您的聊天机器人闲聊等。
在下一步中,我将提供 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 生成答案或自定义操作。然后,根据提取的实体(例如地点和项目),您可以查询数据库并生成答案。
评论
我不完全确定你在这里说的是什么意思.对于单回合问题/答案,官方 Rasa 方法是按照您的建议使用检索操作。我们发现这有点麻烦,所以我们在 Universal Encoder 嵌入之上实现了一个简单的分类器。 *but this kind of solution is not effective since the meaning will lost and much more problem.*
即机器人有一个意图,在该意图下,所有 ~1000 个单轮问题都被分组。所有这些都映射到一个动作。在操作中,我们专门为这 ~1000 个问题构建的辅助分类器将用于推断正确的响应 ID。内部数据库将包含响应文本(可以根据业务用户的需要进行更改,而无需更改模型)。ask_faq
action_answer_faq
评论