Rasa 使用ResponseSelector实现FAQ和闲聊

2022-12-01 18:40:34 浏览数 (1)

文章目录
  • 1. 定义用户问题
  • 2. 定义问题答案
  • 3. 训练 Rasa
  • 4. FAQ机器人
    • nlu.yml
    • responses.yml
    • stories.yml
    • rules.yml
    • domain.yml
    • config.yml
    • endpoints.yml
    • 客户端/服务端
    • 测试

learn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code

FAQ:常见问题解答

1. 定义用户问题

ResponseSelector 训练数据中的 意图 命名格式跟普通的意图 格式不一样:

  • ResponseSelector 需要采用 group/intent 格式(group称为 检索意图)
  • 普通意图 命名不能包含/字符

示例

代码语言:javascript复制
nlu:
  - intent: faq/work_location
    examples: |
      - 校园招聘录取的应届生主要工作地点在哪里?

2. 定义问题答案

ResponseSelector 定义 responses 作为 intent 问题答案

  • 约定:intent 名字假设为 x/y, responses 名字为 utter_x/y
代码语言:javascript复制
responses:
  utter_faq/work_location:
    - text: 招聘信息中包含各职位的工作地点内容,请参考各职位内容的详细介绍。

3. 训练 Rasa

  • ResponseSelector 加入 pipeline
代码语言:javascript复制
pipeline:
  - name: xxx特征提取组件
  - name: xxx意图分类组件
  - name: "ResponseSelector"
  • 启用 RulePolicy,自动进行问题分类,返回对应答案
代码语言:javascript复制
policies:
  - name: MemoizationPolicy
  - name: TEDPolicy
  - name: RulePolicy
  • rules 设置问题分类映射到动作
代码语言:javascript复制
rules:
  - rule: respond to FAQs
    steps:
      - intent: faq
      - action: utter_faq

4. FAQ机器人

功能分类:业务无关(打招呼)、业务相关(招聘)

tree

代码语言:javascript复制
.
├── code_snippets_used_in_book
│   └── webclient.html
├── config.yml
├── credentials.yml
├── data
│   ├── nlu.yml
│   ├── responses.yml
│   ├── rules.yml
│   └── stories.yml
├── domain.yml
├── endpoints.yml
├── github-markdown.css
├── index.html
├── __init__.py
├── media
│   └── demo.png
├── README.md
├── showdown.min.js
└── webchat.js

nlu.yml

代码语言:javascript复制
version: "3.0"
nlu:
  - intent: goodbye
    examples: |
      - 拜拜
      - 再见
      - 拜
      - 退出
      - 结束
  - intent: greet
    examples: |
      - 你好
      - 您好
      - hello
      - hi
      - 喂
      - 在么
  - intent: faq/notes
    examples: |
      - 应聘ACME校园招聘职位的注意事项?
  - intent: faq/work_location
    examples: |
      - 校园招聘录取的应届生主要工作地点在哪里?
  - intent: faq/max_job_request
    examples: |
      - 最多申请几个职位?
  - intent: faq/audit
    examples: |
      - 各阶段审核说明
  - intent: faq/write_exam_participate
    examples: |
      - 怎样参加笔试?
  - intent: faq/write_exam_location
    examples: |
      - 笔试考试地点如何安排?
  - intent: faq/write_exam_again
    examples: |
      - 笔试只安排一次吗?我笔试当天没有参加,是否还有再次笔试的机会?
  - intent: faq/write_exam_with-out-offer
    examples: |
      - 如果我没有收到笔试通知,但我很想进入ACME,能否直接进入考场参加考试?
  - intent: faq/interview_arrangement
    examples: |
      - 面试什么时候开始?会提前多少天通知面试安排?
  - intent: faq/interview_times
    examples: |
      - 一般会安排几次面试?
  - intent: faq/interview_from
    examples: |
      - 面试的形式是怎样的?是单独面试还是小组面试?
  - intent: faq/interview_clothing
    examples: |
      - 对面试的服装有什么具体的要求?
  - intent: faq/interview_paperwork
    examples: |
      - 面试时需要携带什么资料?
  - intent: faq/interview_result
    examples: |
      - 如何查询面试结果?

responses.yml

