week3-RASA源码和定制化你的对话机器人

一、Setting up RASA Source Code

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
28
29
30
31
32
### Step-1、Python Environment Setup
Python环境配置、创建新的虚拟环境以及pip的安装方法,详见Week2笔记

### Step-2、Building from Source
### 这里介绍源码的安装方法

### Step-3、安装poetry
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
# 关于poetry,截至目前pypi并未托管potery的whl文件,如果上述指令执行缓慢,或者由于网络原因不能下载;
# 可下载poetry.py和poetry源码,执行以下命令行安装;
python get-poetry.py --file poetry-1.1.4-win32.tar.gz

### Step-4、下载rasa源码
git clone https://github.com/RasaHQ/rasa.git
cd rasa

### Step-5、安装
poetry install

### 总结下安装过程:
### poetry install对网络的要求很高,如果中途网络断开,再次执行poetry install会直接报错,这里尚不清楚为何重复执行后不会像pip那样重新请求网络资源安装,而是会直接出错。迫不得已,手动pip安装了poetry.lock文件要求的包版本,再执行poetry install至成功安装,非常耗时,前前后后折腾约2小时。


### STEP-6:特别地,若有需要安装RASA的附加依赖,如:
# Dependencies for spaCy
pip3 install rasa[spacy]
python3 -m spacy download en_core_web_md
python3 -m spacy link en_core_web_md en

# Dependencies for MITIE
pip3 install git+https://github.com/mit-nlp/MITIE.git
pip3 install rasa[mitie] # pip list可以查看到已安装好了mitie包

二、Optimize NLU

2.0 如何增强RASA NLU - Lifestyle

Create: 在训练之前初始化Component

Train:当前Component使用上下文和先前Component的输出进行训练

Persist:持久化,将训练好的component保存在磁盘

2.1、Improve NLU

2.1.0、RASA NLU 模块的作用

分词、训练词向量、提取特征、命名体识别、意图识别等,这些功能都是通过不同的components实现的,然后通过pipeline将这些components组装在一起,得到NLU过程输出的结果:用户的intent和entity。

2.1.1、Components组件

关于Component:

在RASA源码NLU模块中(./rasa-master/rasa/nlu),其代码结构:

其中,在components.py文件中定义了component类,每一个component都是pipeline中处理数据的一个单元,按照在pipeline中的顺序执行。在上图中包含classifiers\emulators\ extractors\featurizers\ selectors\tokenizers文件,每一个文件下面都是可选择的方法,每个方法都会继承component类,比如extractors有如下几种组件:

上图中crf_entity_extractor.py就是一个基于条件随机场提取实体的组件,RASA提供了很多种方法。当我们不满足RASA自带的这些组件时,那么就可以自定义一个组件,同样需要继承components.py中的component类。在component类中定义了一系列实例化组件的方法,主要的方法有训练 train() 、解析 process() 、持久化 persist() 、加载 load()。

假如我们想生成一个新的组件,可以按照以下例子书写:

Rasa自定义NLU组件

Enhancing Rasa NLU models with Custom Components

2.1.2 Pipeline Approach

【参考老师PPT课件P8-P13】补充

词向量、语言模型(Language Models)

  1. MitieNLP:MIT Information Extraction

    是MITIE initializer的简称,作用是初始化Mitie,每个mitie组件都依赖于此,因此应该将其放在任何使用mitie组件的每个管道的开头。如果用mitie的wordrep(作用类似word2vec)训练词向量需要很长时间,所以会事先下载好基于维基百科训练好的词向量文件,将路径赋给参数model。除此之外还有SpacyNLP和HFTransformersNLP。

  1. SpacyNLP

  2. HFTransformersNLP

分词器(Tokenizers)

  1. WhitespaceTokenizer:空格分词器

  2. JiebaTokenizer:结巴分词器

    用jieba进行中文的tokenize,将单词转化成id,同时需要传入自定义词典。除此之外还有MitieTokenizer、SpacyTokenizer等等。

  3. MitieTokenizer:MITIE分词器

  4. SpacyTokenizer:spaCy分词器

  5. ConveRTTokenizer:ConveRT分词器

  6. LanguageModelTokenizer

