什么是Rasa智能机器人?如何与LLM结合?

技术
前言

之前写过一篇介绍用Rasa结合类似于GPT这种LLM应用的项目:RasaGpt——一款基于Rasa和LLM的聊天机器人平台

在文章发出来后收到一些反馈,很多人对于Rasa也不太了解。本文会从部署安装、常见概念、框架结构、应用示例几部分展开,来重点介绍一下Rasa。

笔者自己本地上布署了一个用于查看天气预报的Rasa项目,运行后效果如下:

picture.image

实际上,在AI应用风起云涌的今天,正如在RasaGPT项目中描述的那样,如果我们能在Rasa的基础上结合大模型的能力,必定也能够创造出一些特别有意思的应用。

Rasa与大模型结合的案例:RasaGpt——一款基于Rasa和LLM的聊天机器人平台

一、介绍、部署安装

介绍

Rasa是一个集成的开源对话机器人框架,包括语音和文本对话接口、核心对话管理和语言理解组件,如下所示:

1.对话流程管理:控制整个对话流程和状态的Tracker组件和DialoguePolicy组件。 2.语言理解:处理用户输入文本并提取关键信息的RasaNLU组件。 3.对话生成:生成回答并转化为最终输出的RasaCore组件。 4.连接器和API:与用户交互的SDK和API(例如REST,WebSockets,Telegram etc.)组。 5.对话数据和实体存储:对话的复杂性和机器人的智能性可以通过训练模型来提高。为此,Rasa提供了用于存储训练、测试和验证数据的文件格式和API。

如果你还没有一个 Rasa 项目,你可以在 Docker 中构建一个,而无需在本地机器上安装 Rasa。如果你已经有一个满意的模型,参见 部署 Rasa 助手[1] 了解如何部署你的模型。

安装 Docker

如果你不确定是否已安装 Docker,可以运行以下命令进行检查:


        
            

          docker -v
        
      

如果你的机器上已安装 Docker,输出应显示你所安装的 Docker 版本。如果命令无法执行,你将需要安装 Docker。详细信息请参阅 Docker 安装[2]。

设置你的 Rasa 项目

就像从头开始创建一个项目一样,你可以使用 rasa init 命令创建一个项目。唯一的区别是你将在 Docker 容器内运行 Rasa,使用镜像 rasa/rasa。要初始化你的项目,请运行:


        
            

          docker run -v $(pwd):/app rasa/rasa:3.5.10-full init --no-prompt
        
      

这个命令的含义是什么呢?

-v $(pwd):/app 将你的当前工作目录挂载到 Docker 容器内的工作目录。这意味着你在电脑上创建的文件将在容器内可见,而在容器内创建的文件将会同步回你的电脑。 •rasa/rasa 是要运行的 Docker 镜像的名称。'3.5.10-full' 是标签的名称,用于指定版本和依赖关系。 •Docker 镜像以 rasa 命令作为入口点,这意味着你无需键入 rasa init,只需键入 init 即可。

运行此命令将产生大量的输出。具体发生了什么呢?

•创建了一个 Rasa 项目。 •使用项目的训练数据训练了一个初始模型。

要检查命令是否成功完成,请查看你的工作目录的内容:


        
            

          ls -1
        
      

初始项目文件以及包含训练模型的 models 目录应该都在其中。

注意

如果遇到权限错误,可能是因为 rasa/rasa 镜像按照最佳实践以用户 1001 运行,以避免给容器赋予 root 权限。因此,这些容器创建的所有文件将归用户 1001 所有。如果你想以不同的用户身份运行容器,请参阅 Docker 文档[3]。

与助手交互

要与你的新训练的助手交谈,请运行以下命令:


        
            

          docker run -it -v $(pwd):/app rasa/rasa:3.5.10-full
        
      

这将启动一个 shell,在这里你可以与你的助手聊天。请注意,此命令包括 -it 标志,这意味着你正在以交互方式运行 Docker,并且可以通过命令行输入内容。对于需要交互输入的命令,比如 rasa shellrasa interactive,你需要传递 -it 标志。

训练模型

如果你编辑了任何训练数据或编辑了 config.yml 文件,你需要重新训练你的 Rasa 模型。你可以通过运行以下命令来实现:


        
            

          docker run -v $(pwd):/app rasa/rasa:3.5.10-full train --domain domain.yml --data data --out models
        
      

