【Python大语言模型系列】开源机器人对话系统框架RASA介绍与使用(案例分析)

这是我的第361篇原创文章。

一、引言

Rasa是一个开源的对话式 AI 框架,用于构建自定义的对话式 AI 助手。它可以处理自然语言理解(NLU)和对话管理(DM),使得开发者能够轻松地创建功能丰富的对话式 AI 应用。Rasa是一个开源机器学习框架(小模型),主要功能:支持闲聊,问答型机器人和多轮会话。

二、系统架构

图片

上图概述了Rasa开源体系结构:

  • RASA包含自然语言理解(NLU)和对话管理两个主要组件。NLU提供了意图分类,实体提取和响应检索功能,它是以管道的方式处理用户对话,在上图中显示为NLU Pipeline。对话管理组件可以根据上下文决定对话中的下一个动作,在上图中显示为Dialogue Policies。

  • Agent组件,从Robot User来看,Agent就是整个RASA系统的代理,它接收用户输入消息,返回Rasa系统的回答。在Rasa系统内,Agent就是一个总控单元,它引导系统启动,它连接NLU和DM,得到Action,然后调用Action得到回答,它保存对话数据到数据存储。

  • Tracker Store是对话的存储单元,对话跟踪单元将用户和机器人的对话保存在Tracker Store中。Rasa提供了针对不同存储类型的开箱即用的实现,包括postgresql,SQLite,Oracle,Redis,MongoDB,DynamoDB。TrackerStore也支持自定义存储。

  • Event Broker事件代理,机器人可以通过Event Broker连接到其他服务。机器人可以发布一个消息给其他服务来处理这些消息,也可以依靠Event Broker转发Rasa Server的消息到其他服务。目前RASA支持的Event Broker有RabbitMQ,Kafka,SQL。

  • Lock Store,该组件是一个ID产生器,当RASA是一个集群部署的时候,并且客户端在发送RASA服务端的消息每次不一定会寻址到同一个服务器,因此需要一个全局的Session ID。Rasa使用Token Lock机制来确保全局唯一SessionID,并在消息处于活动状态时锁定会话,以此保证消息的顺序处理。

  • FileSystem提供无差别的文件存储服务,比如训练好的模型可以存储在不同的位置。支持磁盘加载,服务器加载,S3这样的云存储加载。

  • ActionServer提供了Action与Policy解耦的一种方式。用户可以定义任何一种Action连接到Action Server上,通过训练学习,RASA可以将policy路由到这个Action上。这使得给机器人热插拔一个能力成为可能。

三、核心模块介绍

Rasa有两个主要模块:Rasa NLU 和Rasa Core,旧版本:rasa-nlu和rasa-core是分开安装的,最新版本:rasa 将二者做了合并。

Rasa NLU 是核心模块之一,NLU是英文Natural Language Understanding的简称,也就是自然语言理解,这个模块用于对用户消息内容进行语义理解,并将结果转换成结构化的数据。在Rasa这里,需要提供一份训练数据,Rasa NLU会基于这份数据进行模型训练,然后通过模型对用户消息进行语义理解,主要是意图识别和实体提取。

  • 意图分类器主要是对用户的每一次对话进行意图识别,确定用户的每次意图,确定客户每次问的意图是哪种,需要做什么。一般任务型对话中,意图识别都是确定的集合,需要人为先确定任务意图类型,然后在实际场景中进行意图分类。RASA的意图分类器主要是完成这一任务。

  • 实体提取器主要是对用户的每一次对话中进行命名实体识别,实体做为slot(槽)信息进行填充。举例来说,用户意图为订火车票,那机器人必须知道是从哪里出发目的地是哪里,这个信息就需要从用户对话中提取地名这个命名实体。RASA的实体提取器支持这一个功能。

NLU组件也是一个可细分pipeline结构,过程是Tokenize->Featurize->NER Extract->Intent Classify。

例如,下面句子:

"I am looking for a Mexican restaurant in the center of town"

返回结构化数据:

{ "intent": "search_restaurant","entities": {    "cuisine" : "Mexican",    "location" : "center"  }}