特征提取器(Featurizers)

  1. MitieFeaturizer:MITIE特征提取器。使用MITIE featurizer为意图分类创建特性。

  2. SpacyFeaturizer:spaCy特征提取器

  3. ConveRTFeaturizer:ConveRT特征提取器

  4. LanguageModelFeaturizer

  5. RegexFeaturizer:正则表达式特征提取器。为实体提取和意图分类创建特性。在训练期间,regex intent featurizer 以训练数据的格式创建一系列正则表达式列表。对于每个正则,都将设置一个特征,标记是否在输入中找到该表达式,然后将其输入到intent classifier / entity extractor 中以简化分类(假设分类器在训练阶段已经学习了该特征集合,该特征集合表示一定的意图)。将Regex特征用于实体提取目前仅CRFEntityExtractor组件支持。

  6. CountVectorsFeaturizer:词袋模型特征提取器,结合用户消息、意图和响应

  7. LexicalSyntacticFeaturizer:词法语法特征提取器

意图分类器(Intent Classifiers)

  1. MitieIntentClassifier: MITIE意图分类器。MitieIntentClassifier分类器里面已经自带Featurizer功能,所以不是必须配置的。简单来说,是基于稀疏线性核的一个多分类线性SVM。具体信息见:https://github.com/mit-nlp/MITIE

  2. SklearnIntentClassifier: Sklearn意图分类器。Sklearn意图分类器训练一个线性支持向量机,该支持向量机通过网格搜索得到优化。并且将每个类别的概率排名,不管是否有类别超过预设的概率阀值。SklearnIntentClassifier使用时候需要将SVM的超参数配置上。具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   # Specifies the list of regularization values to
