以完成任务为核心目的的对话过程,可以理解为引导用户填写表单form的过程。
机器人会问用户想干什么。
用户表达了自己的需求(意图和实体)。
机器人按照用户的意图,确定合适的表单,并将用户在对话中提供的尸体信息填入其中。随后机器人查看表单中缺失的字段,按照一定的策略(字段顺序)询问用户关于缺失字段的问题。
用户提供缺失字段的信息。
机器人将缺失信息填入表单,询问下一个缺失字段。
往复循环,直至机器人发现表单填写完整,于是开始执行具体任务。
第一步:
在domain.yml中定义表单,如下所示:
forms: ##定义表单
weather_form: ##表单名称
ignored_intents: [] ##为整个表单定义要忽略的意图列表
required_slots: ##表单必须的词槽
- address
- date-time
##一旦表单操作被第一次调用,表单就会被激活,并提示用户输入下一个所需的槽值
第二步:
同时在domain.yml中定义和循环询问表单缺失词槽有关的意图,动作及回复,每次调用表单操作时,机器人都会要求用户提供尚未设置的required_slots中的下一个插槽,它通过查找名为utter_ask_{slot_name}的响应来做到这一点,如下所示:
intents:
- info_date
- info_address
actions:
- utter_ask_address
- utter_ask_date-time
responses:
utter_ask_address:
- text: 想查询哪里的天气呢?
utter_ask_date-time:
- text: 想查询什么时候的天气呢?
Tips:
记得先定义表单包含的词槽及对应的实体,如下所示:
entities:
- address
- date-time
slots:
address:
type: text
influence_conversation: false #仅用于存储信息,不会影响对话行为
mappings:
- entity: address
type: from_entity
date-time:
type: text
influence_conversation: false
mappings:
- entity: date-time
type: from_entity
第三步:
在config.yml中添加相关组件及策略,ResponseSelector及RulePolicy,如下所示:
pipeline:
- name: ResponseSelector
policies:
- name: RulePolicy
第四步:
在rules.yml中添加表单激活及提交的规则,如下所示:
rules:
- rule: activate weather form #通过规则指定什么时候进入表单,即激活表单
steps:
- intent: weather #意图
- action: weather_form #映射到动作
- active_loop: weather_form #动作副作用 进入填槽-询问的循环过程
- rule: Submit form
condition:
# Condition that form is active.
- active_loop: weather_form
steps:
- action: weather_form
- active_loop: null #循环结束
- slot_was_set:
- requested_slot: null #词槽完成
# The action we want to run when the form is submitted.
- action: action_weather_form_submit
最后:
在nlu.yml中添加询问缺失词槽意图的训练数据,如下所示:
- intent: info_date
examples: |
- [明天](date-time)
- [后天](date-time)
- [下个星期日](date-time)怎么样
- 还需要[昨天](date-time)的
- 我还要[昨天](date-time)的
- [明天](date-time)如何
- [后天](date-time)如何
- [星期六](date-time)呢
- [后天](date-time)的呢
- [明天](date-time)的怎么说
- [两天后](date-time)的大概什么样
- [前天](date-time)的
- 帮我查查[三天前](date-time)
- 帮我查查[下星期五](date-time)的
- 还要[明天](date-time)的
- intent: info_address
examples: |
- 告诉我[广州](address)怎么样
- [广州](address)
- 那么[辽宁](address)呢
- [北京](address)啥情况
- [厦门](address)怎么样
- [武汉](address)呢
- [香港](address)呢
- 我在[杭州](address)
- [上海](address)
- 在[宁波](address)呢
- [宁波](address)
- [首都](address)
大功告成啦!!!