Rasa_NLU_Chi 作为 Rasa_NLU 的一个 fork 版本,加入了jieba 作为中文的 tokenizer,实现了中文支持。

Rasa Core是一个对话管理平台,用于举行对话和决定下一步做什么。Rasa core是Rasa框架提供的对话管理模块,它类似于聊天机器人的大脑,主要的任务是维护更新对话状态和动作选择,然后对用户的输入作出响应。所谓对话状态是一种机器能够处理的对聊天数据的表征,对话状态中包含所有可能会影响下一步决策的信息,如自然语言理解模块的输出、用户的特征等;所谓动作选择,是指基于当前的对话状态,选择接下来合适的动作,例如向用户追问需补充的信息、执行用户要求的动作等。

RASA在处理对话时,整体流程是pipeline结构,自然语言理解(NLU)、对话状态追踪(DST)以及对话策略学习(DPL)一系列流程处理下来,再判断执行下一个动作。使用Rasa构建的助手响应消息的基本步骤:

图片

  • 首先,将用户输入的Message传递到Interpreter(NLU模块),该模块负责识别Message中的"意图(intent)“和提取所有"实体”(entity)数据;

  • 其次,Rasa Core会将Interpreter提取到的意图和实体传给Tracker对象,该对象的主要作用是跟踪会话状态(conversation state);

  • 第三,利用policy记录Tracker对象的当前状态,并选择执行相应的action,其中,这个action是被记录在Track对象中的;

  • 最后,将执行action返回的结果输出即完成一次人机交互。

几个术语

  • 意图:用户打算问什么?

  • 实体:用户查询中重要的信息是什么?

  • 故事:即对话脚本,对话进行的可能方式是什么?

  • 行动:机器人应根据特定请求采取什么行为措施?

四、使用

1、安装rasa

使用pip install rasa[full]安装Rasa,则会为每种配置安装Rasa的所有依赖项(比如spaCy、MITIE)

2、创建一个新的rasa项目

rasa init

图片

项目结构:一个典型的 Rasa 项目包含以下文件和文件夹:

图片

图片

  • credentials.yml: 存储与外部服务(如 Facebook Messenger、Slack 等)的 API 凭据。

  • config.yml: 存储 Rasa 的配置信息,如 NLU 管道、策略等。

  • data/: 存储训练数据,包括 NLU数据(训练意图识别模型)和对话数据(训练对话策略选择模型)。

  • domain.yml: 定义对话的领域,包括实体、槽、意图、动作、模板等。

  • credentials.yml: 存储与外部服务的 API 凭据。

  • endpoints.yml: 定义 Rasa 服务器的端点,如模型存储、自定义操作等。

3、根据业务配置文件

nlu.yaml

图片

nlu文件是告诉模型用户可能会说什么。给的例子是模拟了平时人在相关情形下常说的话。可以理解为,有监督的机器学习,我们给模型提供的学习数据。为了创建自定义聊天机器人,我们将在其中编写一些意图,同时确保意图名称没有重复,并且每个意图确保至少给出两个示例。

domain.yml

图片

这个文件列出了nlu里的所有类型,而responses则是我们告诉机器人,当用户做出了nlu里的相关行为之后,应该怎样回应(其实就是类似一个判断分支的代码逻辑),比如当我识别出用户想让我讲个笑话的时候,我们就回复今日的风儿甚是喧嚣啊。当然,我这里只定义了一条,当定义多条回复信息时,机器人就会随机回复其中的一条。

sotries.yaml:

图片

这里其实是模拟了可能发生的对话情况,每一条训练数据是一个story,即是一次完整的场景对话(多个intent-action),比如第一个沮丧情况,机器人问候之后,用户表示不开心,机器人会做一个cheer_up行为,然后询问刚才的鼓励行为是否有效,如果用户回复确认,机器人会进行说请保持,也就是23行的happy行为。

图片

4、训练模型

准备好domain.yml和sotries.yaml数据之后,就可以进行模型的训练了。Rasa会根据这些数据来训练机器人的回答策略,模型的输入数据是历史对话记录,lable是下一个决策action。模型本质上是num_actions个类别的多分类。

这里它直接问我要不要训练这个初始化的模型,我直接输入Y就可以。等价于命令

rasa train

训练过程:

图片

训练完成:

图片

训练完成之后这将在models/文件夹下生成一个训练好的模型。

5. 测试模型

使用以下命令测试模型:

rasa test

这将在results/文件夹下生成测试结果。

图片

6、运行

现在,可以将此聊天机器人集成到自己的网站或者连接到任何其他平台,但是必须创建自己的自定义连接器。有两种运行Rasa的方法:在Shell和localhost上。

这里它直接问我要不要对话这个训练好的模型,我直接输入Y就可以。等价于命令

rasa shell

图片

另一种方法是在本地服务器上运行Rasa。为此,只需在Rasa文件夹中打开的终端上运行以下命令:

rasa run

这将在本地系统上运行Rasa,并在本地主机的5005端口公开REST端点。为了与Rasa服务器公开的REST端点进行通信,可以使用cURL命令(对于Linux爱好者)或Postman。这里推荐Postman,因为它易于使用。

图片

7、部署对话式 AI 助手

要将你的对话式 AI 助手部署到生产环境,你可以使用 Rasa 的 REST API。首先,在endpoints.yml文件中配置端点:

action_endpoint:
url: "http://localhost:5055/webhook"model:url: "http://localhost:5005/model"token: "your-token"tracker_store:type: "sql"dialect: "sqlite"db: "rasa.db"

然后,使用以下命令启动 Rasa 服务器:

rasa run

现在你的对话式 AI 助手已经部署到生产环境,可以通过 REST API 与外部服务进行交互。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

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

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

相关文章

番外篇 | 应对遮挡挑战,北航提出新型模型YOLOv5-FFM表现优异

前言:Hello大家好,我是小哥谈。在本文中,作者提出了一种改进的轻量级YOLOv5-FFM模型来解决行人检测遮挡问题。为了实现目标,作者在YOLOv5模型框架基础上进行了改进,并引入了Ghost模块和SE模块。此外,作者还设计了一个局部特征融合模块(FFM)来处理行人检测中的遮挡问题。…

I/O中断处理过程

中断控制器位于CPU和外设之间,用于处理I/O中断请求。以下是一个简化的中断控制器: 现在有A,B,C三个中断源。中断响应优先级:A>B>C,中断处理优先级:C>B>A 假设CPU正在处理A中断源的中断请求,此时…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【上篇】