# cross-validate over for C-SVM.
# This is used with the ``kernel`` hyperparameter in GridSearchCV.
C: [1, 2, 5, 10, 20, 100]
# Specifies the kernel to use with C-SVM.
# This is used with the ``C`` hyperparameter in GridSearchCV.
kernels: ["linear"]
# Gamma parameter of the C-SVM.
"gamma": [0.1]
# We try to find a good number of cross folds to use during
# intent training, this specifies the max number of folds.
"max_cross_validation_folds": 5
# Scoring function used for evaluating the hyper parameters.
# This can be a name or a function.
"scoring_function": "f1_weighted"
  1. EmbeddingIntentClassifier:嵌入意图分类器(即将被DIETClassifier替代)

  2. FallbackClassifier:当意图识别的得分比较低时,使用该分类器决定是否给出nlu_fallback意图。注意,这个FallbackClassifier总是跟在其他意图分类器之后,对前一个意图分类提给出的意图及置信度进行判定。如果前一个意图分类器给出的意图预测置信度低于threshold,或者两个排名最高的意图的置信度得分接近时,FallbackClassifier实施回退操作。回退意图的应答,可以通过规则来实现。

    1
    2
    3
    4
    5
    rules:
    - rule: Ask the user to rephrase in case of low NLU confidence
    steps:
    - intent: nlu_fallback
    - action: utter_please_rephrase

    FallbackClassifier的配置参数有:

    threshold:此参数设置预测nlu_fallback意图的阈值。如果前一个意图分类器预测的意图置信度小于threshold,则FallbackClassifier将返回一个置信度为1.0的nlu_fallback意图。

    ambiguity_threshold:如果两个排名最高的意图的置信度得分之差小于ambiguity_threshold,FallbackClassifier将返回一个置信度为1.0的nlu_fallback意图。

  3. KeywordIntentClassifier:关键词意图分类器,适合小项目。

    简单的关键字匹配意图分类,适用于小型项目,意图比较少的情况。当意图很多,相关性又很大的时候,关键词分类器无法区分。关键字的匹配方式是,训练数据的整句话都作为关键字,去搜索用户说的话。因此写配置数据的时候,仔细设计那个训练数据很重要,关键字不能太长,这容易匹配不上意图,也不能太短,缺少意图的区分度。

  4. DIETClassifier(Dual intent and Entity Transformer):意图分类和实体提取的双向转换器(支持中文)

    DIET模型解决了对话理解问题中的2个问题,意图分类和实体识别。

    DIET使用的是纯监督的方式,没有任何预训练的情况下,无须大规模预训练是关键,性能好于fine-tuning Bert, 但是训练速度是bert的6倍。输入是用户消息和可选意图的稠密或者稀疏向量。输出是实体,意图和评分。

    DIET体系结构基于两个任务共享的Transformer。实体标签序列通过Transformer后,输出序列进入顶层条件随机场(CRF)标记层预测,输出每个Token成为BIOE的概率。完整话语和意图标签经过Transformer输出到单个语义向量空间中。利用点积损失最大化与目标标签的相似度,最小化与负样本的相似度。

    具体DIET的算法参考:DIET: Dual Intent and Entity Transformer-RASA论文翻译

    1
    2
    3
    # 如果只想将DIETClassifier用于意图分类,请将entity_recognition设置为False。
    # 如果只想进行实体识别,请将intent_classification设置为False。
    # 默认情况下,DIETClassifier同时执行这两项操作,即实体识别和意图分类都设置为True。

    可以定义多个超参数来调整模型。如果要调整模型,请首先修改以下参数:

    epochs:此参数设置算法将看到训练数据的次数(默认值:300)。一个epoch等于所有训练实例的一个向前传播和一个向后传播。有时模型需要更多的epoch来正确学习。epoch数越少,模型的训练速度就越快。

    hidden_layers_sizes:此参数允许您为用户消息和意图定义前馈层的数量及其输出维度(默认值:文本:[],标签:[])。列表中的每个条目都对应一个前馈层。例如,如果设置text:[256,128],我们将在转换器前面添加两个前馈层。输入token的向量(来自用户消息)将被传递到这些层。第一层的输出维度为256,第二层的输出维度为128。如果使用空列表(默认行为),则不会添加前馈层。确保只使用正整数值。通常使用二次幂的数字,第二个值小于或等于前一个值。

    embedding_dimension:该参数定义模型内部使用的嵌入层的输出维度(默认值:20)。我们在模型架构中使用了多个嵌入层。例如,在比较和计算损失之前,将完整的话语和意图的向量传递到嵌入层。

    number_of_transformer_layers:此参数设置要使用的transformer层数(默认值:2)。transformer层的数量对应于要用于模型的transformer块。

    transformer_size:此参数设置transformer中的单位数(默认值:256)。来自transformer的矢量将具有给定的transformer_size。

    weight_sparsity:该参数定义模型中所有前馈层的内核权重的分数(默认值:0.8)。该值应介于0和1之间。如果将weight_sparsity设置为0,则不会将内核权重设置为0,该层将充当标准的前馈层。您不应该将weight_sparsity设置为1,因为这将导致所有内核权重为0,即模型无法学习。

    一般来说,调整这些参数就可以获得比较好的模型。另外还有其他可以调整的参数,具体见下表。

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    +---------------------------------+------------------+--------------------------------------------------------------+
    | Parameter | Default Value | Description |
    +=================================+==================+==============================================================+
    | hidden_layers_sizes | text: [] | Hidden layer sizes for layers before the embedding layers |
    | | label: [] | for user messages and labels. The number of hidden layers is |
    | | | equal to the length of the corresponding list. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | share_hidden_layers | False | Whether to share the hidden layer weights between user |
    | | | messages and labels. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | transformer_size | 256 | Number of units in transformer. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | number_of_transformer_layers | 2 | Number of transformer layers. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | number_of_attention_heads | 4 | Number of attention heads in transformer. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_key_relative_attention | False | If 'True' use key relative embeddings in attention. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_value_relative_attention | False | If 'True' use value relative embeddings in attention. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | max_relative_position | None | Maximum position for relative embeddings. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | unidirectional_encoder | False | Use a unidirectional or bidirectional encoder. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | batch_size | [64, 256] | Initial and final value for batch sizes. |
    | | | Batch size will be linearly increased for each epoch. |
    | | | If constant `batch_size` is required, pass an int, e.g. `8`. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | batch_strategy | "balanced" | Strategy used when creating batches. |
    | | | Can be either 'sequence' or 'balanced'. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | epochs | 300 | Number of epochs to train. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | random_seed | None | Set random seed to any 'int' to get reproducible results. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | learning_rate | 0.001 | Initial learning rate for the optimizer. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | embedding_dimension | 20 | Dimension size of embedding vectors. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | dense_dimension | text: 128 | Dense dimension for sparse features to use. |
    | | label: 20 | |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | concat_dimension | text: 128 | Concat dimension for sequence and sentence features. |
    | | label: 20 | |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | number_of_negative_examples | 20 | The number of incorrect labels. The algorithm will minimize |
    | | | their similarity to the user input during training. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | similarity_type | "auto" | Type of similarity measure to use, either 'auto' or 'cosine' |
    | | | or 'inner'. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | loss_type | "softmax" | The type of the loss function, either 'softmax' or 'margin'. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | ranking_length | 10 | Number of top actions to normalize scores for loss type |
    | | | 'softmax'. Set to 0 to turn off normalization. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | maximum_positive_similarity | 0.8 | Indicates how similar the algorithm should try to make |
    | | | embedding vectors for correct labels. |
    | | | Should be 0.0 < ... < 1.0 for 'cosine' similarity type. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | maximum_negative_similarity | -0.4 | Maximum negative similarity for incorrect labels. |
    | | | Should be -1.0 < ... < 1.0 for 'cosine' similarity type. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_maximum_negative_similarity | True | If 'True' the algorithm only minimizes maximum similarity |
    | | | over incorrect intent labels, used only if 'loss_type' is |
    | | | set to 'margin'. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | scale_loss | False | Scale loss inverse proportionally to confidence of correct |
    | | | prediction. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | regularization_constant | 0.002 | The scale of regularization. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | negative_margin_scale | 0.8 | The scale of how important it is to minimize the maximum |
    | | | similarity between embeddings of different labels. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | weight_sparsity | 0.8 | Sparsity of the weights in dense layers. |
    | | | Value should be between 0 and 1. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | drop_rate | 0.2 | Dropout rate for encoder. Value should be between 0 and 1. |
    | | | The higher the value the higher the regularization effect. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | drop_rate_attention | 0.0 | Dropout rate for attention. Value should be between 0 and 1. |
    | | | The higher the value the higher the regularization effect. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_sparse_input_dropout | True | If 'True' apply dropout to sparse input tensors. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_dense_input_dropout | True | If 'True' apply dropout to dense input tensors. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | evaluate_every_number_of_epochs | 20 | How often to calculate validation accuracy. |
    | | | Set to '-1' to evaluate just once at the end of training. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | evaluate_on_number_of_examples | 0 | How many examples to use for hold out validation set. |
    | | | Large values may hurt performance, e.g. model accuracy. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | intent_classification | True | If 'True' intent classification is trained and intents are |
    | | | predicted. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | entity_recognition | True | If 'True' entity recognition is trained and entities are |
    | | | extracted. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | use_masked_language_model | False | If 'True' random tokens of the input message will be masked |
    | | | and the model has to predict those tokens. It acts like a |
    | | | regularizer and should help to learn a better contextual |
    | | | representation of the input. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | tensorboard_log_directory | None | If you want to use tensorboard to visualize training |
    | | | metrics, set this option to a valid output directory. You |
    | | | can view the training metrics after training in tensorboard |
    | | | via 'tensorboard --logdir <path-to-given-directory>'. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | tensorboard_log_level | "epoch" | Define when training metrics for tensorboard should be |
    | | | logged. Either after every epoch ('epoch') or for every |
    | | | training step ('minibatch'). |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | featurizers | [] | List of featurizer names (alias names). Only features |
    | | | coming from the listed names are used. If list is empty |
    | | | all available features are used. |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | checkpoint_model | False | Save the best performing model during training. Models are |
    | | | stored to the location specified by `--out`. Only the one |
    | | | best model will be saved. |
    | | | Requires `evaluate_on_number_of_examples > 0` and |
    | | | `evaluate_every_number_of_epochs > 0` |
    +---------------------------------+------------------+--------------------------------------------------------------+
    | split_entities_by_comma | True | Splits a list of extracted entities by comma to treat each |
    | | | one of them as a single entity. Can either be `True`/`False` |
    | | | globally, or set per entity type, such as: |
    | | | ``` |
    | | | ... |
    | | | - name: DIETClassifier |
    | | | split_entities_by_comma: |
    | | | address: True |
    | | | ... |
    | | | ... |
    | | | ``` |
    +---------------------------------+------------------+------------------------------------

