使用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还达不到自动与客户进行业务处理类的对话。