对话机器人(五)——RASA:Config

定义了模型将用于根据用户输入进行预测的组件策略。recipe: 当前配置文件所用的格式,rasa仅支持default.v1格式。

recipe: default.v1
language: en

pipeline:
# 将由 Suggested Config 功能选择

policies:
- name: MemoizationPolicy
- name: TEDPolicy
  max_history: 5
  epochs: 10

1. pipline组件

组件构成NLU pipline并按顺序将用户输入处理成结构化输出。包含语言模型、分词器、特征提取、实体识别、意图分类、结构化输出。

组件具有以下特征:

  • 组件的顺序至关重要
  • 组件是可以替换的
  • 有些组件时互斥的
  • 有些组件可以同时使用

a. 语言模型

加载预训练的词向量模型。

(1) MitieNLP

MITIE 库需要一个语言模型文件,必须在配置中指定。

pipeline:
- name: "MitieNLP"
  # 加载语言模型
  model: "data/total_word_feature_extractor.dat"

可以使用mitie预训练自己的词向量。参考: 用 Rasa NLUpedia 制造自己的中文NLU 系统

(2) spaCyNLP

初始化 spaCy 结构。每个 spaCy 组件都依赖于此,需要放在pipline的开头。

pipeline:
- name: "SpacyNLP"
  # 加载语言模型
  model: "en_core_web_md"
  # 当检索单词向量时,这将决定单词的大小写是否相关。' False'则是忽略大小写。
  case_sensitive: False

参考: 安装 SpaCy

b. 分词器

组件 依赖 备注
JiebaTokenizer Jieba
MitieTokenizer Mitie 支持中文分词
spaCyTokenizer spaCy
  • 还可以自定义分词器
pipeline:
- name: "JiebaTokenizer"
  dictionary_path: "path/to/custom/dictionary/dir"
  # 检查是否拆分意图的标志
  "intent_tokenization_flag": False
  # 意图分割的符号
  "intent_split_symbol": "_"
  # 正则表达式检测token
  "token_pattern": None

c. 特征提取

组件 类型 特点
MitieFeaturizer 密集特征
SpacyFeaturizer 密集特征
ConveRTFeaturizer 密集特征 仅在英语会话语料库上进行训练
LanguageModelFeaturizer 密集特征
RegexFeaturizer 稀疏特征 会读取训练数据中的正则表达式配置
CountVectorsFeaturizer 稀疏特征 使用词袋模型
LexicalSyntacticFeaturizer 稀疏特征 提供词法和语法特征
(1) MitieFeaturizer
pipeline:
- name: "MitieFeaturizer"
  # 池化操作。'mean'和'max'
  "pooling": "mean"
(2) SpacyFeaturizer
pipeline:
- name: "SpacyFeaturizer"
  # 池化操作。'mean'和'max'
  "pooling": "mean"
(3) ConveRTFeaturizer
pipeline:
- name: "ConveRTFeaturizer"
# 模型文件的远程URL/本地目录(必填)
"model_url": None
(4) LanguageModelFeaturizer

需要指定加载的语言模型和权重。

pipeline:
  - name: LanguageModelFeaturizer
    model_name: "bert"
    model_weights: "rasa/LaBSE"
    # 目录路径
    cache_dir: null

LanguageModelFeaturizer参数:

Language Model “model_name” “model_weights”
BERT bert rasa/LaBSE
GPT gpt openai-gpt
GPT-2 gpt2 gpt2
XLNet xlnet xlnet-base-cased
DistilBERT distilbert distilbert-base-uncased
RoBERTa roberta roberta-base
(5) RegexFeaturizer
pipeline:
- name: "RegexFeaturizer"
  # 文本将默认区分大小写
  "case_sensitive": True
  # 为查找表使用匹配词边界
  "use_word_boundaries": True