实体提取器(Entity Extractors)

  1. MitieEntityExtractor: MITIE实体提取器

    Mitie是一个训练词向量和提取实体的工具库,使用分布式单词嵌入和结构支持向量机。

    具体信息见:https://github.com/mit-nlp/MITIE

    1. SpacyEntityExtractor: spaCy实体提取器
  2. EntitySynonymMapper:同义词匹配实体提取器。

    作用是将同义词映射到同一个值。比如将United States of America 和USA都映射到usa。

    1. CRFEntityExtractor:条件随机场实体提取器
  3. DucklingHTTPExtractor:常见实体提取器

  4. DIETClassifier:意图分类和实体提取的双向转换器

选择器(Selectors)

  1. ResponseSelector:响应选择器

合并的实体提取器和意图分类器(Combined Intent Classifiers and Entity Extractors)

  1. DIETClassifier:意图分类和实体提取的双向转换器
2.1.3 Intent Recognition

缺少训练数据

OOV,在测试集中找不到对应词

Similar Intents 近似意图合并

Skewed data 避免数据倾斜

2.1.3 Custom Components

创建自定义的类

参考:

https://rasa.com/docs/rasa/components#custom-components

https://blog.rasa.com/enhancing-rasa-nlu-with-custom-components/

2.2 Expand your NLU Data

  1. Share your Bot to More people
  2. NLU Data Augmentation 数据增强
  3. Reinforce Learning 强化学习

