rasa开发多轮对话机器人进阶

        使用rasa开发多轮对话机器的时候,发现配置很麻烦,且配置很容易出错,配置之间还存在关联关系,即便是使用界面也很繁琐。本文有一个新的思路,即通过一个引导生成对话机器人的机器人来创建对话机器人。这里以工单类客服机器人为例。

一、首先创建一个引导生成对话的机器人。

1.主要是在actions.py中去构建引导创建的流程,由于没有其它的函数判断填槽的状态,只能自己去控制填槽的状态,通过全局变量去记录当前的状态值。

from typing import Dict, Text, Any, List, Union
from rasa_sdk import Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.forms import FormValidationAction
from pypinyin import pinyin
import re
import os
from os import path
from os import mkdir
#创建配置及actions代码
from create_utils import (create_config_yml, create_data_nlu_yml, create_data_rules_yml, create_data_stories_yml, create_domain_yml,create_actions_py
)issues=None
sub_issues=None
collect_fields=None
issue=None
sub_issue=None
collect_field=None
i=0
j=0
k=0
request_other_fields_count = 0sys_name = None
entities_dict = []
slots_dict = []
nlu_dict = []
utter_ask_dict = []
utter_wrong_dict = []
validate_dict = []class ValidateCreateForm(FormValidationAction):"""Example of a form validation action."""def name(self) -> Text:return "validate_create_form"#收集信息生成配置,并自动开始训练def train(self, sys_name, entities_dict, slots_dict, nlu_dict, utter_ask_dict, validate_dict):if sys_name:create_config_yml(sys_name)create_data_nlu_yml(sys_name, nlu_dict)create_data_rules_yml(sys_name)create_data_stories_yml(sys_name)create_domain_yml(sys_name, entities_dict, slots_dict, utter_ask_dict)create_actions_py(sys_name, slots_dict, nlu_dict, validate_dict, utter_ask_dict)if not path.exists(f'{sys_name}/static'):mkdir(f'{sys_name}/static')for file_name in ['api.py','html_vue.py','data_utils.py','endpoints.yml','static/bot.jpg','static/dialogue.html','static/user.jpg']:command = f'cp {file_name} {sys_name}/{file_name}'output = os.system(command)print(f"cp {file_name} result:", output)command = f"cd {sys_name} && rasa train & cd .."output = os.system(command)print("rasa train result:", output)return#验证系统名称def validate_sys_name(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print('sys_name:', value)#收集系统名称global sys_namesys_name = valuereturn {"sys_name": value}else:dispatcher.utter_message(text="请输入系统名称,如:汽车客服工单系统")return {"sys_name": None}#验证主要问题分类def validate_issues(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:value = re.split(',|、',value)global issuesissues = valueglobal issueissue = value[i]print('issues:',value,'issue:',issue,'i:',i)#收集实体及槽位global entities_dictentities_dict.append(issue +'.issue')global slots_dictslots_dict.append(issue + '.issue')return {"issues": value, "issue": issue}else:dispatcher.utter_message(text=f"收集【{issue}】格式不对,各分类之间用,或、分隔开,请重新输入。")return {"issues": None}#验证子问题分类def validate_sub_issues(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:value = re.split(',|、',value)global sub_issuessub_issues = valueglobal sub_issuesub_issue = value[j]print('sub_issues:', value,'sub_issue:', sub_issue,"j:",j)#收集样本并进行实体标注global nlu_dictentity_name = '_'.join([v[0] for v in pinyin(issue)])nlu_dict.append(f'[{sub_issue}]({entity_name})')return {"sub_issues": value, "sub_issue": sub_issue}else:dispatcher.utter_message(text=f"收集【{sub_issue}】格式不对,各子分类之间用,或、分隔开,请重新输入。")return {"sub_issues": None}#验证收集的信息字段def validate_collect_fields(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:if value.find("、")>0:value = re.split('、',value)value = list(filter(None, value))else:value = [value]global collect_fieldscollect_fields = valueglobal collect_fieldprint('collect_fields->k:', k, 'value:', value)collect_field = value[k]print('collect_fields:',value,'collect_field:',collect_field,'k:',k)return {"collect_fields": value, "collect_field": collect_field}else:dispatcher.utter_message(text=f"收集【{collect_field}】格式不对,各信息之间用、分隔开,请重新输入。")return {"collect_fields": None}#验证收集信息字段的样本,至少要求2个以上def validate_nlu_examples(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:if value.find("、")>0:value = re.split('、',value)value = list(filter(None, value))else:value = [value]print('nlu_examples:',value)if len(value)<2:dispatcher.utter_message(text=f"【{collect_fields[k]}】样本数量不足2个,请重新输入。")return {"nlu_examples": None}#收集实体和槽位global entities_dict, slots_dictentities_dict.append(collect_field + '.' + sub_issue)slots_dict.append(collect_field + '.' + sub_issue)#收集样本,并进行实体标注global nlu_dictentity_name = '_'.join([v[0] for v in pinyin(collect_field)])for v in value:nlu_dict.append(f'[{v}]({entity_name})')return {"nlu_examples": value, "collect_questions": None}else:dispatcher.utter_message(text=f"【{collect_fields[k]}】样本格式不对,请重新输入。")return {"nlu_examples": None}#验证收集信息字段的提问def validate_collect_questions(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print("collect_questions:",value)global utter_ask_dictutter_ask_dict.append({collect_field:value})return {"collect_questions": value, "need_validate": None}else:dispatcher.utter_message(text=f"收集【{collect_field}】提问格式不对,请重新输入。")return {"collect_questions": None}#验证是否需要验证def validate_need_validate(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print("need_validate:",value)global issueglobal collect_fieldglobal entities_dictglobal slots_dictvalidate_dict.append({collect_field + '.need_validate': value})if value == "是":return {"need_validate": value, "operate": None, "value": None, "error_tips": None}else:global kif k < len(collect_fields)-1:k = k + 1collect_field = collect_fields[k]print('need_validate->collect_field:', collect_field)print('need_validate->k:',k)return {"collect_field": collect_field,"nlu_examples": None, "collect_questions": None, "need_validate": value,"operate": '-',"value": '-',"error_tips": '-',"need_other_fields": '-'}if k == len(collect_fields)-1:global jif j < len(sub_issues)-1:j = j + 1global sub_issuesub_issue = sub_issues[j]print('need_validate->sub_issue:', sub_issue)print('need_validate->j:',j)#收集样本并进行实体标注global nlu_dictentity_name = '_'.join([v[0] for v in pinyin(issue)])nlu_dict.append(f'[{sub_issue}]({entity_name})')k = 0return {"sub_issue": sub_issue,"collect_fields": None, "nlu_examples": None, "collect_questions": None, "need_validate": value,"operate": '-',"value": '-',"error_tips": '-',"need_other_fields": '-'}if j == len(sub_issues)-1:k = 0global i#中间激活其它信息收集need_other_fields = tracker.get_slot('need_other_fields')print("need_validate->need_other_fields:", need_other_fields)global request_other_fields_countrequest_other_fields_count += 1print("request_other_fields_count:", request_other_fields_count)if  (need_other_fields == None or need_other_fields == '-') and request_other_fields_count % 2 == 1:return {"nlu_examples": '-', "collect_questions": '-', "need_validate": value, "need_other_fields": None,"operate": '-',"value": '-',"error_tips": '-'}if i < len(issues)-1:i = i + 1issue = issues[i]print("need_validate->issue:",issue)print('need_validate->i:',i)j = 0return {"issue":issue,"sub_issues": None,"collect_fields": None, "nlu_examples": None, "collect_questions": None, "need_validate": value,"operate": '-',"value": '-',"error_tips": '-',"need_other_fields": None}if i == len(issues)-1:i = 0print("need_validate->issue:",issue)print('need_validate->i:',i)#收集实体和槽位entities_dict.append(issue + '.issue')slots_dict.append(issue + '.issue')print("need_validate->所有信息已收集,自动开始进行训练。i=0")print("sys_name:", sys_name)print("entities_dict:", entities_dict)print("slots_dict:", slots_dict)print("nlu_dict:", nlu_dict)print("utter_ask_dict:", utter_ask_dict)print("validate_dict:", validate_dict)print("utter_wrong_dict:", utter_wrong_dict)self.train(sys_name, entities_dict, slots_dict, nlu_dict, utter_ask_dict, validate_dict)return {"need_validate": value,"operate": '-',"value": '-',"error_tips": '-'}else:return {"need_validate": None}#验证收集信息时,若信息格式不对返回的错误提示def validate_error_tips(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print("error_tips:",value)#收集错误提示global issueglobal collect_fieldutter_wrong_dict.append({collect_field:value})global kif k < len(collect_fields)-1:k = k + 1collect_field = collect_fields[k]print('error_tips->collect_field:', collect_field)print('error_tips->k:',k)return {"collect_field": collect_field,"nlu_examples": None, "collect_questions": None, "error_tips": value,"operate": None,"value": None,"need_validate": None,"need_other_fields": None,"other_fields": '-'}if k == len(collect_fields)-1:global jif j < len(sub_issues)-1:j = j + 1global sub_issuesub_issue = sub_issues[j]print('error_tips->sub_issue:', sub_issue)print('error_tips->j:',j)#收集样本并进行实体标注global nlu_dictentity_name = '_'.join([v[0] for v in pinyin(issue)])nlu_dict.append(f'[{sub_issue}]({entity_name})')k = 0return {"sub_issue": sub_issue,"collect_fields": None, "nlu_examples": None, "collect_questions": None, "error_tips": value,"operate": None,"value": None,"need_validate": None,"need_other_fields": None,"other_fields": None}if j == len(sub_issues)-1:k = 0global ineed_other_fields = tracker.get_slot('need_other_fields')print("error_tips->need_other_fields:", need_other_fields)global request_other_fields_countrequest_other_fields_count += 1print("request_other_fields_count:", request_other_fields_count)if  (need_other_fields == None or need_other_fields == '-') and request_other_fields_count % 2 == 1:return {"nlu_examples": '-', "collect_questions": '-', "error_tips": value}if i < len(issues)-1:i = i + 1issue = issues[i]print("error_tips->issue:",issue)print('error_tips->i:',i)global entities_dictentities_dict.append(issue + '.issue')global slots_dictslots_dict.append(issue + '.issue')j = 0return {"issue":issue,"sub_issues": None,"collect_fields": None, "nlu_examples": None, "collect_questions": None, "error_tips": value,"operate": None,"value": None,"need_validate": None,"need_other_fields": None,"other_fields": None}if i == len(issues)-1:i = 0print("error_tips->所有信息已收集,自动开始进行训练。")print("sys_name:", sys_name)print("entities_dict:", entities_dict)print("slots_dict:", slots_dict)print("nlu_dict:", nlu_dict)print("utter_ask_dict:", utter_ask_dict)print("validate_dict:", validate_dict)print("utter_wrong_dict:", utter_wrong_dict)self.train(sys_name, entities_dict, slots_dict, nlu_dict, utter_ask_dict, validate_dict)return {"error_tips": value}else:dispatcher.utter_message(text=f"【{collect_field}】错误提示格式不对,请重新输入。")return {"error_tips": None}#验证收集信息字段时的逻辑运算符  def validate_operate(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value in ['等于','包含','不包含','匹配','在列表中','范围']:print('operate:', value)#收集验证的逻辑运算符global validate_dictvalidate_dict.append({collect_field + '.operate':value})return {"operate": value}else:dispatcher.utter_message(text=f"【{collect_field}】验证逻辑操作格式不对,请求重新输入。如:等于,包含,不包含,匹配,在列表中,范围")return {"operate": None}#验证收集信息字段的取值def validate_value(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print('value:', value)global validate_dictvalidate_dict.append({collect_field +'.value': value})return {"value": value}else:dispatcher.utter_message(text=f"【{collect_field}】验证取值格式不对,请求重新输入。")return {"value": None}#验证是否需要收集其它必填信息字段def validate_need_other_fields(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:print('need_other_fields:', value)if value == "是":return {"need_other_fields": value, "other_fields": None}else:if i == len(issues)-1:#收集实体和槽位global entities_dictentities_dict.append(issue + '.issue')global slots_dictslots_dict.append(issue + '.issue')print("validate_need_other_fields:所有信息已收集,自动开始进行训练。")print("sys_name:", sys_name)print("entities_dict:", entities_dict)print("slots_dict:", slots_dict)print("nlu_dict:", nlu_dict)print("utter_ask_dict:", utter_ask_dict)print("validate_dict:", validate_dict)print("utter_wrong_dict:", utter_wrong_dict)self.train(sys_name, entities_dict, slots_dict, nlu_dict, utter_ask_dict, validate_dict)return {"need_other_fields": value, "other_fields": '-'}else:return {"need_other_fields": value, "sub_issues": None,"collect_fields": None, "nlu_examples": None, "collect_questions": None, "error_tips": None,"operate": None,"value": None,"need_validate": None,"other_fields": '-'}else:dispatcher.utter_message(text=f"是否需要收集其它信息格式不对,请求重新输入。")return {"need_other_fields": None}#验证收集的其它必填信息字段def validate_other_fields(self,value: Text,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> Dict[Text, Any]:if value:if value.find("、")>0:value = re.split('、',value)value = list(filter(None, value))else:value = [value]global collect_fieldscollect_fields = valueglobal collect_fieldglobal kcollect_field = value[k]print('other_fields:',value, 'collect_fields:',value ,'collect_field:',collect_field,'k:',k)#收集实体和槽位global entities_dict, slots_dictentities_dict.append(collect_field + '.' + issue)slots_dict.append(collect_field + '.' + issue)return {"other_fields": value, "collect_fields": collect_fields,  "collect_field": collect_field,"nlu_examples": None, "collect_questions": None, "need_validate": None,"operate": None,"value": None,"error_tips": None}else:dispatcher.utter_message(text=f"收集【{collect_field}】格式不对,各信息之间用、分隔开,请重新输入。")return {"other_fields": None}

