1. 测试 Rasa NLU 模型
运行 `rasa test nlu` 命令会测试你的 Rasa NLU 模型。这个命令主要做以下几件事情:
1.1 意图识别测试
检查模型在识别用户意图方面的性能。这包括每个意图的准确率、召回率和 F1 得分。
1.2 实体提取测试
检查模型在识别和提取预定义实体方面的性能。同样会计算准确率、召回率和 F1 得分。
1.3 交叉验证测试
如果没有提供专门的测试数据集,命令将执行交叉验证。交叉验证是一种统计方法,用于评估并比较学习算法的性能,通过将数据集分成训练和测试数据的多个组合来进行。
1.4 结果报告
在执行测试后,你会得到一个报告,通常是在一个新创建的 `results` 文件夹中。这个报告详细说明了模型的性能,并包括意图和实体的混淆矩阵、分类报告和错误预测的例子。
1.5 模型对比
如果你有多个模型或多个配置,并且你想比较它们的性能,这个命令可以帮助你通过在相同数据集上运行它们来评估它们的性能差异。
确保 `data/nlu.yml` 包含了你的 NLU 训练数据,并且 `config.yml` 包含了 NLU 模型的配置信息。这个测试对于理解你的 NLU 模型在实际使用中可能的性能表现至关重要,同时也是迭代改进模型的一个重要部分。
2. 如何使用 spaCy
使用 spaCy 作为 Rasa 的一部分涉及以下几个步骤:
2.1 安装 spaCy
首先,你需要安装 spaCy 以及相应语言模型。可以通过以下命令安装:
pip install spacy
python -m spacy download en_core_web_md
确保选择一个适合你的语言和需求的模型。`en_core_web_md` 是针对英语的中等大小模型,提供了词性标注、句法分析以及实体识别的能力。
2.2 配置 Rasa 使用 spaCy
在你的 Rasa 配置文件(通常是 `config.yml`)中,需要加入以下几行来使用 spaCy:
pipeline:
- name: SpacyNLP
model: "en_core_web_md"
- name: SpacyTokenizer
- name: SpacyFeaturizer
- name: SpacyEntityExtractor
- name: EntitySynonymMapper
- name: SklearnIntentClassifier
2.3 训练 Rasa 模型
配置好了 spaCy 后,你就可以像往常一样训练 Rasa 模型了。使用以下命令来进行训练:
rasa train
2.4 使用 spaCy 进行实体提取
在你的 NLU 训练数据中,你可以通过指定实体类型来标注实体,spaCy 实体提取器将能识别这些实体。比如:
nlu:
- intent: search_flight
examples: |
- I want to fly from [Berlin](location) to [San Francisco](location)
- Show me flights to [Paris](location)
2.5 注意事项
在你的 Rasa 项目中使用 spaCy 之前,确保你的 Rasa 版本和 spaCy 版本兼容。使用 spaCy 会影响你的 NLU 模型的性能,因为 spaCy 的模型通常比 Rasa 默认使用的 TensorFlow Embedding 更为复杂。如果使用的是其他语言,需要下载对应语言的 spaCy 模型并在配置文件中相应地更新。
3. 知识驱动技术
在 Rasa 中,你可以集成多种技术来增强聊天机器人的能力。以下是你提到的每种技术类型的一些 Rasa 组件或相关的实现方式:
3.1 本体论 (Ontology)
在 Rasa 中并没有内置直接支持本体论的组件。但是,你可以利用自定义 actions 来集成外部的本体论管理系统,比如使用 [OWL](https://www.w3.org/OWL/) (Web Ontology Language) 或其他本体论框架。
3.2 逻辑推理
同上,逻辑推理通常需要通过外部服务或自定义代码在 actions 中实现。
3.3 词网 (WordNet)
不是 Rasa 的直接组件。但是,你可以使用如 [NLTK](https://www.nltk.org/) 这样的自然语言处理库来访问词网,并在自定义 actions 中使用它。
3.4 同义词
在 NLU 管道中,可以通过查找表(lookup tables)或同义词(synonyms)功能来实现同义词识别。
4. 学习驱动技术
4.1 频率方法
Rasa 的意图分类器(如 `RegexIntentClassifier`)可以基于正则表达式匹配使用频率方法。
4.2 统计机器学习
`DIETClassifier` 是一个基于 Transformer 的模型,能同时进行意图识别和实体识别。`CRFEntityExtractor` 是基于条件随机场(CRF)的实体提取器。
4.3 深度学习
`ResponseSelector` 用于检索式响应选择。`TEDPolicy` 使用 Transformer 模型来预测对话中的下一步行为。
5. 语法驱动技术
5.1 句法分析
Rasa 没有内置句法分析工具,但你可以集成如 [spaCy](https://spacy.io/) 的 NLP 库来执行句法分析。
5.2 正则表达式
`RegexFeaturizer` 可以基于用户提供的正则表达式生成消息特征。`RegexEntityExtractor` 可以使用正则表达式来识别和提取消息中的实体。
5.3 词形归并
`SpacyNLP` 与 spaCy 集成,提供词形归并功能。
5.4 形态分析
同上,`SpacyNLP` 组件可以进行形态分析。
6. 经典的 Rasa NLU Pipeline 配置示例
以下是一些 Rasa NLU pipeline 的经典配置示例:
6.1 基于 spaCy 的 Pipeline
适用于需要利用 spaCy 的强大语言处理能力,特别是在句法分析方面。
language: "en"
pipeline:
- name: SpacyNLP
- name: SpacyTokenizer
- name: SpacyFeaturizer
- name: SpacyEntityExtractor
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
6.2 基于 TensorFlow 的 Pipeline
适用于需要深度学习和自定义实体提取的场景。
language: "en"
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: "char_wb"
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
epochs: 100
constrain_similarities: true
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
- name: FallbackClassifier
threshold: 0.3
ambiguity_threshold: 0.1
6.3 基于 BERT 的 Pipeline (使用 Rasa 2.0 及以上)
适用于想要使用 BERT 或类似预训练转换器模型进行意图识别和实体提取的场景。
language: "en"
pipeline:
- name: HFTransformersNLP
model_name: "bert"
model_weights: "rasa/LaBSE"
- name: LanguageModelTokenizer
- name: LanguageModelFeaturizer
- name: DIETClassifier
epochs: 200
constrain_similarities: true
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 200
6.4 基于规则的 Pipeline
适用于那些想要以规则为基础进行实体提取和意图分类的简单场景。
language: "en"
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: RegexEntityExtractor
- name: CRFEntityExtractor
- name: EntitySynonymMapper
- name: SklearnIntentClassifier
7. 默认 Pipeline
pipeline:
# No configuration for the NLU pipeline was provided. The following default pipeline was used to train your model.
# If you'd like to customize it, uncomment and adjust the pipeline.
# See https://rasa.com/docs/rasa/tuning-your-model for more information.
# 1. 符号化器
- name: WhitespaceTokenizer
# 2. 特征提取器
- name: RegexFeaturizer
- name
: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: char_wb
min_ngram: 1
max_ngram: 4
# 3. 意图分类器
- name: DIETClassifier
epochs: 100
constrain_similarities: true
# 4. 实体提取器
- name: EntitySynonymMapper
# 5. 响应选择器
- name: ResponseSelector
epochs: 100
constrain_similarities: true
# 6. 回退分类器
- name: FallbackClassifier
threshold: 0.3
ambiguity_threshold: 0.1