构建对话机器人:Rasa3安装和基础入门

news2024/9/28 13:02:32

在开源对话机器人中,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术语中,意图与每个单独的用户消息相关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试报告踩坑的点

测试报告作为测试人员的核心输出项&#xff0c;是体现自己工作价值的重要承载工具&#xff0c;需要我们认真对待&#xff0c;所以我们要重视测试报告的输出&#xff0c;那么在编写测试报告的时候&#xff0c;我们有哪些点需要注意的呢? 01 不要乱用模板 很多测试新人在编写测试…

LeetCode 周赛 334,在算法的世界里反复横跳

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 大家好&#xff0c;我是小彭。 今天是 LeetCode 第 334 场周赛&#xff0c;你参加了吗&#xff1f;这场周赛考察范围比较基础&#xff0c;整体难度比较平均&#xff0c;第一题…

使用linux部署项目步骤

文章目录前言一、服务器环境配置二、数据库导入三、项目打包1、修改项目中的访问路径2、修改db.properties的数据库访问路径3、打包4、修改配置&#xff0c;启动服务四、测试总结前言 今天学习了在服务器中部署项目&#xff0c;记录一下 一、服务器环境配置 首先要安装VMware&…

CTFer成长之路之逻辑漏洞

逻辑漏洞CTF 访问url: http://1b43ac78-61f7-4b3c-9ab7-d7e131e7da80.node3.buuoj.cn/ 登录页面用随意用户名密码登录 访问url&#xff1a; http://1b43ac78-61f7-4b3c-9ab7-d7e131e7da80.node3.buuoj.cn/user.php 登陆后有商品列表&#xff0c;共三个商品,点击购买flag 钱…

【数据结构】队列的接口实现(附图解和源码)

队列的接口实现&#xff08;附图解和源码&#xff09; 文章目录队列的接口实现&#xff08;附图解和源码&#xff09;前言一、定义结构体二、接口实现&#xff08;附图解源码&#xff09;1.初始化队列2.销毁队列3.队尾入队列4.判断队列是否为空5.队头出队列6.获取队列头部元素7…

算法练习(七)数据分类处理

一、数据分类处理 1、题目描述&#xff1a; 信息社会&#xff0c;有海量的数据需要分析处理&#xff0c;比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。采集输入大数据和分类规则&#xff0c;通过大数据分类处理程序&#xff0c;将大数据分类输出…

Matlab 实用小函数汇总

文章目录Part.I 元胞相关Chap.I 创建空 char 型元胞Part.II 矩阵相关Chap.I 矩阵插入元素Part.III 字符串相关Chap.I 获取一个文件夹下所有文件的文件名的部分内容Part.IV 结构体相关Chap.I 读取结构体Chap.II 取结构体中某一字段的所有值本篇博文记录一些笔者使用 Matlab 时&a…

微服务框架-学习笔记

1 微服务架构介绍 1.1 系统架构演变历史 单体架构垂直应用架构&#xff1a;按照业务线垂直划分分布式架构&#xff1a;抽出业务无关的公共模块SOA架构&#xff1a;面向服务微服务架构&#xff1a;彻底的服务化1.2 微服务架构概览 1.3 微服务架构核心要素 服务治理&#xff1…

第一章 1:函数

函数概念 函数我们可以简单的理解为一个自变量只对应一个函数值&#xff0c;如图&#xff1a; 如图所示的图像&#xff0c;我们可以把其理解为函数&#xff0c;那非函数呢&#xff1f; 这个就叫做非函数&#xff0c;因为我们的一个自变量对应了两个函数值。 函数的两要素&…

k-means聚类总结

1.概述 聚类算法又叫做‘无监督学习’&#xff0c;其目的是将数据划分成有意义或有用的组&#xff08;或簇&#xff09;。 2.KMeans 关键概念&#xff1a;簇与质心 KMeans算法将一组N个样本的特征矩阵X划分为K个无交集的簇&#xff0c;直观上来看是簇是一组一组聚集在一起的…

分享5款堪称神器的免费软件,建议先收藏再下载

转眼间新年已经过去一个月了&#xff0c;最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.电脑安全管家——火绒 火绒是一款电脑安全软件&#xff0c;病毒库更新及时&#xff0c;界面清晰干净&#xff0c;没…

C++之父做决定了:内部自救!

进入2023年&#xff0c;技术圈都在围观大洋彼岸的聊天机器ChatGPT&#xff0c;但对于编程圈而言&#xff0c;没有什么比内存安全更能引起热议。近期美国国家安全局&#xff08;NSA&#xff09;点名批评C&#xff0c;建议使用Rust等内存安全的语言&#xff0c;霎时间让“编程语言…

Linux服务:Nginx反向代理与负载均衡

目录 一、Nginx反向代理 1、什么是代理 2、实现反向代理实验 ①实验拓扑 ②实验目的 ③实验过程 二、反向代理负载均衡 1、反向代理负载均衡调度算法 ①轮询算法 ②加权轮询算法 ③最小连接数算法 ④ip、url 哈希算法 ⑤响应时间fair算法 2、实现反向代理负载均…

Batchnorm和Layernorm的区别

在深度学习训练中&#xff0c;我们经常会遇到这两个归一化操作&#xff0c;他们之间有什么区别呢&#xff1f;我们来简单介绍一下&#xff1a; BatchNorm&#xff1a; 在深度学习训练的时候我们的数据如果没有经过预处理&#xff0c;有可能会出现梯度消失或者梯度爆炸的情况&…

aspnetcore-browser-refresh.js和Visual Studio Browser Link

我在调试ASP.NET Core web应用时&#xff0c;发现请求的页面文档底部多了一部分文件&#xff0c;而在我的页面中却没有包含&#xff0c;故查询资料&#xff0c;在此记录&#xff1a; 图中&#xff0c;可以看到红框部分是多出来了2个脚本 1.aspnetcore-browser-refresh.js 这里…

LeetCode HOT100 (23、32、33)

目录 23、合并K个升序链表 32、最长有效括号 33、搜索旋转排序数组 23、合并K个升序链表 思路&#xff1a;采用顺序合并的方法&#xff0c;用一个变量 ans 来维护以及合并的链表&#xff0c;第 i 次循i 个链表和 ans合并&#xff0c;答案保存到 ans中。 代码&#xff1a; …

数据存储结构B+树 vs LSM Tree

关于存储的几个概念对于一个存储系统来说&#xff0c;底层的存储结构基本上就决定了这个存储系统的功能&#xff0c;或者说性能偏向。比如使用B树的存储系统&#xff0c;那就是查询友好的&#xff1b;使用倒排索引结构的&#xff0c;那就主要是用来做全文搜索的&#xff1b;使用…

idea debug elasticsearch8.6.2 源码

前置依赖&#xff1a; gradle 7.5.1&#xff1a;Gradle | Releases openJDK 17&#xff1a;https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe idea&#xff1a;IntelliJ IDEA 2022.1 (Ultimate Edition) 1、下载源码 8.6.2 zip包 并解压 地址&…

算法训练营 day57 动态规划 最长公共子序列 不相交的线 最大子序和(动态规划)

算法训练营 day57 动态规划 最长公共子序列 不相交的线 最大子序和&#xff08;动态规划&#xff09; 最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。…

spark为什么比hadoop快

网上一堆人根本对计算框架一知半解就出来糊弄人&#xff0c;常见解答有&#xff1a; spark是基于内存计算&#xff0c;所以快。这跟废话似的&#xff0c;mr计算的时候不也是基于内存&#xff1f; mr shuffle落盘。这也是胡扯&#xff0c; spark shuffle不落盘&#xff1f; 实际…