2. domain.yml

version: '3.1'
session_config:session_expiration_time: 60carry_over_slots_to_new_session: true
intents:
- 停止
- 创建请求
- 否定
- 打招呼
- 挑战机器人
- 肯定
- 说再见
- 闲聊forms:create_form:ignored_intents:- 闲聊required_slots:- sys_name- issues- sub_issues- collect_fields- nlu_examples- collect_questions- need_validate- operate- value- error_tips- need_other_fields- other_fields
slots:sys_name:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: sys_nameissues:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: issuessub_issues:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: sub_issuescollect_fields:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: collect_fieldsnlu_examples:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: nlu_examplescollect_questions:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: collect_questionsneed_validate:type: textinfluence_conversation: falsemappings:- type: from_intentintent: 肯定value: 是conditions:- active_loop: create_formrequested_slot: need_validate- type: from_intentintent: 否定value: 否conditions:- active_loop: create_formrequested_slot: need_validateneed_other_fields:type: textinfluence_conversation: falsemappings:- type: from_intentintent: 肯定value: 是conditions:- active_loop: create_formrequested_slot: need_other_fields- type: from_intentintent: 否定value: 否conditions:- active_loop: create_formrequested_slot: need_other_fieldsother_fields:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: other_fieldserror_tips:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: error_tipsoperate:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: operatevalue:type: textinfluence_conversation: falsemappings:- type: from_textconditions:- active_loop: create_formrequested_slot: valuecollect_field:type: textinfluence_conversation: falsemappings:- type: customissue:type: textinfluence_conversation: falsemappings:- type: customsub_issue:type: textinfluence_conversation: falsemappings:- type: custom
responses:utter_ask_sys_name:- text: 您希望给对话系统设置的名字是?如:汽车客服工单多轮对话系统utter_ask_issues:- text: 【{sys_name}】需要收集的问题类别有哪些?如:产品问题、零部件问题、售后问题、销售问题、咨询建议表扬utter_ask_sub_issues:- text: |【{issue}】包含的子类问题有哪些?以【产品问题】为例,如:启动困难、一键启动系统故障、自动启动系统故障utter_ask_collect_fields:- text: |针对【{sub_issue}】需要收集哪些信息呢?以【启动困难】为例,如:故障现象、环境温度utter_ask_nlu_examples:- text: |针对【{collect_field}】请给出2个以上的训练样本,用中文、分隔开。以【故障现象】为例,如:启动多次才成功、点火时间长才能启动;以【环境温度】为例,如:零下8度、10度utter_ask_collect_questions:- text: |收集【{collect_field}】信息时,你希望表达的问句是?以【启动困难】为例,如:是启动多次才成功还是点火时间长才能启动?utter_ask_need_validate:- text: |收集【{collect_field}】信息时,是否需要对其取值进行验证?utter_ask_need_other_fields:- text: |针对【{issue}】,您是否需要收集其它的信息?utter_ask_other_fields:- text: |针对【{issue}】,您需要收集的信息是?以【产品问题】为例,如:车主全名、手机号、车型、车架号、车牌号、特约店utter_ask_error_tips:- text: |收集【{collect_field}】信息验证失败时,你希望表达的提示是? 如:【{collect_field}】数据格式不对或不存在,请重新输入。utter_ask_value:- text: |验证【{collect_field}】时的取值,字符串(含正则表达式)或列表,单位 如:公里、度、转;故障现象 如:点火时间长才能启动;正则表达式 如:手机号、车架号、车牌号可用正则表达式来验证;车型列表 如:雅阁、飞度、冠道;范围 如:转速 1000-9000utter_ask_operate:- text: |验证【{collect_field}】的逻辑操作符,如:等于、包含、不包含、匹配、在列表中、范围utter_submit:- text: 您的信息我已经记录下来,我将自动创建【{sys_name}】并进行训练。utter_说再见:- text: 感谢您的来电!utter_闲聊:- text: 闲聊utter_ask_continue:- text: 您要继续吗?utter_default:- text: 对不起,小优还不明白您的意思,请重新描述一下。utter_打招呼:- text: 您好,我是一个引导创建服务工单多轮对话系统的机器人小优,有什么需要我帮您的吗?utter_挑战机器人:- text: 我是一个引导创建服务工单多轮对话系统的机器人,通过rasa开发构建。utter_restart:- text: restarted
actions:
- utter_ask_need_validate
- utter_ask_collect_fields
- utter_ask_collect_questions
- utter_ask_error_tips
- utter_ask_issues
- utter_ask_need_other_fields
- utter_ask_nlu_examples
- utter_ask_other_fields
- utter_ask_sub_issues
- utter_ask_sys_name
- utter_打招呼
- utter_说再见
- utter_闲聊
- validate_create_form

