📜  如何从 Rasa Chatbot 的自定义操作发送自定义 Json 响应?

📅  最后修改于: 2022-05-13 01:55:09.082000             🧑  作者: Mango

如何从 Rasa Chatbot 的自定义操作发送自定义 Json 响应?

Rasa是一个开源机器学习框架,用于自动化基于上下文文本语音的助手。 Rasa NLU借助其预训练的 NLU 数据理解正确的 Intent。 Rasa Core决定下一步做什么,并根据与训练故事同步的回复。它还具有存储实体(存储以备将来使用的名词类型特定信息)的能力。默认情况下,它可以响应文本、图像链接、按钮对象等。

安装

要开始使用您自己的上下文助手,只需在下面提到的命令的帮助下安装 Rasa:

pip install rasa

确保您安装了最新版本的PIP这将安装最新版本的 rasa 2.0,如果您在使用Python版本时遇到任何困难,请安装Python 3.6.8创建一个虚拟环境。

创建 Rasa 项目

创建 rasa 项目非常简单,rasa 为您提供了一个内置命令来为您创建示例项目。

rasa init 

rasa python 初始化



成功执行此命令后,您将获得一个包含文件列表的目录结构,您可以通过在终端上键入“ls -la”来检查创建的文件。通过它,我们将能够训练我们的 rasa 模型,以根据我们的要求执行各种任务。

  • “data”文件夹中的nlu.yml文件包含用于提取意图和实体的各种训练数据。
  • “data”文件夹中的stories.yml文件包含用于训练聊天机器人的示例用户故事,rasa 核心将使用它并预测下一个合适的动作/响应。
  • config.yml文件包含与机器学习管道相关的配置,nlu 和核心模型将使用该管道对句子进行预处理和使用。
  • domain.yml文件包含意图、实体、响应和操作的列表,这些内容中的每一个都应该在域文件中列出。
  • actions 文件夹中的actions.py文件包含 domain.yml 文件中定义的每个自定义操作的各种Python函数。这是一个非常有用的文件,因为它包含将由机器人针对特定意图执行的操作定义,无论是对数据执行一些计算、调用 API 以及Python函数可以执行的更多操作。

我们在“rasa init”的帮助下创建的示例项目将自动提供写入这些文件的格式。我们只需要添加我们自己的训练数据,列出意图、响应并编写所需的自定义操作,我们就可以开始了。

我们可以借助下面写的简单命令来训练我们的模型:

rasa train

模型训练好后,我们可以通过下面提供的简单命令在终端中测试我们的模型:

rasa shell 

有了这个,我们可以开始与机器人的对话并测试我们训练的模型。我们还可以使用–debug标志来查看各种参数,例如置信度、检测到的意图、下一个响应、捕获的实体等,这些将帮助我们了解模型的见解,并可以以更好的方式进一步训练模型得到更准确的答复。



自定义操作

Rasa 为其用户提供了很多功能,它可以通过编写带有一些方法的Python类来执行任何任务来满足要求。这些函数写在 actions.py 文件中。每个函数都附有一个特定的动作名称,以“action_”关键字开头,应该在 domain.yml 文件中以及在 stories.yml 文件中编写的用户故事中准确提及。此自定义操作在 nlu 捕获特定意图后触发,它将执行编码任务,然后返回所需的响应。

下面是示例自定义操作代码,以便更好地理解:

我们可以通过打开一个新的终端窗口来启动动作服务器,导航到项目目录并运行以下提供的命令:

rasa run actions

在自定义操作方法中检索存储的实体

让我们看看下面的命令,它将帮助我们检索本地机器人内存中存在的存储实体:

variable_name = tracker.latest_message['entities']

“跟踪器”保留最近对话和存储实体的记录。上面的命令将返回一个存储实体的数组。我们将不得不遍历这个数组来获得我们想要的实体值。

发送自定义 JSON 响应

通常,机器人发送文本消息(字符串)作为响应(请参阅上面给出的屏幕截图),但是当我们必须以 JSON 数据的形式发送一些自定义响应以满足最终用户的需求时,挑战就来了。机器人。

让我们定义一个用例,我们必须使用自定义响应并将 JSON 数据发送回 UI 通道。

假设 Rasa-bot 在对话之间存储了一些用户数据,现在用户想要他/她提供的详细信息列表。以 JSON 数据的形式发送自定义响应的任务来了,这将帮助前端开发人员分离响应并轻松地在 UI 中填充数据。



下面是编写自定义操作方法的Python代码,它将检索用户存储的实体并返回适当的值:

Python3
class ListUserDetails(Action):
  
    def name(self) -> Text:
        # Name of the action mentioned in the domain.yml file
        return "action_list_user_details"
  
    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
  
        # It will return array of entities
        entities = tracker.latest_message['entities']
  
        # Iterating through the array to retrieve the desired entity
        for e in entities:
            if e['entity'] == "user_name":
                entity_name = e['value']
            elif e['entity'] == "city_name":
                entity_city = e['value']
            elif e['entity'] == "designation":
                entity_designation = e['value']
  
        dispatcher.utter_message(
            template="utter_user_details",
            name=entity_name,
            city=entity_city,
            designation=entity_designation
        )
  
        return []


上面写的是 Rasa 聊天机器人的示例自定义操作Python代码,用于在理解用户的确切意图时执行特定的所需操作。这里 Rasa NLU 获取用户的消息并找出正确的意图,在上面的例子中是“列出所有用户详细信息”。

在此之后,Rasa 调用与特定意图关联的自定义操作 (action_list_user_details) 并执行任务。在上面的代码中,我们在跟踪器的帮助下获取作为实体存储在机器人本地内存中的用户详细信息,例如名称、城市和名称,并将获取的结果作为单个响应发送到模板“utter_user_details”dispatcher.utter_message()的帮助下

上面的代码将调用 domain.yml 文件中提到的“utter_user_details”响应,并将获取的用户详细信息作为参数。最后,我们必须使用 custom 关键字在 domain.yml 文件中写入响应“utter_user_details”,以将 JSON 对象发送到通道作为对用户消息的响应。下面是响应的格式:

按照此方法,具有所提供属性的 JSON 响应将发送到相应的输出通道。输出 下面的代码看起来与此类似:

类似地,使用自定义响应,我们可以以 JSON 格式发送所需的数据,前端开发人员可以很好地处理这些数据。