(6) CountVectorsFeaturizer
pipeline:
- name: "CountVectorsFeaturizer"
  # 要使用的分析器,'word'、'char' 或 'char_wb'
  "analyzer": "word"
  # 设置 n-gram 的上下边界
  "min_ngram": 1
  "max_ngram": 1
  # 设置词汇表外标记
  "OOV_token": "_oov_"
  # 是否使用共享词汇
  "use_shared_vocab": False
(7) LexicalSyntacticFeaturizer

为实体提取创建特征。在用户消息中的每个令牌上移动一个滑动窗口,并根据配置创建功能。由于存在默认配置,因此无需指定配置。

pipeline:
- name: LexicalSyntacticFeaturizer
  "features": [
    ["low", "title", "upper"],
    ["BOS", "EOS", "low", "upper", "title", "digit"],
    ["low", "title", "upper"],
  ]

d. 实体识别

多数组件不可同时使用,少数组件可有条件地和其他组件同时使用

组件 备注
MitieEntityExtractor
SpacyEntityExtractor 只能用Spacy内置的实体提取模型,无法进行再训练。人名、地名、组织结构名等。
CRFEntityExtractor
DucklingEntityExtractor 只能用预定义的实体,不能再训练。邮箱、距离、时间等。
DIETClassifier
RegexEntityExtractor 读取训练数据中的查找表及正则表达式
EntitySynonymMapper 用于同义词改写,将提取到的实体标准化

实体识别的结果包含实体类型(entity)、实体对应开始(start)和结尾的位置(end)、实体置信度(confidence)、实体名(value)、提取器(extractor)。

{
    "entities": [{
        "value": "New York City",
        "start": 20,
        "end": 33,
        "confidence": null,
        "entity": "city",
        "extractor": "MitieEntityExtractor"
    }]
}

e. 意图分类

组件 依赖 备注
MitieIntentClassifier Mitie
LogisticRegressionClassifier
SklearnIntentClassifier Sklearn
KeywordIntentClassifier
DIETClassifier Tensorflow
FallbackClassifier 若其他组件预测的意图得分低,该组件将意图改为NLU fallback
{
    "intent": {"name": "greet", "confidence": 0.780},
    "intent_ranking": [
        {
            "confidence": 0.780,
            "name": "greet"
        },
        {
            "confidence": 0.140,
            "name": "goodbye"
        },
        {
            "confidence": 0.080,
            "name": "restaurant_search"
        }
    ]
}

置信度:(confidence)

f. 组合意图分类和实体提取

DIETClassifier:通过在transformer输出序列上与输入标记序列相对应的CRF标记层来预测实体标记序列。对于意图标签,transformer输出的完整话语和意图标签嵌入到单个语义向量空间。我们使用点积损失最大化与目标标签的相似性和最小化与负样本的相似性。

{
    "intent": {"name": "greet", "confidence": 0.8343},
    "intent_ranking": [
        {
            "confidence": 0.385910906220309,
            "name": "goodbye"
        },
        {
            "confidence": 0.28161531595656784,
            "name": "restaurant_search"
        }
    ],
    "entities": [{
        "end": 53,
        "entity": "time",
        "start": 48,
        "value": "2017-04-10T00:00:00.000+02:00",
        "confidence": 1.0,
        "extractor": "DIETClassifier"
    }]
}

g. 选择器 ResponseSelector

目的:FAQ(常见问题解答)/闲聊。

为每种问题定义一种分类,为每种分类定义想要返回给用户的答案。从一组候选回复中预测机器人回复。

(1) 如何定义用户问题

采用group/intent格式命名,group称为检索意图。

(2) 如何定义问题答案