3. data/nlu.yml

version: "3.1"
nlu:
- intent: 打招呼examples: |- 嗨- 嘿- 嗨机器人- 嘿机器人- 哈喽- 早上好- 大家好- 机器人你好- 嗨朋友- 你好- hello- hi- hei
- intent: 肯定examples: |- 是的- 对的- 嗯- 额,是的- 我们继续吧- 是- 对- 能- 可以- 有- 需要- yes- 哦- 嗯呢
- intent: 否定examples: |- 不- 不是- 不对- 这不适合我- 不可以- 不能- 否- 不需要- 没有- no
- intent: 创建请求examples: |- 我想创建一个服务工单系统- 等于、包含、不包含、匹配、在...中- 产品问题、销售问题、售后问题、零部件、咨询建议表扬- 启动困难、一键启动系统故障、字段启停系统故障、怠速不稳定、怠速熄火、怠速异响- 车主姓名、手机号、车型、车架号、车牌号、特约店、车辆目前公里数、故障发生时间、公里数、路况、车速、转速、故障位置、现象描述、出现次数、第N次、第N次的时间、第N次的公里数、维修方案、故障问题、特约店的诊断结果、特约店的解决方案、客户述求、不满原因- 车主姓名、手机号、车型、车架号、车牌号、零件名称、零部件号、特约店、精品投诉、特约店的解决方案、客户述求、不满原因- 车主姓名、手机号、车型、车架号、车牌号、特约店、涉及人员、服务不良描述、送点时间、公里数、特约店的解决方案、客户述求、不满原因- 车主姓名、手机号、车型、车架号、车牌号、特约店、涉及人员、服务不良描述、特约店的解决方案、客户述求、不满原因- 客户姓名、手机号、咨询内容- 故障原因、环境温度- 故障原因、故障步骤- 故障原因、转速的变化、车辆是否抖动- 转速、频率- 转速、部位- 是否手动挡、故障挡位、车速、转速- 是否手动挡、故障挡位、部位、路况、车速、转速- 机油消耗数值、数值来源、故障现象- 汽油消耗数值、数值来源、故障现象- 启动多次、点火时间长、- 熄火- 转速是多少?- 温度是多少?- 出现几次了?- 是经常熄火吗?- 是经常发生吗?- 发生多少次了?- 启动不起来了- 发动不了了- 态度不好- 无人接待- 你到了多长时间无人接待呢?- 到店时间- 业务繁忙导致冷淡了客户- 有没有留意到空闲接待员- 到店目的- 是否需要预约安排?- 是启动多次才成功还是点火时间长才能启动?
- intent: 说再见examples: |- 嗯,谢谢你!拜拜!- 再见!- 好的,谢谢你!- 谢谢!- 谢谢你,再见!
- intent: 闲聊examples: |- 你怎么样?- 今天天气怎么样?- 下雨了吗?- 天气热不热?- 下雪了吗?- 你是学生吗?- 你真好看- 你真漂亮- 你真了不起
- intent: 停止examples: |- 你帮不了我- 你毫无帮助- 你能给我想要的吗?- 结束吧- 还有其它的吗?- 停止
- intent: 挑战机器人examples: |- 你是机器人吗?- 你是人类吗?- 我是在和机器人讲话吗?- 我是在和人类说话吗?
- lookup: 打招呼examples: |- 你好- 你好啊- 哈喽- hi- hello- 早上好- 中午好- 下午好