代码语言:javascript复制
version: "3.0"
responses:
  utter_faq/notes:
    - text: 1、登在校园招聘板块内的职位信息才适用于应届毕业生招聘,请所有的应届毕业生去校园招聘的版块寻找您感兴趣的职位。2、列出的每个职位的要求是该职位的最低要求,为了保证您应聘的成功率,希望您严格按照职位的要求考虑您的选择。3、提交成功后,在招聘结束前,您将不能修改或再次提交简历,因此,请于仔细确认填写信息后提交简历。
  utter_faq/work_location:
    - text: 招聘信息中包含各职位的工作地点内容,请参考各职位内容的详细介绍。
  utter_faq/max_job_request:
    - text: 对于校园招聘,最多申请2个职位。
  utter_faq/audit:
    - text: 1、简历审核:应聘者需要通过ACME网站,填写并提交个人简历,ACME的招聘专员将对收取的简历进行认真的审查和筛选。了解应聘者的情况,并筛选出符合职位要求的简历,同时确认简历记载内容是否属实。2、笔试审核:ACME技术类测试主要针对应聘者的专业技能进行检查和评价。3、面试审核:经过实施评价应聘者基本素质的第一阶段面试和评价专业知识的第二阶段面试,对应聘者是否符合ACME人才理念以及应聘者的工作能力做出客观的综合评价,从而决定是否录用该应聘者。
  utter_faq/write_exam_participate:
    - text: 通过简历审核的应聘者,我们将采用短信、e-mail、ACME公告栏以及电话通知的方式告知您
  utter_faq/write_exam_location:
    - text: 笔试地点将根据您在简历中填写的学校所在城市进行统筹安排
  utter_faq/write_exam_again:
    - text: 校园招聘的大规模的笔试仅安排一次,请收到笔试通知的同学认真对待笔试机会。
  utter_faq/write_exam_with-out-offer:
    - text: 由于我们是按照严格的招聘流程筛选出的笔试名单,所以非常抱歉,对于没有收到笔试通知的同学,就不能参加本次校园招聘的笔试。
  utter_faq/interview_arrangement:
    - text: 不同的职位面试进度安排不同,除特殊安排外,笔试结束一周左右会安排面试。
  utter_faq/interview_times:
    - text: 一般情况下,业务部门和人力资源部会同时或者分别安排一次面试。个别特殊职位需要2次及以上的面试。
  utter_faq/interview_from:
    - text: 面试一般以单独面试的形式进行,但根据各公司的面试安排,也会进行小组面试。
  utter_faq/interview_clothing:
    - text: 面试着装没有统一要求,但建议您尽量穿着较为正式的职业装参加。
  utter_faq/interview_paperwork:
    - text: 面试时,请您携带可以证明您身份的有效证件,有特殊要求的职位请携带好能证明您专业水平的证书原件以及复印件。
  utter_faq/interview_result:
    - text: 我们会通过邮件或电话的形式,通知您面试结果。

stories.yml

代码语言:javascript复制
version: "3.0"
stories:
  - story: greet
    steps:
      - intent: greet
      - action: utter_greet
  - story: say goodbye
    steps:
      - intent: goodbye
      - action: utter_goodbye

rules.yml

代码语言:javascript复制
version: "3.0"
rules:
  - rule: respond to FAQs
    steps:
      - intent: faq
      - action: utter_faq

domain.yml

代码语言:javascript复制
version: "3.0"

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true
intents:
  - goodbye
  - greet
  - faq
responses:
  utter_greet:
    - text: 你好,我是 Silly,我是一个基于 Rasa 的 FAQ 机器人
  utter_goodbye:
    - text: 再见!
  utter_default:
    - text: 系统不明白您说的话
actions:
  - utter_goodbye
  - utter_greet
  - utter_default
  - respond_faq

config.yml

代码语言:javascript复制
recipe: default.v1
language: "zh"

pipeline:
  - name: JiebaTokenizer
  - name: LanguageModelFeaturizer
    model_name: "bert"
    model_weights: "bert-base-chinese"
  - name: "DIETClassifier"
    epochs: 100
    tensorboard_log_directory: ./log
    learning_rate: 0.001
  - name: "ResponseSelector"

policies:
  - name: MemoizationPolicy
  - name: TEDPolicy
  - name: RulePolicy

endpoints.yml

代码语言:javascript复制
action_endpoint:
  url: "http://localhost:5055/webhook"

客户端/服务端

html、 js 等文件

测试

  • 训练 rasa train
  • 运行服务 rasa run --cors "*" --cors "*" 解决跨域问题
  • Chapter04> python -m http.server
  • 在浏览器里 打开 index.html

0 人点赞