三、Optimize Policy

3.1 About Policy

policy的作用:

决定在对话的每个步骤中应该采取的操作,可以使用的策略包括但不限于机器学习和基于规则的策略。

可以在项目的config.yml中指定一个或者多个策略。

配置中定义的每个策略都会以一定的置信度(取最高)预测下一个动作。

默认情况下,在每条用户消息之后,最多可以预测10个下一个动作,可以环境变量MAX_NUMBER_OF_PREDICTIONS设置为所需的最大预测数。

3.2 About Policy Priority

关于策略优先级:

Rasa具有默认优先级,这些默认优先级被设置为确保平局时的预期结果,数字越高优先级越高,如下:

1
2
3
6 - RulePolicy
3 - MemoizationPolicy or AugmentedMemoizationPolicy
1 - TEDPolicy

一般地,在配置中的每个优先级不建议使用多个策略。

如果有2个策略具有相同的优先级,并且它们以相同的置信度进行预测,则将随机选择结果操作。

3.3 Policies

有哪些对话策略

一、机器学习策略:

1、TED(Transformer Embedding Dialogue) Policy

用于下一动作预测和实体识别的多任务架构策略(具体实施细节待进一步理解)。

2、Memoization Policy

记忆策略只记录训练数据中的对话

若训练数据存在这样的对话,则以置信度1.0预测下一个动作,否则以0.0预测

一般不单独使用

3、Augmented Memoization Policy

AugmentedMemoizationPolicy可以记住训练story中的示例,直到max_history。

具有遗忘机制,可以遗忘对话历史记录中的某些步骤,并尝试在历史减少的story中找到匹配项

二、Rule-based Policies

1、Rule Policy

一种处理遵循固定行为(例如,业务逻辑)的对话部分的策略。它根据您的训练数据中的任何规则进行预测。

三、Custom Policies

编写自定义测策略:

1
2
3
4
5
6
7
8
# In the example below, the last two lines show how to use a custom policy class and pass arguments to it.
policies:
- name: "TEDPolicy"
max_history: 5
epochs: 200
- name: "RulePolicy"
- name: "path.to.your.policy.class"
arg1: "..."