4. rules.yml

version: "3.1"
rules:- rule: 打招呼steps:- intent: 打招呼- action: utter_打招呼- rule: 说再见steps:- intent: 说再见- action: utter_说再见- rule: 挑战机器人steps:- intent: 挑战机器人- action: utter_挑战机器人- rule: 闲聊steps:- intent: 闲聊- action: utter_闲聊- rule: 通过创建请求激活创建表单steps:- intent: 创建请求- action: create_form- active_loop: create_form- rule: 提交创建表单condition:- active_loop: create_formsteps:- action: create_form- active_loop: null- action: utter_submit

5.stories.yml

version: "3.1"
stories:- story: 停止表单+继续steps:- intent: 创建请求- action: create_form- active_loop: create_form- intent: 停止- action: utter_ask_continue- intent: 肯定- action: create_form- active_loop: null- action: utter_submit- story: 停止表单+停止steps:- intent: 创建请求- action: create_form- active_loop: create_form- intent: 停止- action: utter_ask_continue- intent: 否定- action: action_deactivate_loop- active_loop: null

二、通过与引导生成对话的机器人进行对话,来生成对话机器人。

        

三、对话完成后工单系统机器人的效果

 四、评价

       rasa构建对话系统的好处是可以根据具体需求去构建,填写表单过程中可以增加闲聊,打断当前过程,之后也可以续上,缺点是配置繁琐、不够灵活,对话过程基本上都是预先设定好的,没有chatgpt的理解能力强,但是目前chatgpt还达不到自动与客户进行业务处理类的对话。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用手机进行英语学习?

