教程:使用Swift,Node和Wit构建一个简单的机器人

最近,我有机会为客户构建了一个iOS 聊天机器人应用程序。 该客户是一家汽车制造商,希望以一种“友好和对话的方式来获取有关您的新车的信息并排除故障。”原因很简单:在当今时代,人们很少在手套箱中寻找那种笨重的汽车手册。找出仪表板上红色闪烁的灯是什么意思。

相反,他们去了谷歌,或者他们给认识汽车的朋友发了短信。 它更快,更简单。 那么,如果汽车配备了具有所有答案的应用程序怎么办? 一个应用程序,您可以直接问“我如何打开巡航控制系统?”之类的问题,它仅向您显示如何执行此操作,直接来自汽车制造商本身而不是外部来源。

不幸的是,我只参与了该应用程序的前端。 所以我对后端感到好奇……这个机器人在发送所有这些JSON好东西? 事实证明,在当今时代,我们有很多选择(一些开源甚至有些免费)来构建机器人和AI,这可能是一个非常简单的任务。 因此,让我们构建一个可以处理人类基本互动的聊天机器人。

在本教程中,我们将在前端使用Swift 3,在后端使用Node和Express,并在AI中使用Wit。

威特

首先,我们需要注册机智:https://wit.ai/

机智需要使用Facebook或Github帐户进行注册。

登录后,Wit会自动为您设置一个应用程序MyFirstApp 。 您可以转到设置并将其名称更改为任意名称。 您还可以在此处更改默认时区和语言。

机智有一个“快速入门”教程,其中向您展示了如何创建“故事”,这基本上是与您的机器人进行对话的一个示例。 在他们的快速入门教程中,他们向您展示了如何创建一个可以使用node js客户端发出天气预报的机器人。

对于我们的机器人,让我们从更简单的内容开始。 点击“创建故事”,并将其命名为“你好”。

在“用户说…”字段中键入Hello

对于“意图”字段,输入“值” greeting

接下来,点击“自动发送”,然后输入您希望机器人响应的消息。 我们将机器人命名为Lucas ,因此我们将使用: Hi, my name is Lucas. What should I call you? Hi, my name is Lucas. What should I call you? 作为漫游器响应,因为我们希望Lucas 知道与之交互的用户的名称。

单击“用户说”,然后输入一些示例名称,例如Tom 。 现在,我们单击“添加新实体”,选择wit/contact类型,然后双击名称以突出显示它。

现在让我们单击“ Bot executes”,然后单击func...并键入storeName 。 单击“ Updates context keys with...然后键入userName

这是我们稍后将实现的功能。

单击“自动发送”,然后键入Nice to meet you, {userName}.

那么,到目前为止我们做了什么?

我们已经告诉Wit, Hello是一种“问候”的意图,Wit应该通过说“ hello”并询问用户名来进行回复。 我们已经告诉Wit,用户的下一个响应应该执行storeName操作,该操作应该在上下文中创建userName键。 之后,如果一切顺利,Wit应该以给定的名称向用户打招呼来回复。

现在是时候实现storeName 。 为此,我们需要开始构建前端客户端。

Swift 3.0和Xcode 8.2

打开Xcode(或您喜欢的任何Swift IDE)并创建一个新项目。 随意命名,但请确保选择“ Single View Application”,“ Swift”作为语言,以及“ iPhone”作为设备。 您还应该单击“用户核心数据”。

您现在应该拥有一个看起来像这样的xcode项目:

我们现在要做的事情可能会使某些人发疯。 我们将删除Main.storyboard文件。

我们将通过代码构建所有内容。 是的,我现在……这很可怕。 但是放松一下,一切都会好起来的。 如果您想知道我们为什么这样做,可以阅读以下文章:

为什么我不使用Interface Builder –树房子博客
对于iOS开发,我不使用Interface Builder。 我没有故意使用NIB(当我说NIB时,我的意思是Interface… blog.teamtreehouse.com

删除情节提要后,请转到应用程序委托。 我们需要手动连接VC。 非常简单

转到目标的Deployment Info ,并将“主界面”留为空白。

转到didFinishLaunchingWithOptions并将其内容替换为下面的代码。

cd进入您的项目文件夹并运行pod install

在pod安装完成后,您应该打开xcworkspace项目文件。

让我们创建一个NetworkMgr swift文件。 在这里,我们将实现与Wit的所有网络交互。

我们将从简单的事情开始,以确保我们可以与Wit交谈。

我们刚刚进行的调用是一个GET /message请求,该请求基于Wit的数据返回句子的含义。 正如回应所显示的,机智是正确的:这是一种问候。

但是,我们将设置一个快速服务器来处理机器人的业务逻辑。 为什么? 因为这样,我们可以在所需的任何移动/网络平台中开发聊天机器人客户端,在这种情况下为Swift iOS客户端。 前端应该只担心发送和接收数据。

我们需要一个Bot Manager类来处理网络,最后处理Core Data代码。 创建一个新的BotMgr.swift文件并添加:

您也可以在此处从github存储库下载图像。

您可以为1x2x3x尺寸使用相同的图像。

将这两种颜色添加到Utils类中:

 静态函数chatBotColor()-> UIColor { 
 返回UIColor(colorLiteralRed:119/255,绿色:222/255,蓝色:8/255,alpha:1.0) 
  } 
 静态函数chatUserColor()-> UIColor { 
 返回UIColor.white 
  } 

我们需要覆盖UITextField文本和编辑范围,因此通过创建ChatTextField类将其ChatTextField类化:

Wit会提供一个列表,它不能完全识别输入,因此您需要做的是:“确认”响应(如果看起来不错),或者按原样更改实体。

如果这样做,Wit会继续学习,下一次它应该会找到正确的答案。

现在,让我们连接我们的iOS应用程序。

Heroku

我们将在此演示中使用heroku,因为它是免费,快速且容易的。

注册Heroku,然后下载并安装Heroku CLI。

之后,通过heroku CLI身份验证登录:

  $ heroku登录 

在Heroku中创建一个Node js应用程序,并按照其有关如何部署Node JS应用程序的说明进行操作。

基本上,您需要将heroku应用程序源代码克隆到本地计算机上:

  $ heroku git:克隆-a  

然后,您需要在根文件夹中创建一个Procfile文件。 该文件应仅包含以下行:

 网站:节点index.js 

然后,您需要提交更改并部署:

  $ git push heroku master 

如果您做对了所有事情,那么您的iOS应用程序应该有一个端点,如下所示:

  https://mynodeapp.herokuapp.com/send?text= 

您可以对其进行测试,并确保它可以正常工作。 如果是,那么让我们回到我们的iOS应用程序。

最后步骤

使用我们更新的端点更改您的NetworkMgr:

结束。

好吧……这还不是终点,对吧? 您仍然需要完善您的iOS应用程序,还需要完善您的节点服务器,以确保其安全。 并且您可能想要安装数据库(例如mongo db),以便可以将密钥存储在数据库中而不是app.locals中。

但是至少您已经设置了可以与您的聊天机器人通信的iOS客户端。 您还具有可以与Wit通信的节点快速服务器。 而且您有一个可以与您打招呼的机器人。 天空才是极限。 与您的机器人玩得开心。

哦,如果您想查看我在Swift机器人应用程序中的进度,可以查看我的github存储库。 您也可以在机智中检出我的机器人,因为它是公开的(至少目前是这样)。 我的节点bot服务器尚未开源,但是如果我将其公开,则将使用url更新此帖子。

感谢您的阅读和愉快的编码!