*四、其他已弃用的策略*

1、 Mapping Policy

映射策略将意图映射为操作

无视之前对话,一旦触发意图就操作

映射是传递intent属性给triggers实现的,修改domain.yml

1
2
3
4
intents:
- ask_is_bot:
triggers: action_is_bot
123

一般不单独使用。

2、 Form Policy

表单策略,收集指定信息,如性别年龄地址

需要实现FormAction,在domain.yml中指定,在stories.md中使用

1
2
forms:
- facility_form

3、Fallback Policy

回退策略,聊天机器人不可避免需要的回退情况,例如用户问了让机器人理解不了的东西时需要回退

需要提供阈值

1
2
3
4
5
6
7
policies:
- name: FallbackPolicy
nlu_threshold: 0.3
ambiguity_threshold: 0.1
core_threshold: 0.3
fallback_action_name: 'action_default_fallback'
123456

4、Two-Stage Fallback Policy

不直接回退而是让用户选,尝试消除用户输入的歧义,从而在多个阶段处理NLU可信度较低的问题。

3.4 Configuring Policies

配置对话策略

Max History:是RASA中一个重要的超参数,用于控制模型查看多少对话历史记录,以决定下一步应采取的行动。

在config.yml文件中,Max History的默认值为“无”,这表示自会话重新启动以来的完整对话历史记录已记入该帐户。

RulePolicy没有max history参数,它始终考虑所提供规则的完整长度。

例子:

假设有一个out_of_scope意图,该意图描述了主题外的用户消息。如果机器人连续多次看到此意图,则可能要告诉用户可以提供哪些帮助。

因此您的story可能如下所示:

1
2
3
4
5
6
7
8
9
stories:
- story: utter help after 2 fallbacks
steps:
- intent: out_of_scope
- action: utter_default
- intent: out_of_scope
- action: utter_default
- intent: out_of_scope
- action: utter_help_message

为了让模型学习此模式,max_history必须至少为4(不应是3吗?)

如果增加max_history,则模型将变大,并且训练将花费更长的时间。

如果有一些将来可能会影响对话的信息,则应将其存储为一个槽位,槽信息始终可用于每个功能块。

3.5 Data Augmentation

训练模型时,Rasa Open Source将通过随机组合story文件中的story来创建更长的story,例子如下:

1
2
3
4
5
6
7
8
9
stories:
- story: thank
steps:
- intent: thankyou
- action: utter_youarewelcome
- story: say goodbye
steps:
- intent: goodbye
- action: utter_goodbye

实际上想让policy在无关的对话历史记录时忽略它,并且无论以前发生了什么,都要以相同的动作做出响应。

可以使用—augmentation标志更改此行为,该标志使您可以设置expandation_factor。 growth_factor确定在训练期间对多少个增强story进行了二次采样。扩增后的story在训练之前进行了二次抽样,因为它们的数量很快就会变得非常大,并且您希望对其进行限制。样本story的数量是增强因子x10。默认情况下,扩充设置为20,最多可生成200个扩充story。

—augmentation 0禁用所有扩充行为。基于备忘的策略不受扩充的影响(与扩充因素无关),并且将自动忽略所有扩充的story。

3.6 Featurizers

3.6.1 State Featurizers
3.6.2 Tracker Featurizers

四、Action Server

4.1 ACTION

Action类是任何自定义操作的基类。要定义自定义的action,请创建Action类的子类并覆盖两个必需的方法,即name和run。

样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# See this guide on how to implement these action:
# https://rasa.com/docs/rasa/custom-actions


# This is a simple example for a custom action which utters "Hello World!"

# from typing import Any, Text, Dict, List
#
# from rasa_sdk import Action, Tracker
# from rasa_sdk.executor import CollectingDispatcher
#
#
# class ActionHelloWorld(Action):
#
# def name(self) -> Text:
# return "action_hello_world"
#
# def run(self, dispatcher: CollectingDispatcher,
# tracker: Tracker,
# domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
#
# dispatcher.utter_message(text="Hello World!")
#
# return []

