定义了模型将用于根据用户输入进行预测的组件和策略。recipe: 当前配置文件所用的格式,rasa仅支持default.v1格式。
recipe: default.v1
language: en
pipeline:
# 将由 Suggested Config 功能选择
policies:
- name: MemoizationPolicy
- name: TEDPolicy
max_history: 5
epochs: 10
组件构成NLU pipline并按顺序将用户输入处理成结构化输出。包含语言模型、分词器、特征提取、实体识别、意图分类、结构化输出。
组件具有以下特征:
加载预训练的词向量模型。
MITIE 库需要一个语言模型文件,必须在配置中指定。
pipeline:
- name: "MitieNLP"
# 加载语言模型
model: "data/total_word_feature_extractor.dat"
可以使用mitie预训练自己的词向量。参考: 用 Rasa NLUpedia 制造自己的中文NLU 系统
初始化 spaCy 结构。每个 spaCy 组件都依赖于此,需要放在pipline的开头。
pipeline:
- name: "SpacyNLP"
# 加载语言模型
model: "en_core_web_md"
# 当检索单词向量时,这将决定单词的大小写是否相关。' False'则是忽略大小写。
case_sensitive: False
参考: 安装 SpaCy
组件 | 依赖 | 备注 |
---|---|---|
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
组件 | 类型 | 特点 |
---|---|---|
MitieFeaturizer | 密集特征 | |
SpacyFeaturizer | 密集特征 | |
ConveRTFeaturizer | 密集特征 | 仅在英语会话语料库上进行训练 |
LanguageModelFeaturizer | 密集特征 | |
RegexFeaturizer | 稀疏特征 | 会读取训练数据中的正则表达式配置 |
CountVectorsFeaturizer | 稀疏特征 | 使用词袋模型 |
LexicalSyntacticFeaturizer | 稀疏特征 | 提供词法和语法特征 |
pipeline:
- name: "MitieFeaturizer"
# 池化操作。'mean'和'max'
"pooling": "mean"
pipeline:
- name: "SpacyFeaturizer"
# 池化操作。'mean'和'max'
"pooling": "mean"
pipeline:
- name: "ConveRTFeaturizer"
# 模型文件的远程URL/本地目录(必填)
"model_url": None
需要指定加载的语言模型和权重。
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 |
pipeline:
- name: "RegexFeaturizer"
# 文本将默认区分大小写
"case_sensitive": True
# 为查找表使用匹配词边界
"use_word_boundaries": True
pipeline:
- name: "CountVectorsFeaturizer"
# 要使用的分析器,'word'、'char' 或 'char_wb'
"analyzer": "word"
# 设置 n-gram 的上下边界
"min_ngram": 1
"max_ngram": 1
# 设置词汇表外标记
"OOV_token": "_oov_"
# 是否使用共享词汇
"use_shared_vocab": False
为实体提取创建特征。在用户消息中的每个令牌上移动一个滑动窗口,并根据配置创建功能。由于存在默认配置,因此无需指定配置。
pipeline:
- name: LexicalSyntacticFeaturizer
"features": [
["low", "title", "upper"],
["BOS", "EOS", "low", "upper", "title", "digit"],
["low", "title", "upper"],
]
多数组件不可同时使用,少数组件可有条件地和其他组件同时使用
组件 | 备注 |
---|---|
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"
}]
}
组件 | 依赖 | 备注 |
---|---|---|
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)
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"
}]
}
目的: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"
}
]
}
}
}
策略:决定对话每个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: "..."
策略名 | 描述 |
---|---|
TEDPolicy(transformer embedding dialogue) | 将当前会话映射成一个对话向量,找到和这个向量最近的已知动作的对话向量。 |
MemoizationPolicy | 记住历史中出现的状态和对应的动作,即字典。 |
AugmentedMemoizationPolicy | 比MemoizationPolicy多一个遗忘机制,随机遗忘当前对话历史中的部分步骤,试图在训练的故事集中寻找和当前历史匹配的故事。 |
RulePolicy | 规则驱动。包含:MappingPolicy、FallbackPolicy、TowStageFallbackPolicy、FormPolicy |
一种用于下一步动作预测和实体识别的多任务架构。该架构由两个任务共享的几个transformer encoder组成。实体标签序列是通过CRF标记层预测的,该标记层位于对应于输入令牌序列的用户序列transformer encoder输出之上。对于下一个动作预测,对话transformer encoder输出和系统动作标签被嵌入到单个语义向量空间中。我们使用点积损失来最大化与目标标签的相似性并最小化与负样本的相似性。
TED 策略架构包括以下步骤:
连接特征
对于每个时间步,进入对话transformer之前的嵌入层的输入向量。
将输入向量的嵌入馈送到对话transformer encoder中。
将密集层应用于对话transforme的输出,以获得每个时间步的对话嵌入。
应用密集层为每个时间步的系统操作创建嵌入。
计算对话嵌入和嵌入式系统动作之间的相似度。这一步是基于StarSpace的想法。
将用户序列transformer encoder的令牌级输出与每个时间步的对话transformer encoder的输出连接起来。
应用 CRF 算法来预测每个用户文本输入的上下文实体。
配置,参数:
其他参数见官方文档。
# config.yml
policies:
- name: TEDPolicy
epochs: 200
每个策略独立预测下一个动作后,会使用得分最高的动作。在得分相同的情况下,策略的优先级数值越高,策略就越优先。
优先级 | 策略 |
---|---|
6 | RulePolicy |
3 | MemoizationPolicy和AugmentedMemoizationPolicy |
1 | TEDPolicy |
端点:定义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