当前位置:   article > 正文

对话机器人(三)——RASA:训练数据_rasa intent examples 作用

rasa intent examples 作用

1. 训练数据格式

使用YAML作为统一且可扩展的方式来管理所有训练数据,包括NLU数据、stories、rules。训练数据可以使用多个YAML文件,每个文件包含NLU数据、stories、rules的任意组合。

version: "3.1"
nlu:
- intent: greet
  examples: |
    - Hey
    - Hi
    - hey there [Sara](name)

- intent: faq/language
  examples: |
    - What language do you speak?
    - Do you only handle english?

stories:
- story: greet and faq
  steps:
  - intent: greet
  - action: utter_greet
  - intent: faq
  - action: utter_faq

rules:
- rule: Greet user
  steps:
  - intent: greet
  - action: utter_greet
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

| 是管道符号

nlu、stories、rules是对应的

data/nul.yml下包含训练数据

2. NLU 训练数据

保存为data/nlu.yml。

由用户话语的例子组成。examples包括实体,还可以添加synonym(同义词)、regex(正则表达式)、lookup(查找)以帮助正确识别意图和实体。

结构:nlu是一个列表,列表中每个元素都是一个字典,根据特殊含义的键区分不同字典的功能。

a. intent(意图)

普通字符直接表示即可。注:需要用小写字母。

nlu:
- intent: greet
  examples: |
    - 你好
    - 您好
    - 怎么了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(1) metadata

可以自定义NLU组件和需要示例的metadata,metadata包含任意键值对,会在nlu pipeline中被组件接收。

nlu:
- intent: greet
  examples:
  - text: |
      你好
    metadata:
      情绪:中性
  - text: |
      嘿!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
(2) metadata定义在意图层

代表该意图下所有的例子都包含该metadata。

nlu:
- intent: greet
  metadata: 
   	情绪: 中性
  examples:
  - text: |
      你好  
  - text: |
      嘿!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
(3) 指定检索意图

在检索意图后添加后缀,用于标识机器人特定响应键。

nlu:
-intent: chitchat/ask_name 
  examples: | 
    - 你叫什么名字?
    - 我可以知道你的名字吗?
    - 大家叫你什么?
    - 你有自己的名字吗?

-intent: chitchat/ask_weather 
  examples: | 
    - 今天天气如何?
    - 今天外面阳光明媚吗?
    - 噢,你介意帮我查一下天气吗?
    - 我喜欢柏林阳光明媚的日子。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
(4) 实体

用[实体值](实体类型名)表示。

完整语法:(role、group、value字段可选)

[<entity-text>]{"entity": "<entity name>", "role": "<role name>", "group": "<group name>", "value": "<entity synonym>"}
  • 1

如:“明天上海的天气如何”表示为“[明天](日期)[上海](城市)的天气如何?”明天是日期,上海是城市。

另一种表示方式:[实体值]{“key”: “value”,…}

[明天]{“entity”: “日期”}[上海]{“entity”: “城市”}的天气如何?

nlu:
- intent: check_weather
  examples: |
    - [明天](日期)[上海](城市)的天气如何?
    - [明天]{"entity": "日期"}[上海]{"entity": "城市"}的天气如何?
  • 1
  • 2
  • 3
  • 4
  • 5

❃ 获取方法:机器学习模型训练、正则表达式RegexEntityExtractor。

❃ 要从具有特定role/group的实体填充插槽,您需要为插槽定义from_entity ,插槽映射并指定所需的角色/组。

entities:
   - city:
       roles:
       - departure
       - destination
slots:
  departure:
    type: any
    mappings:
    - type: from_entity
      entity: city
      role: departure
  destination:
    type: any
    mappings:
    - type: from_entity
      entity: city
      role: destination
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

b. synonym(同义词)

存储同义词信息。在启动EntitySynonymMapper组件时,推理时会将得到的实体值的同义词替换成它的“标准词”。

只修改实体的值,不影响实体的类型。

nlu:
- synonym: 番茄
  examples: |
  - 蕃茄
  - 西红柿
  - 洋柿子
  - 火柿子
# 蕃茄、西红柿、洋柿子、火柿子会替换成番茄。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

c. regex(正则表达式)

正则表达式匹配的内容是否出现作为特征传给NER、意图识别。如提取身份证号码、电话号码、IP地址。

  • RegexFeaturizer组件:正则表达式的名称无关紧要。
  • RegexEntityExtractor组件:正则表达式的名称与要提取的实体名称匹配。
# 每当用户消息包含 10-12 位的序列时,它将被提取为一个account_number实体
nlu:
- regex: account_number
  examples: |
    - \d{10,12}