手机的作用在现在已经不仅仅是打电话这么简单了.尤其是现在的智能手机,如果说他是掌上电脑已经不为过了. 手机的一大特点是非常的便利,并且可以随时的带在身上.如何在手机的身上进行发掘的话,你将会发现一部智能手机将会成为你的学习利器. 英语的重要性已经不需要在强调了.如何…

​每天十分钟| Get实用在线英语启蒙教育APP—叽里呱啦

作为家有幼儿宝宝的老母亲&#xff0c;曾经也被“陪娃上课&#xff0c;陪娃写作业”的恐惧深深地支配过。尤其是在给宝宝辅导英语启蒙的过程中&#xff0c;为娘切身地感受到&#xff1a; 兴趣是英语启蒙的原动力&#xff0c;所以在启蒙过程中&#xff0c;家长为孩子选择一款专…

测试英语小软件,儿童学英语软件哪个好,亲测这四款很不错

很多家长都在不断寻求儿童学英语的好方法&#xff0c;比如利用绘本拼读、上少儿英语培训班、做英语小游戏等等&#xff0c;但还有一种儿童学英语的途径常常被大家忽略&#xff0c;就是儿童学英语软件。儿童学英语软件哪个好&#xff0c;现在也有许多家长尝试利用一些学习软件来…