大型语言模型(LLM)的现代进步主要是缩放定律的产物[6]。 假设模型是在足够大的数据集上训练出来的,那么随着底层模型规模的增加,我们会看到性能的平滑提升。 这种扩展规律最终促使我们创建了 GPT-3 以及随后的其他(更强…

Excel技巧:Excel批量提取文件名

Excel是大家经常用来制作表格的文件,比如输入文件名,如果有大量文件需要输入,用张贴复制或者手动输入的方式还是很费时间的,今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹,选中所有文件&#xff0c…

在线翻译器工具横评:性能、准确率大比拼

无论是旅行者在异国他乡探寻风土人情,学者研究国外的前沿学术成果,还是商务人士与国际伙伴洽谈合作,都离不开一种高效、准确的语言沟通工具。而翻译器在线翻译能很好的帮我们解决这个问题。今天我们一起来探讨有那些好用的翻译工具。 1.福昕…

Golang | Leetcode Golang题解之第443题压缩字符串

题目: 题解: func compress(chars []byte) int {write, left : 0, 0for read, ch : range chars {if read len(chars)-1 || ch ! chars[read1] {chars[write] chwritenum : read - left 1if num > 1 {anchor : writefor ; num > 0; num / 10 {…

【题解】2022ICPC杭州-K

翻译 原题链接   简述一下就是每次询问重新定义一个字母排序表&#xff0c;问在这个顺序下n个字符串的序列的逆序数是多少。 字典树计算逆序数 先考虑初始状况下&#xff0c;即 a < b < . . . < z a<b<...<z a<b<...<z的情况下&#xff0c;逆序…

Arch - 架构安全性_验证(Verification)

文章目录 OverView导图1. 引言&#xff1a;数据验证的重要性概述2. 数据验证的基本概念3. 数据验证的层次前端验证后端验证 4. 数据验证的标准做法5. 自定义校验注解6. 校验结果的处理7. 性能考虑与副作用8. 小结 OverView 即使只限定在“软件架构设计”这个语境下&#xff0c…

金融科技革命:API接口开放平台,畅通金融服务之路

金融科技是近年来蓬勃发展的领域&#xff0c;它利用先进的技术手段来改善和创新金融服务。在金融科技的革命中&#xff0c;API接口开放平台扮演着重要的角色&#xff0c;它通过提供统一的接口服务&#xff0c;让金融机构和其他行业能够更方便地进行数据交换和合作。本文将以挖数…

聚星文社最新风格图库角色

聚星文社最新风格图库角色涵盖了各种不同的风格和类型。以下是一些可能的角色风格&#xff1a; Docs聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 现代都市风格角色&#xff1a;这种角色通常穿着时尚的衣服&#xff0c;有时尚的发型和化妆。他们可…

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日

一、项目简介 采用STM32f103C8t6单片机&#xff0c;使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题&#xff0c;给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式&#xff0c;即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…

IO端口与IO接口

I/O端口和I/O接口是计算机系统中用于连接外部设备的关键组成部分&#xff0c;两者密切相关&#xff0c;但又有明显的区别&#xff1a; I/O端口 (I/O Port): 定义: I/O端口是内存地址空间中的一组特殊地址&#xff0c;用于与外部设备进行数据交换。CPU通过向这些特定的地址写入…

muduo网络库介绍

文章目录 MuduoServer常见接口TcpServer类EventLoop类TcpConnection类 服务器搭建Client常见接口TcpClient类 客户端搭建 Muduo Muduo是陈硕大佬开发的,一个基于非阻塞IO和事件驱动的C高并发网络编程库 这是一个基于主从Reactor模型的网络编程库,线程模型是one loop per thre…

加法器以及标志位

加法器的结构&#xff1a; OF&#xff08;溢出标志位&#xff09;&#xff0c;SF&#xff08;符号标志位&#xff09;&#xff0c;ZF&#xff08;0标志位&#xff09;&#xff0c;ZF&#xff08;进位/借位标志位&#xff09; 有符号数看标志位&#xff1a;OF&#xff0c;SF 无符…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成

Deforum 与 AnimateDiff 不太一样&#xff0c; AnimateDiff 是生成丝滑变化视频的&#xff0c;而 Deforum 的丝滑程度远远没有 AnimateDiff 好。 它是根据对比前面一帧的画面&#xff0c;然后不断生成新的相似图片&#xff0c;来组合成一个完整的视频。 Deforum 的优点在于可…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system&#xff1a; Agent学会调用外部应用程序接口&#xff0c;以获取模型权重中缺失的额外信息&#xff08;预训练后通常难以更改&#xff09;&#xff0c;包括当前信息、代码执行能力、专有信息源…

【Godot4.3】简单物理模拟之圆粒子碰撞检测

概述 最近开始研究游戏物理的内容&#xff0c;研究运动、速度、加速度之类的内容。也开始模仿一些简单的粒子模拟。这些都是一些基础、简单且古老的算法&#xff0c;但是对于理解游戏内的物理模拟很有帮助。甚至你可以在js、Python或者其他程序语言中实现它们。 图形的碰撞检…

详解JavaScript中属性的特性getOwnPropertyDescriptor()等

属性的特性 可以认为一个属性包含一个名字和4个特性&#xff0c;它的值&#xff0c;可写性&#xff0c;可枚举性&#xff0c;可配置性。 因此&#xff0c;存储器属性的4个特性&#xff0c;读取&#xff0c;写入&#xff0c;可枚举&#xff0c;可配置。 定义了一个“属性描述…

Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;1&#xff09; 基础要素-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远&…

C++入门基础知识90(实例)——实例15【求两数的最大公约数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于求两数的最大公约数的相关内容&#xff…