这个命令中发生了什么呢?

-v $(pwd):/app:将你的项目目录挂载到 Docker 容器内,以便 Rasa 可以在你的训练数据上训练模型。 •rasa/rasa:3.5.10-full:使用标签为 '3.5.10-full' 的 Rasa 镜像。 •train:在容器内执行 rasa train 命令。更多信息请参阅 命令行界面[4]。

在这种情况下,我们还传递了域文件、训练数据和模型输出目录的位置值,以展示如何自定义这些值。你也可以省略它们,因为我们传递了默认值。

自定义你的模型

选择一个标签

所有 rasa/rasa 镜像标签都以一个版本号开始。当前版本是 3.5.10。标签包括:

{version}{version}-full{version}-spacy-en{version}-spacy-de{version}-spacy-it{version}-mitie-en

{version}-full 标签包含了所有可能的流水线依赖项,允许你根据需要自定义 config.yml,无需担心缺少依赖项。纯粹的 {version} 标签包含了运行 rasa init 创建的默认流水线所需的所有依赖项。

为了使镜像尽可能小,我们还发布了不同依赖项的 rasa/rasa 镜像的不同标签。有关与你的流水线相关的更多依赖项信息,请参阅 附加依赖项[5]。例如,如果你使用了来自 spaCy 或 MITIE 的预训练词向量的组件,你应该选择相应的标签。

如果你的模型有一个标签中没有包含的依赖项(例如,不同的 spaCy 语言模型),你可以构建一个扩展了 rasa/rasa 镜像的 Docker 镜像。

注意

你可以在 DockerHub[6] 上查看 Rasa Docker 镜像的所有版本和标签的列表。

注意

latest 标签对应于最新稳定版本的构建。

添加自定义组件

如果你在 config.yml 中使用了自定义的 NLU 组件或策略,你需要将模块文件添加到你的 Docker 容器中。你可以通过挂载文件或将其包含在你自己的自定义镜像中来实现。确保你的模块位于 Python 模块搜索路径中,可以通过设置环境变量 PYTHONPATH=$PYTHONPATH:<你的模块所在目录> 来实现。

添加自定义动作

为了创建更复杂的助手,你可能需要使用自定义动作[7]。继续上面的例子,你可能想添加一个动作来告诉用户一个笑话来让他们开心起来。

使用 Rasa SDK 构建一个自定义动作,编辑 actions/actions.py,例如:


          
import requests
          
import json
          
from rasa_sdk import Action
          

          
class ActionJoke(Action):
          
    def name(self):
          
        return "action_joke"
          

          
    def run(self, dispatcher, tracker, domain):
          
        request = requests.get('http://api.icndb.com/jokes/random').json() # make an api call
          
        joke = request['value']['joke'] # extract a joke from returned json response
          
        dispatcher.utter_message(text=joke) # send the message back to the user
          
        return []
      

data/stories.yml 中,将 utter_cheer_up 替换为自定义动作 action_joke,告诉你的机器人使用这个新动作。

domain.yml 中,添加一个自定义动作的部分,包括你的新动作:


          
actions:
          
- action_joke
      

在更新了你的域和故事之后,你需要重新训练你的模型:


        
            

          docker run -v $(pwd):/app rasa/rasa:3.5.10-full train
        
      

你的动作将在与 Rasa 服务器分开的服务器上运行。首先创建一个网络来连接这两个容器:

创建名为 my-project 的 Docker 网络:


        
            

          docker network create my-project
        
      

然后可以使用以下命令运行动作服务器:


        
            

          docker run -d -v $(pwd)/actions:/app/actions --net my-project --name action-server rasa/rasa-sdk:3.5.1
        
      

这是命令中发生的事情:

-d:以分离模式运行容器,以便可以在同一个窗口中运行 Rasa 容器。 •-v $(pwd):/app:将项目目录挂载到 Docker 容器中,以便动作服务器可以运行 actions 文件夹中的代码。 •--net my-project:在特定网络上运行服务器,以便 Rasa 容器可以找到它。 •--name action-server:为服务器指定一个特定的名称,以供 Rasa 服务器引用。 •rasa/rasa-sdk:3.5.1:使用标签为 3.5.1 的 Rasa SDK 镜像。