上述def name(self) -> Text:函数参数注解,用于提示该函数的输入参数和返回值的类型,方便阅读。

python解释器不会对这些注解添加任何的语义。它们不会被类型检查,运行时跟没有加注解之前的效果也没有任何差距

当action server收到运行动作的请求时,它将根据其name方法的返回值调用的action。

4.2 Events

Rasa中的会话表示为一系列事件。自定义动作可以通过在对动作服务器请求的响应中返回事件来影响对话的过程。

并非所有事件通常都是由自定义操作返回的,因为Rasa会自动跟踪它们(例如,用户消息)。如果其他事件是由自定义操作返回的,则只能对其进行跟踪。

4.3 Knowledge Base Actions

ActionQueryKnowledgeBase

五、More Concepts

5.1 Tracker Store

对话存储在跟踪存储中, Rasa Open Source提供了针对不同存储类型的开箱即用的实现,或者可以创建自己的自定义存储类型。

  • InMemoryTrackerStore (default):默认跟踪器存储。如果未配置其他跟踪器存储,则使用它。它将对话历史记录存储在内存中。

  • SQLTrackerStore:用SQLTrackerStore将助手的对话历史记录存储在SQL数据库中-

  • RedisTrackerStore:使用RedisTrackerStore将助手的对话历史记录存储在Redis中。 Redis是一种快速的内存中键值存储,可以选择持久存储数据。

  • MongoTrackerStore:使用MongoTrackerStore将助手的对话历史记录存储在MongoDB中。 MongoDB是一个免费且开源的跨平台面向文档的NoSQL数据库

  • DynamoTrackerStore:使用DynamoTrackerStore将助手的对话历史记录存储在DynamoDB中。 DynamoDB是Amazon Web Services(AWS)提供的托管NoSQL数据库。

  • Custom Tracker Store:如果需要开箱即用的跟踪器存储,则可以实施自己的跟踪器存储。这是通过扩展基类TrackerStore来完成的。

5.2 Event Broker 事件代理

使用事件代理,可以将正在运行的助手连接到其他服务,这些服务处理来自对话的数据。例如,您可以将实时助手连接到Rasa X,以查看和注释对话或将消息转发到外部分析服务。事件代理将消息发布到消息流服务(也称为消息代理),以将Rasa事件从Rasa服务器转发到其他服务。

5.3 Model Storage

模型可以存储在不同的位置,有三种不同的方式加载训练好的模型:

1、从本地磁盘加载模型(请参阅从磁盘加载模型)

2、从自己的HTTP服务器获取模型(请参阅从服务器加载模型)

3、从像S3这样的云存储中获取模型(请参阅从云中加载模型)

5.4 Lock Store

Rasa使用票证锁定机制来确保以正确的顺序处理给定对话ID的传入消息,并在主动处理消息时锁定对话。这意味着多个Rasa服务器可以作为复制服务并行运行,并且在发送给定对话ID的消息时,客户端不一定需要寻址同一节点。

  • InMemoryLockStore是默认的锁存储。它在单个进程中维护会话锁定。
  • RedisLockStore使用Redis作为持久层来维护会话锁定。建议使用此锁存储来运行一组复制的Rasa服务器。

5.4 Importer

Rasa Open Source具有内置的逻辑来收集和加载以Rasa格式编写的训练数据,但是您也可以使用自定义训练数据导入器自定义如何导入训练数据。

  • RasaFileImporter

    默认情况下,Rasa使用导入程序RasaFileImporter。如果要单独使用它,则无需在配置文件中指定任何内容。如果要与其他导入程序一起使用,请将其添加到配置文件中

  • MultiProjectImporter

    使用此导入器,可以通过组合多个可重复使用的Rasa项目来训练模型。例如,可能用一个项目处理闲聊,而用另一个项目问候您的用户

  • Writing a Custom Importer

    如果要编写自定义导入器,则需要实现TrainingDataImporter的接口。

5.4 Dispatcher

调度程序是CollectingDispatcher类的实例,用于生成响应以发送回用户。

CollectingDispatcher具有一种方法utter_message和一种属性(消息)。