43 岁知名技术大佬当街遇刺身亡,马斯克都怒了!

整理 | 郑丽媛、出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 美国当地时间周二傍晚&#xff0c;旧金山警察局发布了一则案件通告&#xff1a; 周二凌晨&#xff0c;旧金山警察局南区分局接到了一个报警电话&#xff0c;称在 Main Street 的第 300 街区发生了一…

真正的AGI,既然是高度仿真人类的,是否可能也要经历过恐惧的体验?

&#xff08;本文纯属一本正经扯淡&#xff0c;但讨论的命题是深刻古老的...&#xff09; 一年多前&#xff0c;OpenAI的缔造者Sam Altman在一档Podcast《成就的艺术》&#xff08;The Art of Accomplishment&#xff09;中被问到&#xff0c;如果有一个让人工智能感受到恐惧的…

一文快速了解 GPT-4

从文本到图像&#xff0c;GPT-4将彻底改变我们与AI互动的方式 近年来&#xff0c;语言模型的发展已成为人工智能领域的一个关键研究领域。由OpenAI开发的GPT&#xff08;生成预训练变换器&#xff09;模型一直处于这一研究的前沿。GPT-4是该系列的最新版本&#xff0c;建立在其…

论文分享丨Holistic Evaluation of Language Models

摘要&#xff1a;该文为大模型评估方向的综述论文。 本文分享自华为云社区《【论文分享】《Holistic Evaluation of Language Models》》&#xff0c;作者&#xff1a;DevAI。 大模型&#xff08;LLM&#xff09;已经成为了大多数语言相关的技术的基石&#xff0c;然而大模型的…