由于动作服务器以分离模式运行,如果要停止容器,请使用 docker stop action-server。您也可以随时运行 docker ps 查看当前正在运行的所有容器。

要指示 Rasa 服务器使用动作服务器,您需要告诉 Rasa 动作服务器的位置。在 endpoints.yml 中添加以下端点,并引用您为服务器指定的 --name(在本例中为 action-server):


          
action_endpoint:
          
  url: "http://action-server:5055/webhook"
      

现在,您可以再次通过 shell 命令与您的机器人交互:


        
            

          docker run -it -v $(pwd):/app -p 5005:5005 --net my-project rasa/rasa:3.5.10-full
        
      

注意

如果您停止并重新启动 action-server 容器,可能会出现以下错误:


          
docker: Error response from daemon: Conflict. The container name "/action-server" is
          
already in use by container "f7ffc625e81ad4ad54cf8704e6ad85123c71781ca0a8e4b862f41c5796c33530".
          
You have to remove (or rename) that container to be able to reuse that name.
      

如果发生这种情况,说明您已经有一个(停止的)使用相同名称的容器。您可以通过以下命令删除它:


        
            

          docker rm action-server
        
      

部署您的助手

在您的机器人上工作,直到您拥有一个可以处理正常流程的最小可行助手。之后,您将希望将您的模型部署以从真实的测试用户那里获得反馈。为此,您可以通过我们的推荐部署方法之一[8]部署您创建的模型。

二、常见概念

在Rasa中,常见的概念及其作用包括:

1.Entity(实体):指的是消息中的具体元素,例如日期、时间、人名、位置等。在Rasa中,实体的识别与NER(Named Entity Recognition)相关。 2.Intent(意图):指的是用户在发送消息时所表达的意图,例如询问天气、预定餐厅、查询航班等。在Rasa中,意图的识别与NLU(Natural Language Understanding)相关。 3.Domain(领域):指的是对话机器人所涉及的问题域,例如餐厅预定、机票预订、天气查询等。在Rasa中,领域的定义包括实体、意图、槽、动作以及对话策略等。 4.NLU(自然语言理解):指的是对话机器人中的一部分,负责将用户发送的自然语言文本转换为机器可读的结构化数据,例如意图和实体。在Rasa中,NLU使用机器学习算法和自然语言处理技术来完成这一任务。 5.槽(slot):指的是与领域相关的关键数据,例如时间、地点、人名、产品名称等。在Rasa中,槽用于保存对话机器人与用户之间的状态信息,例如查询到的结果、正在进行的订单等。 6.Action(动作):指的是在对话中由对话机器人执行的操作或回应,例如展示菜单、提供预订服务、回答问题等。在Rasa中,动作可以是特定的对话策略,也可以是对外部系统的调用(例如数据库等)。 7.模板(templates):指的是对话机器人在生成回应时所用到的文本,例如“您需要订购什么菜品?”等。在Rasa中,模板用于定义对话机器人的快速回应,以便提升用户体验。

总而言之,上述各个概念在Rasa中都扮演着重要的角色,它们共同构成了一个完整而强大的对话机器人系统。

在Rasa框架中,以下概念扮演着不同的角色,并负责不同的任务:

•Entity(实体):指一段文本中的具体对象,比如人名、公司名称或日期等。在对话过程中,实体可以用来输入或输出特定类型的信息。例如,消息中包含了“我要预订纽约的机票”,在这条消息中,“纽约”就是一个实体。通过实体的提取,我们就可以获取到用户需要预订哪个地方的机票。 •Intent(意图):指用户在发出某条消息时需要实现的任务或目的。例如,用户有可能向我们的客服小姐姐询问机票预订相关问题,这个意图就是“询问机票信息”。在对话中,通过识别用户的意图,我们就可以有针对性地回答他们的问题,提供特定的服务。 •Domain(领域):指对话机器人的任务和目标。在Rasa中,我们通过定义domain.yml文件定义机器人的针对性和目标领域,告诉机器人如何回答用户的提问、如何执行任务、如何操作数据等。 •NLU(自然语言理解):指对自然语言文本进行解析、分类、理解的过程。在Rasa中,我们使用Rasa NLU模块进行自然语言文本的解析和分类。利用NLU模块,我们可以识别意图和实体,并将其转化成可执行任务。 •Slot(槽):指在对话中需要预留的某些位置,用来获取和存储某些值。槽可以存储关于用户状态和机器状态的信息。槽可以动态更新,在对话流程中累加信息。例如,在机票预订流程中,我们需要获取用户的出发地点、目的地点、航班日期等信息。通过定义对应的槽,我们就可以获取和存储用户输入的相关信息。 •Action(动作):指在对话中需要执行的具体任务和操作。在Rasa中,我们定义一个由动作构成的action.py文件。动作可以是一个返回文本的响应,可以是一个客户端API调用,也可以是一个数据库查询等。在对话流程中当用户输入意图时,机器人会响应对应的动作,从而提供相应的服务。 •Template(模板):指在对话中用于响应某个特定意图的文本或消息。在Rasa中,我们可以定义具有多个可替换槽的模板,并用填充槽来完成消息的组装。在对话中,当用户输入了特定意图时,机器人会使用相应的模板来回答用户提问或完成任务。

总的来说,以上每个概念都包含了在对话机器人中的特定角色和任务,以此来负责对话流程和任务的执行。在Rasa的框架之下,我们可以定义适合自己业务场景和业务需求的对话流程和逻辑,从而构建出强大的对话机器人。

三、Rasa框架架构

Rasa框架模块组成

Rasa框架图

picture.image

Rasa opensource就是我们下载rasa源码时候的主体部分,rasa通过这个主体可以外接知识图谱、Rasa SDK、Rasa X 可视化界面、服务器、API交互等各种集成,功能非常强大。

Rasa框架由以下几个核心模块组成:

1.NLU(Natural Language Understanding) :负责处理用户输入的自然语言,并将其转化为结构化的数据。包括实体识别、意图分类等功能。 2.Core :负责对话管理和决策,处理对话流程的跟踪、状态管理、策略选择等。它包含了对话状态跟踪器、对话策略选择器等组件。 3.Action :用于定义和执行自定义的对话动作,比如从外部API获取数据、发送消息给用户等。 4.Tracker :用于跟踪对话的状态和上下文信息,包括对话历史、当前状态、槽值等。 5.Agent :将NLU、Core和Action组件整合在一起,构成一个完整的对话代理。 6.Utils :包含一些实用工具和函数,用于处理数据、配置文件、日志等。

Rasa框架的架构主要包括以下几个组件和交互流程:

1.用户输入 :用户通过各种渠道(如命令行、聊天界面等)向Rasa发送自然语言输入。 2.NLU处理 :NLU模块接收用户输入并进行自然语言理解,将其转化为结构化的数据,如意图、实体等。 3.Core处理 :Core模块接收NLU输出的数据,根据对话状态和策略进行对话管理和决策,选择下一步的动作。 4.Action执行 :选择的动作被发送到Action服务器,执行自定义的动作逻辑,可能包括与外部系统的交互。 5.Tracker更新 :对话状态和上下文信息在Tracker中更新,以便后续使用。 6.响应生成 :根据动作执行的结果,Rasa生成相应的响应消息,以回复用户的请求。 7.响应输出 :生成的响应消息通过合适的渠道(如聊天界面、API等)发送给用户。

总的来说,Rasa框架通过NLU模块进行自然语言理解,Core模块进行对话管理和决策,Action模块执行自定义的动作,通过Tracker跟踪对话状态和上下文信息,并生成响应消息输出给用户。这些组件相互配合,形成一个完整的对话系统。

NLU

Rasa的NLU(Natural Language Understanding)处理主要功能包括以下几个方面:

1.意图分类(Intent Classification) :NLU模块通过分析用户输入的自然语言,识别用户的意图或意图类别。意图分类的目标是确定用户在进行对话时的意图是什么,例如询问、预订、取消等。 2.实体识别(Entity Extraction) :NLU模块识别用户输入中的实体,如人名、地点、日期等重要信息。实体识别的目标是从用户输入中抽取关键的实体信息,以便在对话过程中进行处理和使用。 3.槽值填充(Slot Filling) :NLU模块可以识别用户输入中的关键信息并将其填充到对话状态中的槽位(Slots)中。槽位是对话状态中的变量,用于存储对话过程中的重要信息,如预订日期、目的地等。 4.模型训练和优化 :NLU模块提供了模型训练和优化的功能,可以根据已有的训练数据对意图分类和实体识别模型进行训练,并进行参数调整和优化,以提高模型的准确性和性能。

总的来说,Rasa的NLU处理主要负责将用户输入的自然语言进行解析和理解,包括意图分类、实体识别和槽值填充等功能,以便后续的对话管理和决策模块进行处理和响应。通过NLU处理,Rasa能够更好地理解用户的意图和需求,从而提供更准确和个性化的对话体验。

rasa train

在Rasa中,当你运行rasa train命令时,将触发以下执行流程:

1.数据加载:Rasa会加载训练数据,包括NLU数据和对话流程数据。NLU数据包括用户意图和实体,对话流程数据包括对话状态和对话行为。 2.特征提取:Rasa将从NLU数据中提取特征,这些特征将用于训练对话管理模型。常见的特征提取方法包括词袋模型、TF-IDF、词嵌入等。 3.对话管理模型训练:Rasa使用提取的特征来训练对话管理模型,通常是基于机器学习的模型,如逻辑回归、支持向量机或深度学习模型。这个模型会根据当前对话状态和可能的动作来预测下一个应该采取的动作。 4.策略训练:在训练过程中,Rasa会尝试不同的对话策略,以确定最佳的策略。这些策略包括规则策略、Fallback策略、Memoization策略等。通过比较不同策略的性能,选择最优的策略。 5.模型评估和选择:在训练完成后,Rasa会评估不同策略和模型的性能,并选择最佳的模型和策略组合。 6.模型保存:训练完成后,Rasa将保存最终的模型和配置文件。

在这个过程中,Rasa会涉及多个组件,包括:

•NLU组件:负责加载和处理NLU数据,包括意图和实体的提取。 •对话管理组件:负责对话状态的跟踪和管理,包括将对话状态转化为特征向量,预测下一个动作等。 •特征提取组件:负责从NLU数据中提取特征,用于对话管理模型的训练。 •策略组件:负责训练和选择最佳的对话策略,包括规则策略、Fallback策略、Memoization策略等。

这些组件的具体执行顺序和配置取决于Rasa配置文件中的设置。可以根据项目的需求和特定的配置来调整和选择组件。

Action Server和Rasa Server

在Rasa中,动作服务器(Action Server)和Rasa服务器(Rasa Server)是两个独立的组件,它们共同工作来处理对话和执行动作。

Rasa服务器负责处理和管理对话。它处理自然语言理解(NLU)的任务,从用户消息中提取意图和实体,使用Rasa Core进行对话管理来预测下一步动作,并使用自然语言生成(NLG)来生成回复。

动作服务器则负责执行自定义动作以响应用户输入。这些自定义动作可以执行查询数据库、调用API或执行其他外部操作来满足用户请求的任务。动作服务器设计为异步执行动作,并与Rasa服务器独立运行。

Rasa服务器和动作服务器之间的连接通过Webhook建立。当Rasa服务器在对话流程中遇到自定义动作时,它会向动作服务器发送请求。动作服务器处理请求,执行必要的动作,并将响应发送回Rasa服务器。然后,Rasa服务器根据从动作服务器收到的响应继续对话流程。

总结一下,Rasa服务器负责处理整个对话流程,包括NLU、对话管理和NLG,而动作服务器则执行由Rasa服务器触发的自定义动作。这两个服务器共同工作,实现与聊天机器人或虚拟助手的互动和动态对话。

在Rasa中,actions是自定义的动作,用于响应用户输入或执行特定任务。这些自定义动作定义在一个Python模块中,通常称为actions.py。在该模块中,你可以编写处理特定意图或任务的自定义动作函数。

在Rasa项目中,你可以创建一个名为actions.py的Python文件,并在其中定义自己的动作函数。这些动作函数需要接收一个tracker参数,它包含与当前对话相关的所有信息,如对话状态、意图和实体等。你可以在动作函数中编写逻辑来根据这些信息生成回复、查询数据库、调用API或执行其他任务。

一旦你在actions.py文件中定义了自定义动作函数,你需要在Rasa配置文件(通常是config.yml)中指定动作服务器的地址和端口。然后,当Rasa服务器在对话流程中需要执行自定义动作时,它会通过Webhook将请求发送到动作服务器,并执行相应的自定义动作函数。