在action的run方法中使用它来添加对返回到Rasa服务器的有效负载的响应。

Rasa服务器将依次为每个响应将BotUttered事件添加到跟踪器。因此,使用分派器添加的响应不应作为事件显式返回。

六、Deployment

6.1 推荐的部署方法

  • 快速安装一个服务:

服务器快速安装脚本是部署Rasa X和您的助手的最简单方法。它会使用合理的默认值在您的机器上安装Kubernetes集群,使您可以通过一条命令启动并运行。

1
curl -s get-rasa-x.rasa.com | sudo bash
  • Helm Chart

对于将吸引大量用户流量的助手,通过我们的Helm图表设置Kubernetes或Openshift部署是最佳选择。Helm提供了可伸缩的体系结构,该体系结构也易于部署。

6.2 其他可选方法

  • Docker Compose

6.3 部署Action Server

其他补充:

2.0.1、Training Data Format

2.1.1 [training data]

Including NLU data, stories and rules.

You can split the training data over any number of YAML files, and each file can contain any combination of NLU data, stories, and rules.

你可以将训练数据划分为任意数量的YAML文件,并且每个文件可以包含NLU数据,stories和Rules的任意组合。训练数据的类型由数据最外层的key决定。

a short example which keeps all training data in a single file:

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
>version: "2.0"

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
2.1.2 [Domain]

结论:Domain文件定义了意图,实体,位置,响应,形式和动作。

The domain defines the universe(宇宙,全局,世界) in which your assistant operates. It specifies(指定,列举) the intents, entities, slots, responses, forms, and actions your bot should know about. It also defines a configuration for conversation sessions.

The domain uses the same YAML format as the training data and can also be split across multiple files or combined in one file. The domain includes the definitions for responses and forms.

a full example of a domain, taken from the concertbot example:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
>version: "2.0"

>intents:
- affirm
- deny
- greet
- thankyou
- goodbye
- search_concerts
- search_venues
- compare_reviews
- bot_challenge
- nlu_fallback
- how_to_get_started

entities:
- name

slots:
concerts:
type: list
influence_conversation: false
venues:
type: list
influence_conversation: false
likes_music:
type: bool
influence_conversation: true

responses:
utter_greet:
- text: "Hey there!"
utter_goodbye:
- text: "Goodbye :("
utter_default:
- text: "Sorry, I didn't get that, can you rephrase?"
utter_youarewelcome:
- text: "You're very welcome."
utter_iamabot:
- text: "I am a bot, powered by Rasa."
utter_get_started:
- text: "I can help you find concerts and venues. Do you like music?"
utter_awesome:
- text: "Awesome! You can ask me things like \"Find me some concerts\" or \"What's a good venue\""

actions:
- action_search_concerts
- action_search_venues
- action_show_concert_reviews
- action_show_venue_reviews
- action_set_music_preference

session_config:
session_expiration_time: 60 # value in minutes
carry_over_slots_to_new_session: true

Tokenizer:分词器;编译器

Token:
【计算机科学技术】单点登陆,记号,权杖,

【电子、通信与自动控制技术】令牌,权标 ,许可证

【经济学】代价券,礼券

【化学】表征

【能源科学技术】表征

【历史学】私铸货币

Tokenization:

标记化

WhitespaceTokenizer:

Tokenizer using whitespace as a separator

NER:Name Entity Recognition

Reference:

1、Rasa教程系列-NLU-1-训练集格式

2、Rasa教程系列-NLU-2- 选择pipeline

3、Rasa教程系列-NLU-3-实体抽取

4、Rasa教程系列-NLU-4-组件

Rasa教程系列-0-Rasa安装和项目创建

Rasa教程系列-1-命令行交互

Rasa教程系列-Core-1-Stories

Rasa教程系列-Core-2-Domains

Rasa教程系列-Core-3-Responses

Rasa教程系列-Core-4-Actions

Rasa教程系列-Core-5-Policies

Rasa教程系列-Core-6-Slots

rasa文章导引

------ 本文结束------
Donate comment here.

欢迎关注我的其它发布渠道