意图名为intent的问题都需要有一个名为utter_intent的response作为答案。

  • response:对应检索意图下的预测响应键,预测的置信度和相关响应。
  • ranking:使用前 10 个候选响应键的置信度进行排名。
{
    "response_selector": {
      "faq": {
        "response": {
          "id": 1388783286124361986,
          "confidence": 0.7,
          "intent_response_key": "chitchat/ask_weather",
          "responses": [
            {
              "text": "It's sunny in Berlin today",
              "image": "https://i.imgur.com/nGF1K8f.jpg"
            },
            {
              "text": "I think it's about to rain."
            }
          ],
          "utter_action": "utter_chitchat/ask_weather"
         },
        "ranking": [
          {
            "id": 1388783286124361986,
            "confidence": 0.7,
            "intent_response_key": "chitchat/ask_weather"
          },
          {
            "id": 1388783286124361986,
            "confidence": 0.3,
            "intent_response_key": "chitchat/ask_name"
          }
        ]
      }
    }
}

2. 策略

策略:决定对话每个step要执行的动作。学习故事,从而预测动作。

通过特征提取组件将故事转换成对话状态,从而得到对话状态特征,按照对话特征预测下一个对话动作。

# config.yml
policies:
  - name: "MemoizationPolicy"
     max_history: 5
  - name: "FallbackPolicy"
     nlu_threshold: 0.4
     core_threshold: 0.3
     fallback_action_name: "my_fallback_action"
  - name: "path.to.your.policy.class"
     arg1: "..."

a. 内建的策略

策略名 描述
TEDPolicy(transformer embedding dialogue) 将当前会话映射成一个对话向量,找到和这个向量最近的已知动作的对话向量。
MemoizationPolicy 记住历史中出现的状态和对应的动作,即字典。
AugmentedMemoizationPolicy 比MemoizationPolicy多一个遗忘机制,随机遗忘当前对话历史中的部分步骤,试图在训练的故事集中寻找和当前历史匹配的故事。
RulePolicy 规则驱动。包含:MappingPolicy、FallbackPolicy、TowStageFallbackPolicy、FormPolicy
❃ TEDPolicy

一种用于下一步动作预测和实体识别的多任务架构。该架构由两个任务共享的几个transformer encoder组成。实体标签序列是通过CRF标记层预测的,该标记层位于对应于输入令牌序列的用户序列transformer encoder输出之上。对于下一个动作预测,对话transformer encoder输出和系统动作标签被嵌入到单个语义向量空间中。我们使用点积损失来最大化与目标标签的相似性并最小化与负样本的相似性。

TED 策略架构包括以下步骤

  1. 连接特征

    • 用户输入(用户意图和实体)或通过用户序列transformer encoder处理的用户文本,
    • 通过机器人序列transformer encoder处理的先前系统动作或机器人话语,
    • 插槽和动作表单

    对于每个时间步,进入对话transformer之前的嵌入层的输入向量。

  2. 将输入向量的嵌入馈送到对话transformer encoder中。

  3. 将密集层应用于对话transforme的输出,以获得每个时间步的对话嵌入。

  4. 应用密集层为每个时间步的系统操作创建嵌入。

  5. 计算对话嵌入和嵌入式系统动作之间的相似度。这一步是基于StarSpace的想法。

  6. 将用户序列transformer encoder的令牌级输出与每个时间步的对话transformer encoder的输出连接起来。

  7. 应用 CRF 算法来预测每个用户文本输入的上下文实体。

配置,参数

  • max_history:查看多少条历史对话来决定下一步动作。默认为None,则会话重启后所有的历史记录被考虑在内。

其他参数见官方文档。

# config.yml
policies:
- name: TEDPolicy
  epochs: 200

b. 策略优先级

每个策略独立预测下一个动作后,会使用得分最高的动作。在得分相同的情况下,策略的优先级数值越高,策略就越优先。

优先级 策略
6 RulePolicy
3 MemoizationPolicy和AugmentedMemoizationPolicy
1 TEDPolicy

3. endpoints

端点:定义rasa core和其他服务进行连接的配置信息。endpoints.yml

目前支持的端点:event broker、tracker store、lock store、action server、NLU 服务器、NLG服务器和model storage。

action_endpoint:
 url: "http://localhost:5055/webhook"

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

你可能感兴趣的:(对话机器人,人工智能,自然语言处理,nlp)