rasa NLU意图解析基础学习
一.rasa作用:
● Rasa NLU:提取用户想要做什么和关键的上下文信息。
● Rasa Core:基于对话历史,选择最优的回复和动作。
● 通道(channel)和动作(action):连接对话机器人与用户及后端服务系统。
● tracker store、lock store和event broker等辅助系统
二.rasa 项目构建:
# 创建虚拟环境 需要3.4以上,3.9以下,因为python版本识别问题3.10以上会识别问题
python -m venv rasa_env
source rasa_env/bin/activate # Linux/Mac
rasa_env\Scripts\activate # Windows# 安装Rasa核心库
pip install rasa# 初始化项目(自动生成示例文件)
rasa init --no-prompt
三.rasa项目结构:
1.domain.yml 定义实体和意图,回答
领域(domain)定义了对话机器人需要知道的所有信息,
包括意图(intent):告诉要处理的意图有哪些,比如:保险咨询,保单查询,理赔申请
实体(entity): 要提取的用户话语中的关键字和自己业务模型的领域实体: 比如: 保额,公司名称,产品名称
词槽(slot): 用户问题中需要抽取的实体,并且持久化对话中的关键信息,使对话系统能够根据这些信息跨多个回合(turns)保持一致性,避免重复询问或误解
动作(action和回复(response): 机器人回复的模板,可以在规则中配置,比如欢迎语,结束语
可以在后续故事中引用这些模版作为action
表单(form):
以完成任务为核心目的的对话过程,可以理解为引导用户填写表单(form)的过程。
2.nlu.yml : 训练数据文件
具有特殊含义的键有intent、synonym、regex和lookup。除intent外,其他3个都是可选的.
①具有intent键表明当前的对象是用来存储训练样例的,训练样例对象有一个名字为examples的列表,每个列表里面都是一个训练样本。
- intent: premium_inquiryexamples: |- 保费多少钱- 费率多少钱一个人- [雇主险]询价(insurance_type)- [团意险](insurance_type)的费率多少钱一个人- [100万](coverage_amount)保额需要多少保费- [50人](employee_count)公司的保费多少钱- 保费如何计算- 有没有保费优惠
②具有synonym键表明当前的对象是用来存储同义词信息的。例如,西红柿是番茄的同义词
- synonym: 团意险examples: |- 团体意外险- 团体人身意外险- 团体意外伤害保险- 团体人身意外险
③具有lookup键表明当前的对象是用来存储查找表的,例如地区表
④具有regex键表明当前的对象是用来存储正则表达式的,可以提取数字等等
3.rule.yml (硬性规则文件)
定义框架逻辑(如流程入口/出口)
使用场景:
需要 强制逻辑(如退出、安全操作、槽位状态跳转)。
高风险操作(如退款、删除数据)需严格遵循步骤。
必须执行的“硬规则
比如:
rules:- rule: 只要用户说再见,就回复说再见steps:- intent: goodbye- action: utter_goodbye
4.stories.yml (故事文件)
定义 示例路径(用于训练对话模型),通过 示例对话路径让模型学习如何响应,需要与 nlu.yml 一起训练模型
比如: 通过用户输入的条件,逐步补全后推荐产品列表
- story: 基本保险查询steps:- intent: greet #欢迎意图- action: utter_greet #欢迎语句模版- intent: insurance_inquiry #保险查询意图entities:- insurance_type: "企业财产险" #识别出实体保险产品类型- action: utter_ask_company_name #询问用户公司名称- intent: company_info_request #用户公司请求意图entities:- company_name: "科技有限公司" #识别用户输入的问题中公司名称实体- action: utter_ask_company_size #询问公司规模话术模版- intent: company_info_request #公司信息请求意图entities:- company_size: "中小企业" #识别出公司名称- action: utter_ask_industry_type #询问公司行业类型- intent: company_info_request #公司信息请求意图entities:- industry_type: "科技" #识别出公司的行业- action: utter_insurance_recommendation #推荐产品话术模型- intent: goodbye #再见意图- action: utter_goodbye #再见的话术
5.config.yml(配置文件)
①可以设置rasa主要语言
②Pipeline
NLU 处理流程:
Pipeline 定义了 Rasa 如何将用户的自然语言输入(文本或语音)转换为结构化的意图(Intent)和实体(Entities)。
对话状态跟踪:
通过组件组合,Pipeline 可以优化意图识别、实体提取的准确性,进而提升对话系统的整体表现。
模型定制化:
开发者可根据业务需求选择不同的组件(如词向量模型、特征提取器)来优化特定场景的处理能力(如多语言、领域特定实体)
比如定义: 分词器(JiebaTokenizer),词袋特征(CountVectorsFeaturizer), 匹配正则规则定义的实体(RegexFeaturizer)
language: "zh" # 语言设置(如中文)pipeline:- name: WhitespaceTokenizercase_sensitive: False- name: RegexFeaturizer # 匹配正则规则定义的实体- name: LexicalSyntacticFeaturizer # 词序特征- name: CountVectorsFeaturizeranalyzer: "char_wb"min_ngram: 1max_ngram: 4- name: ConveRT # 使用预训练词向量模型- name: DIETClassifierepochs: 200intent_token_masking: True # 掩码机制提升精度- name: ResponseSelectorepochs: 100
③Policies
Policies 是 Rasa 的决策引擎,通过 规则或机器学习模型,根据当前对话状态(如用户的意图、实体、对话历史、表单状态等)来选择下一步操作。具体作用包括:意图与实体的理解:基于 NLU 的输出(由 pipeline 处理)。
对话状态跟踪:维护对话上下文,记录用户的输入和机器人的响应。
决策制定:根据策略选择合适的回复、动作或流程分支。
错误处理:如用户输入超出范围时的回退逻辑
主要包括:
MemoizationPolicy: 记录用户和机器人之前的交互历史,通过记忆机制重复相同的操作路径。
RulePolicy: 基于 显式规则(定义在 domain.yml 的 rules 部分)控制对话流程。
TEDPolicy: 基于 机器学习模型,通过对话历史学习用户的意图模式,预测下一步动作。
FallbackPolicy :处理异常
④Policies 与 Pipeline 的区别
- Pipeline(在 NLU 配置中):负责将用户输入转化为 意图和实体(自然语言理解)。
- Policies(在 Core 配置中):基于 NLU 的输出和对话历史,决定下一步 动作或响应(对话决策)。
四.rasa训练调试
1.训练模型命令:
#训练模型rasa train#指定配置文件训练rasa train --config config.yml --domain domain.yml --data data/#测试对话rasa shell
2.训练好的模型会在models下
3.运行模型
启动rasa模型rasa run --cors "*" --enable-api启动指定模型rasa run --model ./models/model_20231025-144536.tar.gz日志
rasa run --log-file out.log
4.测试模型训练效果接口
http://localhost:5005/model/parse