在开源对话机器人中,Rasa社区很活跃,在国内很多企业也在使用Rasa做对话机器人,有rasa开发经验的往往是加分项。
当年实习的时候接触到了Rasa,现在工作中也使用Rasa,因此,写写一些经验文档,有助后来人的入门和研究。
本文是Rasa的第一篇,偏基础入门内容,主要是本地和使用docker镜像如何安装rasa,后续会持续更新关于rasa的使用拆解每个文件功能和内部细节、如何修改配置、如何使用中文模型等。
目标是使用rasa构建一个自己的对话机器人!
文章首发自公众号:写bug的程旭源
rasa安装和使用
我们做工程开发的时候,首先要解决好安装环境和包的版本依赖问题。
Python建议使用3.9版本(python==3.9),如果想使用Rasa X那么rasa的版本要(rasa<3.0.0,>=2.8.15),也就是说RasaX只支持2.x版本。Rasa3的版本要使用RasaX要使用RasaPro和企业版相关配置了。
Rasa安装有很多种方法,比如Docker镜像安装、conda/pip本地安装、Poetry源码构建等方式。
conda/pip安装rasa
初使用Rasa的同学建议用这个方法安装。
【添加conda pip环境管理的文章链接】
使用conda创建一个新环境,专门用来做rasa相关开发的,并指定python版本:
conda create -n rasa3 python=3.9
截止目前版本(2023年2月),建议使用python3.9版本,3.10及以后版本有待进一步的支持。
开源框架rasa安装最新版本:
pip install rasa
或者更新pip同时安装rasa:
pip install -U --user pip && pip install rasa
升级已安装的版本:
pip3 install --upgrade rasa
可以指定rasa版本号:rasa2.8、rasa3.3.3等。
Poetry构建rasa
curl -sSL https://install.python-poetry.org | python3 -
git clone https://github.com/RasaHQ/rasa.git
cd rasa
poetry install
2、使用rasa init初始化聊天机器人项目
rasa init # --no-prompt
主要是生成rasa英文版初始demo文件。
结合之前使用rasa的工程经验,运行rasa项目往往还需要这些文件:
3、安装必要的包
pip install -r requirements.txt
4、下载下来的demo中没有训练好的模型的,需要我们自己训练。
训练rasa命令:
rasa train
会根据现有的配置开始训练。如果想修改训练次数,可以在config.yml文件中把epochs改小一点。
模型根据最初配置训练好了,会生成时间戳方式命名的.tar.gz文件,保存在/models文件夹下。
5、启动rasa对话机器人
rasa shell
会自动加载最新训练的模型,直接在终端输入聊天内容就可以了。
Docker方式安装rasa
先自行搜索安装Docker吧。
查看本机Docker和Docker Compose版本:
docker -v && docker-compose -v
如果计算机上安装了Docker,则显示已安装的Docker和Docker Compose版本。
然后运行命令:
docker run -v $(pwd):/app rasa/rasa init --no-prompt
就可以自动构建镜像了。
命令释义:
-v $(pwd):/app :将当前工作目录挂载到Docker容器中的工作目录。本地和docker容器中文件将同步。
rasa/rasa:要运行的docker镜像的名称。
与新训练的助手交谈,请运行以下命令:
docker run -it -v $(pwd):/app rasa/rasa shell
自定义Dockerfile构建镜像:
# 镜像名称
FROM python:3.9-slim
# WORKDIR 后面写的是要部署到服务器上的路径,指定工作目录
WORKDIR /app
# 添加所有文件到app 目录下。COPY或者ADD
ADD . /app
# 安装依赖包。豆瓣镜像比清华镜像快
RUN pip --no-cache-dir install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com -r /app/requirements.txt
EXPOSE 5005
RUN rasa train
VOLUME /app
VOLUME /app/data
VOLUME /app/models
CMD ["run","-m","/app/models","--enable-api","--cors","*","--debug" ,"--endpoints", "endpoints.yml", "--log-file", "out.log", "--debug"]
# 如果有自定义api,也可以运行
# CMD ["python", "http_api.py"]
docker built命令构建镜像:
docker build -t rasa.study/rasa:v1.0 .
rasa的训练和使用有很多很多的命令,如果每次都要输出命令和参数,将会很麻烦。如何高效记录常用命令、一键执行呢?
新建docker-compose.yml文件,输入:
version: '3.0'
services:
rasa:
image: rasa.study/rasa:v1.0
ports:
- "5005:5005"
volumes:
- ./:/app
command:
- run
action_server:
image: rasa/rasa-sdk:latest
ports:
- "5055:5055"
volumes:
- "./actions:/app/actions"
duckling:
image: rasa/duckling:latest
ports:
- "8000:8000"
以上输入内容可以根据项目需要,自行增减配置。
运行命令即可:
docker-compose up
Docker和docker-compose联合使用,是真的香啊!
本文从官方demo的角度出发,介绍python环境管理、rasa3的安装和训练、使用。
Rasa3框架概览
掌握一样新技术,从框架开始。本篇也主要是通过框架,对rasa各个模块功能有个整体的把握。
Rasa框架图
Rasa opensource就是我们下载rasa源码时候的主体部分,rasa通过这个主体可以外接知识图谱、Rasa SDK、Rasa X 可视化界面、服务器、API交互等各种集成,功能非常强大。
如果已经对Rasa1.x版本有所了解或者看了网上那么多的1.x版本的rasa教程,那么可能有些概念还要着重区分一下的。因为Rasa2之后有了很大的调整。比如原来的rasa_nlu和rasa_core的概念已经替换不用了(虽然源代码中还有nlu和core文件夹)。NLU就是NLU,core就是对话管理,别人提到这个概念的时候,我们明白就好。
核心模块讲解:
这里根据框架简单讲下处理流程和作用,每个模块具体的实现细节,我们后面拆开讲解。依旧是从整体把握到细节攻克的思路。
Rasa通过一个Agent智能体对接到其他的各个模块。
对内和Dialogue Polices(对话策略,决策和选择最优actions)、NLU pipline(自然语言理解的工作管道,主要是实体和意图相关的工作)对接。
对接外部模块有:
Rasa SDK:(用户自定义actions)
Tracker Store:(对话存储追踪器,可以连接到不同的数据库的)
Lock Store:(会话锁定器,一旦会话被处理,就会触发票据锁机制ticket lock mechanism来锁定会话,这样可以使得rasa服务器并行运行多节点服务)
Event Broker:(事件代理,可以处理实时对话的数据到其他服务,比如在对话中,你可以使用Rasa X将实时对话数据观看和标注,也可以转发到外部的分析服务)
Filesystem:(文件系统,包括模型和数据,可以存储在本地、http服务器、云服务器)
I/O channels:(进出通道,就是用户和rasa交互的通道,可以是你自己的网站、Facebook Messenger、Telegram、用户自定义连接器等)
NLG:(自然语言生成,Rasa允许外接对话生成功能,以提供更好回复给用户)
Rasa必知概念
动作Action:
机器人进行对话的一个步骤。
执行服务器 Action Server:
与Rasa Open Source源码分开的,运行自定义动作的服务器。尽管可以用其他语言编写自定义动作,但Rasa仍用Python维护了Rasa SDK来实现自定义动作。
业务逻辑Business Logic:
由于业务需求需要满足的条件。例如:在创建帐户之前,要求输入名字和姓氏,地址和密码。在Rasa助手中,使用基于规则的操作(例如form)来实现业务逻辑。
内容管理系统 CMS Content Management Systems:
一种在外部存储漫游器响应的方法,而不是将其直接包含在域中。内容管理系统将响应文本与训练数据分离。
对话驱动的开发 Conversation-Driven Development(CDD):
使用用户消息和对话数据来影响助手设计和训练模型的过程,并结合工程最佳实践。组成CDD的过程分为6个步骤:共享,审阅,批注,修复,跟踪和测试。Share, Review, Annotate, Fix, Track, and Test。
会话测试Conversation Tests:
修改后的故事格式,除了意图标签外,还包括用户消息的全文。测试对话将保存到测试集文件(conversation_tests.md),该文件用于评估整个对话中模型的预测。
组件Component:
模型配置中助手的NLU pipeline中的元素。
传入消息由称为管道的一系列组件处理。组件可以执行从实体提取到意图分类再到预处理的各种任务。
有条件响应变化 Conditional Response Variation:
仅当当前对话状态满足域或响应文件中定义的某些约束时,才可以使用响应变化。如果约束和对话状态之间存在匹配,Rasa可以使用此变体。
自定义操作Custom Action:
由机器人开发人员编写的动作,可以运行任意代码,主要是与外部系统和API进行交互。
默认动作Default Action:
带有预定义功能的内置动作。
DIET:Dual Intent and Entity Transformer:Rasa开源使用的默认NLU体系结构,它执行意图分类和实体提取。
域Domain
定义助手的输入和输出。包括助手知道的所有意图,实体,词槽,动作和形式的列表。和我们理解的领域并不同。
实体Entity:
可以从用户消息中提取的关键字。例如:电话号码,人名,位置,产品名称
事件Event:谈话中发生的事情。例如,UserUttered事件表示用户输入消息,而ActionExecuted事件表示助手执行操作。Rasa中的所有对话均表示为一系列事件。
常见问题解答FAQ:
Frequently Asked Questions(FAQ)是用户提出的常见问题。在构建助手的上下文中,这通常意味着用户发送消息而助手发送响应而无需考虑对话的上下文。
表格Form
一种自定义操作,它要求用户提供多条信息,填表。
快乐/不快乐的路径 Happy/Unhappy Paths
用于描述用户输入是预期输入还是意外输入的术语。如果助手要求用户提供某些信息并且用户提供了该信息,我们称这是happy path。Unhappy paths都是可能的极端情况。例如,用户拒绝提供请求的输入,更改对话主题或更正他们之前说过的话。
意图Intent:
在给定的用户消息中,用户试图传达或完成的事情(例如,问候语,指定位置)。
互动学习 Interactive Learning
在Rasa X或Rasa CLI中,这是一种训练模式,开发人员可以在对话的每个步骤中更正和验证助手的预测。对话可以保存为故事格式,并添加到助手的训练数据中。
知识库/知识图 Knowledge Base / Knowledge Graph:
知识图谱,可查询的数据库,表示对象之间的复杂关系和层次结构。知识库操作允许Rasa Open Source从知识库中获取信息,并将其用于响应中。
3级助理 Level 3 Assistant:
可以处理比简单来回交换更复杂的对话的助手。3级助理能够使用上一个对话回合的上下文来选择适当的下一个动作。
消息信道 Messaging Channels
将Rasa Open Source与外部消息传递平台集成的连接器,终端用户可以在该平台上发送和接收消息。Rasa Open Source包括内置的消息传递通道(如Slack,Facebook Messenger和Web聊天),以及创建自定义连接器的功能。
自然语言生成(NLG): 是生成自然语言消息以发送给用户的过程。Rasa对NLG使用基于模板的简单方法。数据驱动的方法(例如neural NLG)可以通过创建自定义NLG组件来实现。
NLU 自然语言理解:(NLU)致力于将人类语言解析和理解为结构化格式。
NLU收件箱 NLUInbox:
Rasa X中收集新用户消息以供查看和标注的区域。可以收集未标注的数据。
管道Pipeline : 定义Rasa助手的NLU系统的NLU组件列表。在返回最终的结构化输出之前,每个组件都会逐一处理用户消息。
策略Policy: Rasa开源组件可预测对话系统的下一个操作策略,从而决定对话流程应如何进行。典型的配置包括多个策略,而置信度最高的策略将决定对话中要采取的下一个动作。
NLU组件 NLU Component:
Rasa NLU管道中的一个元素,用于处理传入消息。组件执行的任务从实体提取到意图分类再到预处理。
Rasa X: rasa的可视化界面工具。Rasa X帮助团队共享和测试使用Rasa Open Source构建的助手,注释用户消息和查看对话。
检索意图 Retrieval Intent: 一种特殊类型的意图,可以分为较小的子意图。例如,一个FAQ检索意图包含一些子意图,这些子意图代表助手知道如何回答的每个问题。
REST频道 REST Channel: 用于构建自定义连接器 build custom connectors的消息传递通道。包括一个输入通道(可以在其中将用户消息发布到Rasa Open Source),以及指定回调callback URL(可以将机器人的响应操作发送到该URL)的功能。
响应/模板/话语 Response/Template/Utterance: 助手发送给用户的消息。这可以包括文本,按钮,图像和其他内容。
规则Rules: 特殊训练数据,用于指定类似规则的行为,其中特定条件总是预测特定的下一个动作。例如,回答常见问题解答,填写Forms或处理Fallbacks。
插槽: 词槽Slot, Rasa用来在对话过程中跟踪信息的键值存储。
故事Story:对话模型的训练数据格式,由用户和漫游器之间的对话组成。用户的消息表示为带标签的意图和实体,而bot的 responses表示为一系列操作。【hr给的简历,我一看到故事编写,我就知道用的rasa框架。不会写故事的算法不是好的小说家】
TED策略 TED Policy:Transformer EmbeddingDialogue Policy。TED是Rasa Open Source默认的基于机器学习的对话策略。
追踪器Tracker:维护对话状态的Rasa开源组件,它表示为JSON对象,列出了当前会话中的事件。
用户目标 user goal: 用户想要实现的总体目标,例如查找问题的答案,预约或购买物品。有些工具将用户目标称为“意图”,但是在Rasa术语中,意图与每个单独的用户消息相关联。