大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解

大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解 1.GPT 模型 1.1 GPT 模型简介 在自然语言处理问题中&#xff0c;可从互联网上下载大量无标注数据&#xff0c;而针对具体问题的有标注数据却非常少&#x…

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍 1.大语言模型的预训练 1.LLM预训练的基本概念 预训练属于迁移学习的范畴。现有的神经网络在进行训练时&#xff0c;一般基于反向传播&#xff08;Back Propagation&…

【成为架构师课程系列】预备架构 Pre-Architecture 的故事

目录 前言 Pre-architecture的故事 Pre-architecture 核心“四步法” 需求结构化 架构约束

金融领域FinBERT、BloombergGPT以及法律领域微调模型LawGPT_zh

来自&#xff1a;老刘说NLP 进NLP群—>加入NLP交流群 本文继续介绍金融领域大模型FinBERT、金融领域大模型BloombergGPT以及法律领域微调模型LawGPT_zh三个垂域模型。 一、金融领域大模型FinBERT 熵简FinBERT在网络结构上采用与 Google 发布的原生BERT 相同的架构&#xff0…

LaWGPT基于中文法律知识的大语言模型

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; LaWGPT 是一系列基于中文法律知识的开源大语言模型。 该系列模型在通用中文基座模型&#xff08;如 Chinese-LLaMA、ChatGLM 等&#xff09;的基础上扩充法律领域专有词表、大规模中文法律语料预训练&a…