需要注意的是,在运行Rasa服务器之前,你需要确保已正确定义并运行了动作服务器。可以使用rasa run actions命令来启动动作服务器,并确保它能够监听和处理来自Rasa服务器的动作请求。

除了启动Rasa动作服务器和Rasa服务器外,通常情况下不需要启动其他服务器。Rasa动作服务器用于执行自定义动作函数,而Rasa服务器用于处理对话流程和与用户的交互。

但是,具体的项目需求可能会涉及到其他服务器或服务的使用。例如,如果你在自定义动作中需要访问外部API或数据库,你可能需要确保这些外部服务在运行,并可以被动作服务器访问。

另外,如果你计划将Rasa部署到生产环境中,你可能需要考虑使用诸如Nginx或Apache等服务器来处理传入的HTTP请求,并对流量进行负载均衡和反向代理。

总之,在大多数情况下,你只需要启动Rasa动作服务器和Rasa服务器,它们可以处理Rasa对话流程中的大部分任务和交互。额外的服务器或服务的需求取决于你的具体项目要求。

Rasa X

Rasa X是Rasa框架的一个可选组件,它提供了一个基于Web的用户界面,供开发人员和非开发人员使用,以便与聊天机器人交互、测试、调试和审查模型。

Rasa配置文件介绍

以下是Rasa框架的主要配置文件:

1.credentials.yml,用来存储对话机器人与外界传输信息所需要的身份验证信息和认证信息的配置文件。例如,访问外部API、数据库等需要身份验证的服务,都需要在这里配置相应的密钥、访问令牌等信息。 2.config.yml,是Rasa NLU和Rasa Core中的核心配置文件,用来定义模型的训练流程、参数、超参数等。在这个文件中,你可以配置机器人中的相关核心组件,例如intent识别器、对话管理器、ner抽取器、语言模型等的配置参数。 3.domain.yml,是用来定义机器人回答用户时的惯用话语和对话动作,包括对话流程、机器人快速回应、实体类型和槽位。在这个文件中,你可以定义关于对话内容和对话执行的特定内容,例如如何响应某个意图、如何解决意图中的槽位填充问题、如何执行特定的操作等。 4.endpoints.yml,是用来定义外部服务的配置文件,例如与Rasa进行交互的聊天接口、对话流程追踪接口和其他同步或异步API服务。在这个文件中,你可以定义针对Rasa机器人的各种接口和协议、请求头、IP地址和其他安全设置等。

四、 Rasa示例项目

有一个比较火的示例项目的github地址为:https://github.com/RasaHQ/rasa-demo,感兴趣的同学可以跑一跑这个示例。

五、参考资料

[1] Rasa:Menu[9]

[2] Rasa X:https://github.com/RasaHQ/rasa-x-helm

[3] Install Docker Engine | Docker Documentation[10]

References

[1] 部署 Rasa 助手: https://rasa.com/docs/rasa/docker/building-in-docker/#training-a-model
[2] Docker 安装: https://docs.docker.com/install/
[3] Docker 文档: https://docs.docker.com/edge/engine/reference/commandline/run/
[4] 命令行界面: https://rasa.com**/docs/rasa/command-line-interface
[5] 附加依赖项: https://rasa.com**/docs/rasa/installation/installing-rasa-open-source#additional-dependencies
[6] DockerHub: https://hub.docker.com/r/rasa/rasa/
[7] 自定义动作: https://rasa.com**/docs/rasa/actions#custom-actions
[8] 推荐部署方法之一: https://rasa.com**/docs/rasa/deploy/introduction#recommended-deployment-method
[9] Menu: https://rasa.com/docs/rasa/
[10] Install Docker Engine | Docker Documentation: https://docs.docker.com/engine/install/

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 NoSQL 的实践与探索
随着 NoSQL 的蓬勃发展越来越多的数据存储在了 NoSQL 系统中,并且 NoSQL 和 RDBMS 的界限越来越模糊,各种不同的专用 NoSQL 系统不停涌现,各具特色,形态不一。本次主要分享字节跳动内部和火山引擎 NoSQL 的实践,希望能够给大家一定的启发。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论