- intent: inform
  examples: |
    - 我的帐号是 [1234567891](account_number)
    - 这是我的帐号 [1234567891](account_number)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

d. lookup tables (查找表字段)

存储查找表。实体识别和意图识别时,若能提供额外的特征,可以提高准确度。如提供一个特征词列表(查找表)。

nlu:
- lookup: 城市
  examples: |
  	- 北京
  	- 上海
  	- ...
  	- 广州
  	- 深圳
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. 对话训练数据

用于训练对话管理模型。

a. stories

故事是用户和AI助手之间对话,转换成特定的格式,用户输入表示为意图(必要时表示为实体),而AI的响应和动作表示为动作名称

stories:
- story: 收集餐厅预订信息  # 故事名称
  steps:
  - intent: greet                         # 没有实体的用户消息 
  - action: utter_ask_howcanhelp
  - intent: inform                        # 用户消息与实体
    entities:
    - location: "罗马"
    - price: "便宜"
  - action: utter_on_it                  # 机器人应该执行的动作
  - action: utter_ask_cuisine
  - intent: inform
    entities:
    - cuisine: "西班牙"
  - action: utter_ask_num_people
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

故事用于训练机器人对话管理模型的训练数据,记录对话过程。记录用户的语义表达和系统内部正确的状态变化。

storiesstorymetadata、一系列steps组成。

stories:
- story: 和用户打招呼
  metadata:
    author: 某人
    key: value
  steps:
  - intent: greet
  - action: utter_greet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • story:取值任意,不参与训练。值代表这个故事的备注,用于给开发者提供该故事的信息。

  • metadata:取值任意,不参与训练,可选值。存储有关该故事的相关信息,比如作者author。

  • steps:通过列表线性表示用户和机器人之间的交互:每个step可以包含以下信息:

(1) 意图和实体

意图实体表示的用户消息。

steps:
- intent: inform
 entities:
 	- location: "上海"
 	- price: "实惠"   	
#  多个实体
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
(2) or 语句

故事仅仅在某个对话节点上存在不同,可以使用or来精简故事。

stories:
- story: 流程开始
 steps:
 - action:utter_ask_confirm
 - or:
   - intent: affirm
   - intent: thankyou
 - action: action_handle_affirmation
# 通过or语句生成两个故事,故事大部分相同,仅仅两者的意图不同,分别是 affirm、thankyou 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
(3) action

机器人执行的所有操作。在训练和测试对话管理系统时,rasa不会真正地执行相关的动作,无法获得动作运行的结果(事件)是什么,因此需要开发者在故事中明确地给出。

  • 回复(Responses): 以 utter_ 开头,发送一个特定的消息给用户

  • 自定义动作(custom actions): 以 action_ 开头,运行自定义代码,并且可以发送或不发送消息。

    # responses
    stories:
    - story: story with a response
      steps:
      - intent: greet
      - action: utter_greet   
    # 自定义动作
    stories:
    - story: story with a custom action
      steps:
      - intent: feedback
      - action: action_store_feedback
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

对于复杂的故事,可能存在用户请求一次后rasa连续执行多次动作的情况。

- action: action_on_it
- action: aticon_ask_howcanhelp
  • 1
  • 2
(4) 动作返回事件

内置的动作,rasa按照动作的类型自动给出返回的事件。自定义事件的故事,需要手动给出动作改变的状态。这种改变叫做事件。常用的事件包括词槽事件和active_loop事件。

  • 词槽事件:能对词槽状态进行更改的事件

    ❃ 伴随slot name和可选的 slot value。slot value是通过entities或者custom actions(自定义动作)设定的。

    - slot_was_set:
      - asked_for_help: true
    
    • 1
    • 2
    # 该story表示当前的feedback_value的槽位必须是positive,对话才能进行。
    stories:
    - story: story with a slot
      steps:
      - intent: celebrate_bot
      - slot_was_set:
        - feedback_value: positive
      - action: utter_yay
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    若slot value无关紧要,那只需要列出slot name:

    stories:
    - story: story with a slot
      steps:
       - intent: greet
       - slot_was_set:
         - name
       - action: utter_greet_user_by_name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • active_loop:负责激活和取消激活表单form。

     # 表单restaurant_form激活了
    -active_loop: restaurant_form
    
    • 1
    • 2
(5) form

特殊的自定义动作,包含了一个要求的槽位集合。 在domain.ymlforms section定义。一旦定义,需要为form指定一个happy path 作为一个 rule。在form中,也需要定义unhappy paths 让模型能够识别未曾见过的对话序列。示例格式如下:

stories:
- story: 有表单的故事
steps:
- intent: search_restaurant
- action: restaurant_form                # 激活form
- active_loop: restaurant_form           # 该form目前处于活动状态
- active_loop: null                      #当前form完成前,别的form不被激活
- action: utter_restaurant_found
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

action 激活了form并且开启了槽位填充的循环。

active_loop: restaurant_form表示现在有一个激活的form。

active_loop:null 表示在当前form完成前,别的form不被激活。


form可以在被中途打断了后仍处于激活状态;在这种情况下,中断应该出现在 action: <form to activate>步骤之后,然后是active_loop: <active form>步骤。表单的中断可能如下所示:

stories:
- story: 中断食物
steps:
  - intent: request_restaurant
  - action: restaurant_form
  - intent: chitchat			# 中断出现
  - action: utter_chitchat	  # 中断内容
  - active_loop: restaurant_form
  - active_loop: null
  - action: utter_slots_values
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
(6) 检查点checkpoints

减少故事中重复部分,名字相同的检查点之间可以互相跳转,将故事与另一个故事联系起来。

stories:
- story: 流程开始
 steps:
 - intent: greet
 - action: action_ask_user_question
 - checkpoint: check_asked_question
- story: 处理用户确认
 steps:
 - checkpoint: check_asked_question
 - intent: affirm
 - action: action_handle_affirmation
# 故事“流程开始”和“处理用户确认”通过检查点“check_asked_question”连接起来了 。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

故事开头的检查点也可以以设置的插槽为条件:

stories:
- story: story_with_a_conditional_checkpoint
  steps:
  - checkpoint: greet_checkpoint
    # 只有当槽设置为指定值时,此检查点才应适用
    slot_was_set:
    - context_scenario: holiday
    - holiday_name: thanksgiving
  - intent: greet
  - action: utter_greet_thanksgiving
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

b. rules

规则描述了应该始终遵循相同路径的简短对话。格式类似于story,conversation_startedconditions键用于指定规则应适用的条件。

# 有条件的规则
rules:
- rule: 当用户以 `greet` 意图开始对话时说 `hello`
  conversation_start: true
  steps:
  - intent: greet
  - action: utter_greet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
# 对话开始规则
rules:
- rule: 只有在用户提供姓名时才说“嘿”
   condition:
   - slot_was_set:
      - user_provided_name: true
   steps:
   - intent: greet
   - action: utter_greet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

❃ 在规则结束时跳过等待用户输入:完成最后一步后等待下一条用户消息

rules:
- rule: 应用时等待用户消息的规则
  steps:
  - intent: greet
  - action: utter_greet
  # - action: action_listen。   每个规则都隐含地包含对“action_listen”的预测作为最后一步。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

❃ 若将下一个动作预测交给另一个故事或规则, 添加 wait_for_user_input: false到规则中。

rules:
- rule: 应用就不会等待用户消息的规则 
  steps:
  - intent: greet
  - action: utter_greet
  wait_for_user_input: false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

不要过度使用规则

c. test stories

测试一个mesage是否被成功分类,用user指定实际的消息文本和文本中包含的实体。

stories:
- story: A basic end-to-end test
  steps:
  - user: |
     hey
    intent: greet
  - action: utter_ask_howcanhelp
  - user: |
     show me [chinese]{"entity": "cuisine"} restaurants
    intent: inform
  - action: utter_ask_location
  - user: |
     in [Paris]{"entity": "location"}
    intent: inform
  - action: utter_ask_price
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

d. end-to-end 训练

不必处理 NLU 管道提取的消息的特定意图,使用user将用户消息直接放入stories。

stories:
- story: user message structure
  steps:
    - user: the actual text of the user message
    - action: action_name
  • 1
  • 2
  • 3
  • 4
  • 5

可以添加实体标签,也可以将机器人话语直接放入stories中。

stories:
- story: 完整端到端的故事
  steps:
  - intent: greet
    entities:
    - name: 李明
  - bot: 你好!
  - intent: search_restaurant
  - action: utter_suggest_cuisine
  - user: 我总是去吃 [寿司](菜)
  - bot: 就我个人而言,我更喜欢披萨,不过我们还是去找找寿司店吧。
  - action: utter_suggest_cuisine
  - user: 祝你有美好的一天!
  - action: utter_goodbye
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

参考文献:
[1] 孔小泉,王冠.Rasa实战:构建开源对话机器人[M].电子工业出版社.2022:201.
[2] RASA官方文档 https://rasa.com/docs/rasa/rules

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/630341
推荐阅读
相关标签
  

闽ICP备14008679号