必不可少的Firefox插件(一)

1. FireBug 在众多插件中Firebug无疑是大家最熟悉用的最多的了。Firebug集成在Firefox中&#xff0c;提供了一套开发辅助工具&#xff0c;诸如页面HTML、CSS、Javascript的浏览、编辑、调试、网络监控等等…… 2. FireShot FireShot是一款具有完备功能的屏幕截图插件。除了传统…

火狐安卓版支持油猴了!后面将支持更多扩展插件

日前火狐浏览器每夜构建版的安卓版已经带来了更多扩展程序支持&#xff0c;这其中就包括大名鼎鼎的油猴扩展程序。本次火狐浏览器每夜构建版更新新增五款扩展程序支持&#xff0c;并且按照谋智基金会说法还会支持更多的扩展程序。 下载地址&#xff1a;https://ftp.mozilla.org…

火狐浏览器自带抓包插件及httpWatch9.1安装软件+教程

火狐浏览器自带抓包插件及httpWatch9.1安装软件教程 [复制链接] httpWatch9.1不支持 火狐40 httpwatch9.4 破J版 语言&#xff1a;英文 支持最新版的火狐浏览器.35版 以前用9.1的 支持27的火狐浏览器.但是第二天就自动更新了.设置了不更新也给我更新了. 9.1的httpwatch就不…

火狐浏览器必备的一些Hack插件

1.HackBar 小工具包&#xff0c;包含一些常用的工具。(SQL injection,XSS,加密等) 点击安装、安装之后大概是这个样子 2.User Agent Switcher 修改浏览器的User Agent,可以用来XSS。 点击安装、安装好后 3.Firebug是网页浏览器 Mozilla Firefox 下的一款开发类扩展&#xff0c…

火狐浏览器上类似HTTPWATCH的插件

在IE下我们可以用httpwatch来抓取http请求的包信息&#xff0c;这对我们分析自己开发程序的执行效率是非常有帮助的。 而火狐强大的JS调试功能&#xff0c;使我已经养成用firefox来查看调试JS的习惯。那么有没有一款插件可以让火狐也有http的抓包功能而不用让在两个浏览器之间…

[开发浏览器实战]关于Firefox火狐浏览器的说明一二(国内版 国际版区别 账号切换 插件-恢复关闭的标签页 插件-tempermonkey油猴)

[开发浏览器实战]关于Firefox火狐浏览器的说明一二 1.下载地址2.同步账号不一样国内版 3.浏览器关于内容不同:国内版国际版![在这里插入图片描述](https://img-blog.csdnimg.cn/8ca563d2aa2d43b0b52b6cf50bbffa0c.png) 灵活使用firefox推荐插件1.tempermonkey油猴2.恢复关闭的标…

好用的5款火狐浏览器必备插件,每一款都很实用

火狐浏览器是非常好用的浏览器&#xff0c;很多年轻人都很喜欢用。火狐浏览器虽然好用&#xff0c;但是如果没有安装插件&#xff0c;那么上网冲浪就感觉没有那么方便了。因此&#xff0c;给大家分享5款好用的火狐浏览器必备插件&#xff0c;这些都经过实际测试使用&#xff0c…

微软为ChatGPT打造专用超算!

来源&#xff1a;量子位 微软砸下大几亿美元&#xff0c;专门为训练ChatGPT打造了一台超算——上万张英伟达A100芯片打造&#xff0c;甚至专门为此调整了服务器架构&#xff0c;只为给ChatGPT和新必应AI提供更好的算力。 △图源&#xff1a;微软 不仅如此&#xff0c;微软还在A…