Transformer课程 业务对话机器人Rasa 3.x Tuning Your NLU Model
Connecting to Messaging and Voice Channels
Rasa开源提供了许多内置连接器,用于连接到常用的消息和语音通道。您还可以使用预先配置的REST频道连接到您的网站或应用程序,或构建自己的自定义连接器
Connecting to A Channel
了解如何让您的助手在以下通道运行
- Your Own Website
- Facebook Messenger
- Slack
- Telegram
- Twilio
- Microsoft Bot Framework
- Cisco Webex Teams
- RocketChat
- Mattermost
- Google Hangouts Chat
- Custom Connectors
Testing Channels on Your Local Machine
如果您在localhost上运行Rasa X本地模式或Rasa开源服务器,大多数外部通道将无法找到您的服务器URL,因为localhost不向internet开放。
要在internet上公开本地计算机上的端口,可以使用ngrok。
安装ngrok后,运行
ngrok http 5005; rasa run
当您按照说明在频道上提供助手时,请使用ngrok URL。具体地说,如果说明中说要使用https://:/webhooks//webhook,请使用<ngrok_url>/webhooks//webhook,用ngrok终端窗口中显示的随机生成的url替换<ngrok_url>。例如,如果将你的机器人连接到Slack,你的URL应该类似于https://26e7e7744191.ngrok.io/webhooks/slack/webhook.
有了ngrok的免费层,您可以在每分钟的连接数量上遇到限制。在撰写本文时,它被设置为40个连接/分钟。
或者,您可以使用-i命令行选项让助手监听特定地址:
rasa run -p 5005 -i 192.168.69.150
这在面向internet的计算机使用VPN接口连接到后端服务器时特别有用。
https://rasa.com/docs/rasa/messaging-and-voice-channels
Tuning Your NLU Model
Rasa开源将在项目初始化时为您提供建议的NLU配置,但随着项目的增长,您可能需要调整配置以适应训练 数据。
How to Choose a Pipeline
在Rasa开源中,传入消息由一系列组件处理。这些组件在配置config.yml中定义的所谓处理管道中一个接一个地执行 。选择NLU管道允许您自定义模型并在数据集上对其进行微调。
要开始,您可以让建议的配置功能为您选择一个默认管道。 需在配置config.yml文件中提供bot的语言 ,并将管道密钥保留为out或空。
Sensible Starting Pipelines
如果你是从零开始的,那么从预先训练好的单词嵌入开始通常是有帮助的。预先训练的单词嵌入是有帮助的,因为它们已经编码了某种语言知识。例如,如果你的训练数据中有一句话像“我想买苹果”,而Rasa被要求预测“买梨”的意图,那么你的模型已经知道“苹果”和“梨”这两个词非常相似。如果您没有足够的训练数据,这一点尤其有用。
如果您刚开始使用spaCy ,我们建议您使用以下管道:
language: "fr" # your two-letter language code
pipeline:
- name: SpacyNLP
- name: SpacyTokenizer
- name: SpacyFeaturizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: "char_wb"
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
它使用SpacyFeatureizer,它提供预先训练过的单词嵌入(请参见语言模型)。
如果您没有在管道中使用任何预先训练好的单词嵌入,那么您就不会绑定到特定的语言,并且可以训练您的模型使其更特定于领域。
如果您的语言没有单词嵌入,或者您有非常特定于领域的术语,我们建议使用以下管道:
language: "fr" # your two-letter language code
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: "char_wb"
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
此管道使用CountVectorsFeaturer仅对您提供的训练数据进行训练。这个管道可以处理任何用空格分隔单词的语言。如果您的语言不是这样,请查看WhitespaceTokenizer的替代方案。
如果要在管道中使用自定义组件,请参阅自定义NLU组件。
Component Lifecycle#
每个组件处理一个输入和/或创建一个输出。组件的顺序由它们在配置config.yml中列出的顺序决定 ;组件的输出可以由管道中它后面的任何其他组件使用。某些组件只生成管道中其他组件使用的信息。其他组件生成在处理完成后返回的输出属性。
例如,对于“我正在寻找中国食物”这句话,输出为:
{
"text": "I am looking for Chinese food",
"entities": [
{
"start": 8,
"end": 15,
"value": "chinese",
"entity": "cuisine",
"extractor": "DIETClassifier",
"confidence": 0.864
}
],
"intent": {"confidence": 0.6485910906220309, "name": "restaurant_search"},
"intent_ranking": [
{"confidence": 0.6485910906220309, "name": "restaurant_search"},
{"confidence": 0.1416153159565678, "name": "affirm"}
]
}
这是以下管道中不同组件结果的组合:
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: "char_wb"
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
- name: EntitySynonymMapper
- name: ResponseSelector
例如,此处的entities属性是由DIETClassifier组件创建的。
每个组件都可以从组件基类实现多个方法;在管道中,将按特定顺序调用这些不同的方法。假设我们在配置config.yml中添加了以下管道
pipeline:
- name: "Component A"
- name: "Component B"
- name: "Last Component"
下图显示了此管道训练期间的调用顺序:
组件生命周期
在使用create函数创建第一个组件之前,将创建一个所谓的上下文context (它只不过是一个python字典)。此上下文用于在组件之间传递信息。例如,一个组件可以计算训练数据的特征向量,将其存储在上下文中,另一个组件可以从上下文中检索这些特征向量并进行意图分类。
最初,上下文由所有配置值填充。图中的箭头显示调用顺序并可视化传递上下文的路径。在对所有组件进行训练和持久化之后,最终的上下文字典将用于持久化模型的元数据。
Doing Multi-Intent Classification
进行多意图分类
您可以使用多意图分类来预测多个意图(例如,检查余额+转账),或建模分层意图结构(例如,反馈+积极feedback+positive 与 反馈+消极 feedback+negative 更相似 ,而不是闲聊)。
要进行多意图分类,您需要在管道中使用DIETClassifier。您还需要在正在使用的标记器中定义这些标志:
intent_tokenization_flag:将其设置为True,以便将意图标签标记化。
intent_split_symbol:将其设置为分隔意图标签的分隔符字符串。在本例中为+,默认为_。
下面是一个配置示例:
language: "en"
pipeline:
- name: "WhitespaceTokenizer"
intent_tokenization_flag: True
intent_split_symbol: "+"
- name: "CountVectorsFeaturizer"
- name: "DIETClassifier"
When to Use Multi-Intents
假设你有一个金融服务机器人,你有意图检查余额和转账的例子:
nlu:
- intent: check_balances
examples: |
- How much money do I have?
- what's my account balance?
- intent: transfer_money
examples: |
- I want to transfer money to my savings account
- transfer money
但是,您的bot会接收这样的传入消息,它们结合了两种意图:
如果您看到了足够多的这些示例,您可以创建一个新的意图:多意图支票+转账,并将传入的示例添加到其中,例如:
nlu:
- intent: check_balances+transfer_money
examples: |
- How much money do I have? I want to transfer some to savings.
- What's the balance on my account? I need to transfer some so I want to know how much I have
该模型不会预测训练数据中未明确给出示例的任何意图组合。考虑到每一个可能的意图组合都会导致意图数量的组合爆炸,因此您应该只添加那些您看到来自真实用户的足够示例的意图组合。
How to Use Multi-Intents for Dialogue Management
多意图分类旨在帮助完成多意图分类后的后续行动预测任务。在对话训练数据中使用多意图有两种互补的方式:
1) 为多重意图添加常规故事或规则。例如,对于每个单独的意图,给出以下两条规则:
rules:
- rule: check account balance
steps:
- intent: check_balances
- action: action_check_balances
- rule: transfer money
steps:
- intent: transfer_money
- action: action_transfer_money
您可以为多重意图添加另一条规则,该规则指定一系列操作来处理这两个意图:
rules:
- rule: check balances and transfer money
steps:
- intent: check_balances+transfer_money
- action: action_check_balances
- action: action_transfer_money
2) 允许机器学习策略从单一意图故事推广到多意图场景。
当使用多意图时,该意图是使用多个独热编码的机器学习策略的特征。这意味着支票余额+转账的特征化将与单个意图的特征化重叠。机器学习策略(如TEDPolicy)可以基于多意图做出预测,即使它没有明确出现在任何故事中。然而,它通常会表现为只存在一个单独的意图,因此编写一个特定的故事或规则来处理多个意图的情况总是一个好主意。
Comparing Pipelines
Rasa为您提供了直接比较数据上多个管道性能的工具。有关更多信息,请参见比较NLU管道。
https://rasa.com/docs/rasa/tuning-your-model
Rasa系列博客:
- 业务对话机器人Rasa 3.x Internals及Rasa框架定制实战
- 业务对话机器人Rasa核心算法DIET及TED论文详解
- 业务对话机器人Rasa 3.x部署安装初体验
- 业务对话机器人Rasa 3.x Playground
- 业务对话机器人Rasa 3.x Command Line Interface
- 业务对话机器人Rasa 3.x 命令 rasa shell 及rasa run
- 业务对话机器人Rasa 3.x 命令rasa run actions、rasa test、rasa data split 、rasa data convert nlu
- 业务对话机器人Rasa 3.x 命令rasa data migrate、rasa data validate、rasa export、rasa evaluate markers、rasa x
- 业务对话机器人Rasa 3.x 会话驱动开发(Conversation-Driven Development)
- 业务对话机器人Rasa 3.x 生成自然语言理解NLU数据
- 业务对话机器人Rasa 3.x 写入会话数据(Writing Conversation Data)
- 业务对话机器人Rasa 3.x 聊天和FAQs常见问题解答
- 业务对话机器人Rasa 3.x docker安装部署
- 业务对话机器人Rasa 3.x Handling Business Logic
- 业务对话机器人Rasa 3.x Fallback and Human Handoff
- 业务对话机器人Rasa 3.x Handling Unexpected Input
- 业务对话机器人Rasa 3.x Contextual Conversations
- 业务对话机器人Rasa 3.x Reaching Out to the User
- 业务对话机器人Rasa 3.x 微信+Rasa机器人实战案例