NLU.yml:
nlu:
# - intent: greet
# examples: |
# -
# -
- regex: user_input_name
examples: |
- (?<=查)[a-zA-Z0-9\u4e00-\u9fa5]{2,5}(?=的)
- intent: info_input_name
examples: |
- 请帮我查[张三](user_input_name)的性别
- 帮我查[张三](user_input_name)的性别
- 查[张三](user_input_name)的性别
- 我想查[张三](user_input_name)的性别
其中regex的意思是正则表达式 user_input_name对应slot的名,包括你在上面也要进行引用
domain.yml
responses: #响应
utter_output_name: #响应名
- text: "{user_input_name}的性别是{db_get_sex}" #响应语句
- text: "{user_input_name}是{db_get_sex}"的 #响应语句
entities: #实体
- user_input_name #实体名
slots: #词槽
# name: 词槽名
# type: text 词槽类型
# mappings: 来源
# - type: custom 来源类型:custom代表自定义
# action: action_testName 行为:触发action_testName
user_input_name:
type: text
influence_conversation: false
mappings:
- type: from_entity
entity: user_input_name
db_get_sex:
type: text
mappings:
- type: custom
action: action_getSexByName
forms: #表单
name_form: #表单名
required_slots: #表单中包含的字段名
- user_input_name #字段名
actions: #行为
- action_getSexByName #行为名
还需要配置一下规则,规则简单来说就是给意图和响应绑定起来
rules: #规则
# - rule: ruleName #规则名
# steps:
# - intent: nluIntent #意图
# - action: domainUtter #行为
- rule: avtivate user_input_name form
steps:
- intent: info_input_name
- action: name_form #触发form表单
- action: action_getSexByName #触发action_getSexByName方法
- action: utter_output_name #触发回复的响应
配置完yml后可以开始编写Action的代码了,Action是可以对流程进行操作的,就可以做很多操作,这里我展示一下从数据库中收集数据并返回
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SlotSet
from rasa_sdk.executor import CollectingDispatcher
#引用所需的包
import pymysql
创建conn连接
conn = pymysql.connect(host='地址',
port=端口,
user='用户名',
passwd='密码',
db='数据库名',
charset = 'utf8'
)
、、
class ActionGetSexByName(Action): #此处参数内要天Action
def name(self): #这个带参方法必须实现
return 'action_getSexByName' #这个返回的是action的名字 前面domain.yml中有配置到
def run(self, dispatcher, tracker, domain): #这个带参方法也必须实现 参数可以有改动,具体可以看看官方文档
usex = "男"
vall = tracker.get_slot("user_input_name") #从词槽中获取对应的词,上面yml配置完会自动赋值
print("slot:")
print(vall)
sql = "select usex from tuser where uname = '%s'"%vall #这里是防Sql注入 不直接拼接
cursor = conn.cursor() #创建连接
try:
cursor.execute(sql) #执行sql语句
resul = cursor.fetchall() #fetchall()来获取语句查询到的所有数据
usex=resul[0][0] #因为是精准查询 所以只需要获取到第一位 数据格式是[[],[],[]]
print("resul")
print(resul)
return [SlotSet("db_get_sex",usex)] #SlotSet方法可以将数据插入词槽中,前台的响应就可以自动获取到了
except Exception as e:
print("Exception:")
print(e)
conn.rollback #错误回滚
return [SlotSet("db_get_sex",usex)]
finally:
cursor.close() #关闭连接
数据库的数据,具体需求可以自己编写sql语句: