文章目录[隐藏]
本文是Rasa的第一篇,偏基础入门内容,主要是本地和使用docker镜像如何安装rasa,后续会持续更新关于rasa的使用拆解每个文件功能和内部细节、如何修改配置、如何使用中文模型等。目标是使用rasa构建一个自己的对话机器人!
在开源对话机器人中,Rasa社区很活跃,在国内很多企业也在使用Rasa做对话机器人,有rasa开发经验的往往是加分项。
当年实习的时候接触到了Rasa[1],现在工作中也使用Rasa,因此,写写一些经验文档,有助后来人的入门和研究。
Part1rasa安装和使用
我们做工程开发的时候,首先要解决好安装环境和包的版本依赖问题。
Python建议使用3.9版本(python==3.9),如果想使用Rasa X[2]那么rasa的版本要(rasa<3.0.0,>=2.8.15),也就是说RasaX只支持2.x版本。Rasa3的版本要使用RasaX要使用RasaPro和企业版相关配置了。
Rasa安装有很多种方法,比如Docker镜像安装、conda/pip本地安装、Poetry源码构建等方式。
1conda/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版本号:rasa==2.8、rasa==3.3.3等。
2Poetry构建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文件。
3、安装必要的包
pip install -r requirements.txt
4、下载下来的demo中没有训练好的模型的,需要我们自己训练。
训练rasa命令:
rasa train
模型根据最初配置训练好了,会生成时间戳方式命名的.tar.gz文件,保存在/models文件夹下。
5、启动rasa对话机器人
rasa shell
会自动加载最新训练的模型,直接在终端输入聊天内容就可以了。
Part2Docker方式安装rasa
先自行搜索安装Docker[3]吧。查看本机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
Part3自定义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的安装和训练、使用。
Part4Rasa3框架概览
掌握一样新技术,从框架开始。本篇也主要是通过框架,对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就是对话管理,别人提到这个概念的时候,我们明白就好。
3核心模块讲解:
这里根据框架简单讲下处理流程和作用,每个模块具体的实现细节,我们后面拆开讲解。依旧是从整体把握到细节攻克的思路。
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允许外接对话生成功能,以提供更好回复给用户)
Part5Rasa必知概念总结
动作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中的所有对话均表示为一系列事件。
表格Form一种自定义操作,它要求用户提供多条信息,填表。
快乐/不快乐的路径 Happy/Unhappy Paths用于描述用户输入是预期输入还是意外输入的术语。如果助手要求用户提供某些信息并且用户提供了该信息,我们称这是happy path。Unhappy paths都是可能的极端情况。例如,用户拒绝提供请求的输入,更改对话主题或更正他们之前说过的话。
意图Intent:
在给定的用户消息中,用户试图传达或完成的事情(例如,问候语,指定位置)。
互动学习 Interactive Learning在Rasa X或Rasa CLI中,这是一种训练模式,开发人员可以在对话的每个步骤中更正和验证助手的预测。对话可以保存为故事格式,并添加到助手的训练数据中。
知识库/知识图 Knowledge Base / Knowledge Graph:
知识图谱,可查询的数据库,表示对象之间的复杂关系和层次结构。知识库操作允许Rasa Open Source从知识库中获取信息,并将其用于响应中。
消息信道 Messaging Channels将Rasa Open Source与外部消息传递平台集成的连接器,终端用户可以在该平台上发送和接收消息。Rasa Open Source包括内置的消息传递通道(如Slack,Facebook Messenger和Web聊天),以及创建自定义连接器的功能。
自然语言生成(NLG): 是生成自然语言消息以发送给用户的过程。Rasa对NLG使用基于模板的简单方法。数据驱动的方法(例如neural NLG)可以通过创建自定义NLG组件来实现。
NLU 自然语言理解:(NLU)致力于将人类语言解析和理解为结构化格式。
管道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框架。ps: 不会写故事的算法不是好的小说家】
TED策略 TED Policy:Transformer EmbeddingDialogue Policy。TED是Rasa Open Source默认的基于机器学习的对话策略。
追踪器Tracker:维护对话状态的Rasa开源组件,它表示为JSON对象,列出了当前会话中的事件。
参考资料
Rasa: https://rasa.com/docs/rasa/
[2]Rasa X: https://github.com/RasaHQ/rasa-x-helm
[3]https://docs.docker.com/engine/install/: Docker
2023-01-07
2022-12-31
2023-02-02
2023-02-02
“点赞”是喜欢,“在看、分享”是真爱
<