Introduction
有一场超级锦标赛在上演,但您不得不被困在工作中, 你需要在截止日期前完成,但是你无法集中注意力,因为你最喜欢的球队在季后赛席位上处于激烈的争夺中。 神烦!!!!!
在我的职业生涯中,我经常遇到这种情况,每5分钟检查一下我的手机真的不是一个选择! 作为一名数据科学家,我从NLP发烧友的镜头中看到了这一挑战。 建立一个可以从正在进行的IPL(印度超级联赛)锦标赛中获取分数的聊天机器人将是一个救星。
所以我做到了! 使用用于NLP的令人敬畏的Rasa堆栈,我构建了一个聊天机器人,我可以随时在我的计算机上使用它。 不再低头看电话而且分心了。
我将聊天机器人部署到Slack,这是事实上的团队沟通的流行平台。 这是对的 - 我可以随时查看分数而无需访问任何外部网站。 听起来太好了,不错的机会,对吧?
在本文中,我将指导您如何在几分钟内构建自己的Rasa聊天机器人并将其部署在Slack中。 随着ICC板球世界杯即将到来,这是一个让您的聊天机器人游戏开始并满足您对板球的热情而不用担心工作的好时机。
Table of Contents
- 为什么要使用Rasa Stack来构建Chatbot?
- 我们的IPL聊天机器人剖析
- 从消息中提取用户意图
- 进行交互式对话
- 与我们的IPL Chatbot交谈
- 使用CricAPI获取IPL数据
- 将我们的Chatbot带入生活(整合Rasa和Slack)
Why should you use the Rasa Stack for Building Chatbots
Rasa Stack是一套主要针对聊天机器人的开源NLP工具。 事实上,它是在几分钟内构建复杂聊天机器人的最有效和最省时的工具之一。 以下是我喜欢使用Rasa Stack的三个原因:
- 1通过为部署,创建服务器等其他后台任务提供现成的代码,您可以专注于改进项目的“Chatbot”部分。
- 2 Rasa的默认设置非常适合用于意图提取和对话管理的开箱即用,即使数据较少也是如此
- 3 Rasa堆栈是开源的,这意味着我们确切地知道底层发生了什么,并且可以根据需要自定义事物
这些功能使Rasa与其他聊天机器人构建平台区分开来,例如Google的DialogFlow。 这是我们即将建立的聊天机器人的先睹为快:
Anatomy of our IPL Chatbot
让我们了解在进入编码部分之前,我们的Rasa驱动的IPL聊天机器人将如何工作。 了解聊天机器人的架构将有助于我们调整最终模型。
Overview of the Rasa Chatbot
我们可以采用各种方法来构建这个聊天机器人。 如何简单地使用最快捷,最有效的方法? 查看下面我们的IPL聊天机器人的高级概述:
让我们分解这个架构(继续参考图像来理解这个):
- 一旦Rasa收到来自最终用户的消息,它就会尝试预测或提取消息中存在的“意图”和“实体”。 这部分由Rasa NLU处理
- 一旦识别出用户的意图,Rasa Stack就会执行一个名为action_match_news的操作,以从最新的IPL匹配中获取更新
- 然后Rasa试图预测接下来应该做什么。 此决定考虑了多个因素,由Rasa Core处理
- 在我们的示例中,Rasa显示了最近一次与用户匹配的结果。 它还预测了我们的模型应采取的下一步行动 - 与用户核实聊天机器人是否能够解决他/她的查询
Setting up the IPL Chatbot
我在GitHub上创建了两个版本的项目:
- 1个完整版 - 这是一个完整的聊天机器人,您可以立即在Slack中部署并开始使用
- 2练习版 - 在阅读本文时使用此版本。 它将帮助您了解代码的工作原理
所以,继续从GitHub克隆’Practice Version’项目:
git clone https://github.com/mohdsanadzakirizvi/iplbot.git && cd iplbot
And cd into the practice_version:
cd practice_version
在继续进行之前,请注意您应该注意的几件事:
- Rasa目前仅支持Python版本 <= 3.6. 如果您有更高版本的Python,则可以使用以下命令在conda中设置新环境:
conda create -n rasa python=3.6
conda activate rasa
- 您将需要一个文本编辑器来处理我们项目的多个文件。 我个人最喜欢的是Sublime Text,你可以下载 here
Installing Rasa and its Dependencies
您可以使用以下代码安装Rasa堆栈的所有依赖项:
pip install -r requirements.txt
此步骤可能需要几分钟,因为要安装的文件很多。 您还需要安装spaCy英语语言模型:
python -m spacy download en
Let’s move on!
Extracting User Intent from a Message
我们要做的第一件事是弄清楚用户的意图。 他或她想要完成什么? 让我们利用Rasa并构建一个NLU模型来识别用户意图及其相关实体。
查看您之前下载的practice_version文件夹:
我们将使用的两个文件在上面突出显示。
- data / nlu_data.md - 这是用于保存训练数据以提取用户意图的文件。 文件中已存在一些数据:
如您所见,Rasa中“意图”的训练数据格式非常简单。 你只需要:
- 以“##intent:intent_name”开头
- 提供以下行中的所有示例
让我们在Python中为用户想要获取IPL更新的场景编写一些意图示例:
## intent:current_matches
- which cricket match is happening right now
- which ipl match is next
- which teams are playing next in ipl
- tell me some ipl news
- i want ipl updates
- what are the latest match updates
- who won the last ipl match
- how is ipl going
- what was the result of the last match
- when is the next match
您可以为每个意图包含任意数量的示例。 实际上,请确保包含发短信时使用的俚语和简短表单。 这个想法是让聊天机器人理解我们输入文本的方式。 请随意参考完整版本,其中我已经为每种意图类型提供了大量示例。
- nlu_config.yml - 该文件允许我们在Rasa中创建文本处理管道。 幸运的是,Rasa根据我们的训练数据量提供了两种默认设置:
- 如果您的培训示例少于1000个,请使用“spacy_sklearn”管道
- 如果您有大量数据,请使用“tensorflow_embedding”
让我们选择前者,因为它适合我们的例子:
Training the NLU classifier
如果你已经做到这一点,你已经完成了意图提取模型的大部分工作。 让我们训练它,看看它在行动!
您只需按照以下命令训练分类器:
make train-nlu
使用Windows? 您可以运行以下python代码:
python -m rasa_nlu.train -c nlu_config.yml --data data/nlu_data.md -o models --fixed_model_name nlu --project current --verbose
Predicting the Intent
让我们通过给出一个未提取意图的示例文本来测试我们的模型的性能。 您可以打开iPython / Python shell并按照以下步骤操作:
>>> from rasa_nlu.model import Interpreter
>>> nlu_model = Interpreter.load('./models/current/nlu')
>>> nlu_model.parse('what is happening in the cricket world these days?')
这是输出的样子:
{
'intent': {
'name': 'current_matches',
'confidence': 0.6657130383645372
},
'entities': [],
'intent_ranking': [{
'name': 'current_matches',
'confidence': 0.6657130383645372
}, {
'name': 'goodbye',
'confidence': 0.11589267701634796
}, {
'name': 'affirm',
'confidence': 0.06372593552204527
}, {
'name': 'thanks',
'confidence': 0.0623182164883462
}, {
'name': 'deny',
'confidence': 0.05938353524001583
}, {
'name': 'greet',
'confidence': 0.03296659736870796
}],
'text': 'what is happening in the cricket world these days?'
}
我们的NLU模型不仅在意图提取方面表现良好,而且还根据其置信度得分对其他意图进行排名。 这是一个漂亮的小功能,当分类器在多个意图之间混淆时,它非常有用。
Making Interactive Conversations
聊天机器人应用程序最重要的一个方面是它具有交互性。 回想一下之前使用过的聊天机器人。 如果聊天机器人能够进行对话,我们的兴趣自然会激起,对吧?
聊天机器人应该使用与最终用户的来回对话来提取执行特定任务所需的所有必要信息。
设计会话流程
花点时间考虑聊天机器人与用户之间可以进行的最简单的对话。 这种对话的流程是什么? 让我们以故事的形式写出来吧!
Me: Hi
Iplbot: Hey! How may I help you?
Me: What was the result of the last match?
Iplbot: Here are some IPL quick info:
1.The match between Rajasthan Royals and Delhi Capitals was recently held and Delhi Capitals won.
2.The next match is Warriors vs Titans on 22 April 2019
Iplbot: Did that help you?
Me: yes, thank you!
Iplbot: Glad that I could help! ?
让我们看看我们如何向Rasa教授这样简单的对话:
## news path 1
* greet
- utter_greet
* current_matches
- action_match_news
- utter_did_that_help
* affirm or thanks
- utter_gratitude
* goodbye
- utter_goodbye
一般格式是:
## news path 1 <--- story name for debugging purposes
* greet <--- intent detected from the user
- utter_greet <--- what action the bot should take
* current_matches <--- the following intent in the conversation
这称为用户故事路径。 我在data / stories.md文件中提供了一些故事供您参考。 这是Rasa Core的培训数据。
它的工作方式是:
- 提供用户应遵循的示例故事路径的一些示例
- Rasa Core随机组合它们以创建更复杂的用户路径
- 然后它构建了一个概率模型。 此模型用于预测Rasa应采取的下一步行动
查看项目的** complete_version 中的 data / stories.md **文件以获取更多此类示例。 同时,这里是一个很好的可视化Rasa为我们的IPL聊天机器人生成的基本故事路径:
上面的插图可能看起来很复杂,但它只是列出了我教过Rasa的各种可能的用户故事。 以上图表中有以下几点需要注意:
- 除START和END框外,所有彩色框表示用户意图
- 所有白框都是聊天机器人执行的操作
- 箭头表示对话的流程
- action_match_news是我们点击CricAPI以获取IPL信息的地方
在stories.md文件中写下以下内容:
## news path 1
* greet
- utter_greet
* current_matches
- action_match_news
- utter_did_that_help
* affirm or thanks
- utter_gratitude
* goodbye
- utter_goodbye
## news path 2
* current_matches
- action_match_news
- utter_did_that_help
* affirm or thanks
- utter_gratitude
* goodbye
- utter_goodbye
## news path 3
* greet
- utter_greet
* current_matches
- action_match_news
- utter_did_that_help
* deny
- utter_ask_again
* current_matches
- action_match_news
- utter_did_that_help
* affirm or thanks
- utter_gratitude
* goodbye
- utter_goodbye
## greet path
* greet
- utter_greet
## goodbye path
* goodbye
- utter_goodbye
现在,使用以下命令为您的故事生成类似的图表:
python -m rasa_core.visualize -d domain.yml -s data/stories.md -o graph.html
在调试chatbot的会话流时,这非常有用。
定义域名
现在,打开** domain.yml **文件。 您将熟悉此处提到的大多数功能:
该域名是您聊天机器人的世界。 它包含聊天机器人应该知道的一切,包括:
- 它能够做的所有行动
- 它应该理解的意图
- 它应告诉用户的所有话语的模板等等
设置策略
Rasa Core使用我们提供的故事为会话部分生成培训数据。 它还允许您定义一组策略,以便在决定聊天机器人的下一个操作时使用。 这些策略在** policies.yml **文件中定义。
因此,打开该文件并复制以下代码:
policies:
- name: KerasPolicy
epochs: 100
max_history: 5
- name: FallbackPolicy
fallback_action_name: 'action_default_fallback'
- name: MemoizationPolicy
max_history: 5
以下是有关上述政策的一些注意事项(取自Rasa Core的政策):
- KerasPolicy使用Keras中实现的神经网络来选择下一个动作。 默认架构基于LSTM(长短期内存)模型
- MemoizationPolicy记忆训练数据中的对话。 如果训练数据中存在这种确切的对话,它会以置信度1.0预测下一个动作,否则,它会以置信度0.0预测“无”
- 如果意图识别具有低于nlu_threshold的置信度,或者没有任何对话策略预测具有高于core_threshold的置信度,则FallbackPolicy将调用回退操作
- Rasa Core策略的一个重要超参数是max_history。 这可以控制模型查看的对话历史记录,以决定接下来要采取的操作
训练对话模型
您可以使用以下命令训练模型:
make train-core
或者,如果您使用的是Windows,则可以使用完整的Python命令:
python -m rasa_core.train -d domain.yml -s data/stories.md -o models/current/dialogue -c policies.yml
这将训练Rasa Core模型,我们可以立即开始与机器人聊天!
Talking to your IPL chatbot
在我们继续前进之前,让我们尝试与我们的聊天机器人交谈,看看它是如何运作的。 打开一个新终端并键入以下命令:
make cmdline
加载后,尝试与聊天机器人进行对话。 你可以先说“嗨”。 以下视频显示了我与聊天机器人的互动:
尝试获取IPL更新时收到错误消息:
Encountered an exception while running action 'action_match_news'. Bot will continue, but the actions events are lost. Make sure to fix the exception in your custom code.
聊天机器人理解我打算获得有关IPL的新闻。 出了什么问题? 这很简单 - 我们仍然没有编写后端代码! 那么,让我们接下来建立后端。
使用CricAPI获取IPL数据
我们将使用[CricAPI](https://www.cricapi.com/)获取与IPL相关的新闻。 每天100个请求是免费的,(我希望)足以满足你的板球疯狂激情。
您需要先在网站上注册才能访问其API:
https://www.cricapi.com/
登录后,您应该能够看到您的API密钥:
保存此密钥,因为它对我们的聊天机器人非常重要。 接下来,打开actions.py文件并使用以下代码进行更新:
API_URL = "https://cricapi.com/api/"
API_KEY = ""
class ApiAction(Action):
def name(self):
return "action_match_news"
def run(self, dispatcher, tracker, domain):
res = requests.get(API_URL + "matches" + "?apikey=" + API_KEY)
if res.status_code == 200:
data = res.json()["matches"]
recent_match = data[0]
upcoming_match = data[1]
upcoming_match["date"] = datetime.strptime(upcoming_match["date"], "%Y-%m-%dT%H:%M:%S.%fZ")
next_date = upcoming_match["date"].strftime("%d %B %Y")
out_message = "Here some IPL quick info:\n1.The match between {} and {} was recently held and {} won.".format(recent_match["team-1"], recent_match["team-2"], recent_match["winner_team"])
dispatcher.utter_message(out_message)
out_message = "2.The next match is {} vs {} on {}".format(upcoming_match["team-1"], upcoming_match["team-2"], next_date)
dispatcher.utter_message(out_message)
return []
使用从CricAPI获得的API_KEY填写,你应该很高兴。 现在,您可以再次尝试与聊天机器人交谈。 这一次,准备好惊讶。
打开一个新终端并启动您的操作服务器:
make action-server
这将激活在actions.py文件上运行的服务器,并将在后台为我们工作。 现在,在命令行中重新启动chatbot:
make cmdline
而这一次,它会在被问到时给你一些IPL新闻。 那不是很棒吗? 我们已经构建了一个完整的聊天机器人,无需执行任何复杂的步骤!
将Chatbot带入生活(整合Rasa和Slack)
所以我们准备好了聊天机器人。 现在是时候部署它并将其集成到Slack中,正如我在本文开头所承诺的那样。 对我们来说幸运的是,Rasa自己处理了90%的部署部分。
注意:在继续进行之前,您需要在Slack中拥有一个工作区。 如果你没有,那么你可以参考这个。
创建一个Slack应用程序
现在我们有一个可以试验的工作空间,我们需要一个应用程序来连接你的机器人。 在以下链接上创建应用:
https://api.slack.com/apps
- Click on “Create App”, 为应用程序命名,然后选择您的工作区:
这会将您重定向到您的应用信息中心。 从那里,您可以选择“Bots”选项:
- 单击“添加机器人用户” - >为机器人命名。 就我而言,我将其命名为“iplbot”。 现在,我们需要将它添加到我们的工作区,以便我们可以与它聊天! 返回上面的应用程序仪表板并向下滚动以找到“将应用程序安装到工作区”选项:
一旦你这样做,Slack会要求你“授权”申请。 继续并接受授权。
3.在我们能够将任何外部程序连接到Slack bot之前,我们需要在尝试连接时提供“auth令牌”。 返回“app dashboard”并选择“OAuth&Permissions”选项:
4. 这将打开应用程序的权限设置。 选择“Bot用户OAuth访问令牌”并保存(我出于安全原因隐藏了它们)。 此令牌有助于连接到我们的聊天机器人。
Installing Ngrok
我们的工作还没有结束。 我们需要另一个有用的工具来将我们的聊天机器人部署到Slack。 那是ngrok,您可以使用以下链接下载它:
https://ngrok.com/download
我们现在离部署我们自己的聊天机器人只有一步之遥! 令人兴奋的时刻在下一节等待着我们。
将Chatbot推送到Slack
我们只需要五个命令来完成这项任务,因为Rasa负责幕后的其他工作。
- 打开slack_credentials.yml文件并粘贴“Bot User OAuth Access Token”代替Slack令牌:
- 转到新终端并启动操作服务器:
make action-server
- 你会看到服务器在端口5055上运行所以让我们在这个端口上使用ngrok。 打开另一个终端并输入以下内容:
ngrok http 5055
这将给出如下图所示的输出:
突出显示的链接是互联网上连接到计算机端口5055的链接。这是ngrok所做的 - 它可以让您的计算机的本地程序在互联网上公开。 在某种程度上,这是使用云服务部署应用程序的快捷方式。
- 打开你的endpoints.yml文件并用上面的URL替换“http://localhost:5055/webhook”, 如下所示:
your_ngrok_url:5055/webhook
- 使用以下命令部署Rasa聊天机器人:
python -m rasa_core.run -d models/current/dialogue -u models/current/nlu --port 5002 --connector slack --credentials slack_credentials.yml --endpoints endpoints.yml
您将收到如下消息:
请注意,Rasa Core服务器正在端口5002上运行。
- 现在,将端口5002部署到互联网:
ngrok http 5002
- 转到Slack上的应用程序仪表板,单击“事件订阅”,然后单击“启用事件订阅”按钮。 在“请求URL”字段下以此格式粘贴Rasa核心服务器的ngrok URL:
在上面的URL中,将ngrok部分替换为您的ngrok URL:
your_ngrok_url/webhooks/slack/webhook
- 在订阅机器人事件下,单击添加机器人用户事件按钮。 它将显示文本字段和事件列表。 您可以在此字段中输入术语,以搜索您希望机器人响应的事件。 以下是我建议添加的事件列表:
添加事件后,单击屏幕底部的“保存更改”按钮。
现在您只需刷新Slack页面并立即开始与您的机器人聊天! 这是与我的聊天机器人的对话:
Where should you go from here?
如果您正在寻找类似的挑战,您会发现以下链接很有用。 我使用Rasa Core和Rasa NLU模型为餐馆搜索问题构建了类似Zomato的聊天机器人。 我将在自然语言处理课程中更详细地讲授这一点。
以下是课程链接供您参考:
- Certified Course: Natural Language Processing (NLP) using Python
- Certified Program: NLP for Beginners
- The Ultimate AI & ML BlackBelt Program
End Notes
我很想看到我们社区的不同方法和技术。 尝试在Rasa Core中使用不同的管道,探索更多策略,微调这些模型,查看CricAPI提供的其他功能等等。您可以尝试很多东西! 不要在这里停下来 - 继续尝试。
欢迎在下面的评论部分讨论并提供反馈。 我的项目的完整代码可在此处获得。
您还应该查看有关构建聊天机器人的这两篇文章:
- A Guide to Building an Intelligent Chatbot for Slack using DialogFlow API
- Building a FAQ Chatbot in Python, The Future of Information Searching