一二三 Google Sheets的聊天机器人,以Alice的PvP游戏为例


出现后,爱丽丝以出乎意料的高质量语音合成和聊天机器人吸引了用户。 如今,她有望拥有有用的技能和有趣的游戏,其后端可以考虑用户的上下文并实现各种场景。 本文讨论了基于Google Sheets的一项技能的创建,Google Sheets是许多人所熟悉的工具,对于小型聊天机器人来说具有很大的潜力。

与真实人物玩游戏比与虚拟人物玩游戏更有趣,因此,举例来说,我们将为爱丽丝开发一款多人游戏。

一个! 对话对话


游戏从规则开始。 我想到了这些:两个玩家中的每一个首先在三扇门后面放置一个宝物和一个陷阱,然后打开对手的任何一扇门。 打开宝藏-获取对手的硬币,打开陷阱-将硬币交给他。 硬币数量(从1到3)由玩家自己决定。 剩下的门后面是潘多拉魔盒(Pandora's box),您可以打开它找到/丢掉一些硬币。 您可以与Alice一起玩,也可以与其他用户一起玩。

爱丽丝的界面以对话形式解决,所有游戏互动均应通过消息传递实现。 游戏服务器对每个消息的处理由以下步骤表示:

  1. 恢复用户上下文;
  2. 恢复上下文中的查询解释;
  3. 形成响应消息;
  4. 保存更改的用户上下文。

恢复并保存用户上下文


用户的上下文包括他在游戏中的状态,包括以前的结果,脚本内的步骤和当前的对手以及用户名和游戏逻辑所需的其他信息。

在每个请求中, 根据协议 ,Alice传递用户ID。 这足以保存并随后还原其上下文。

作为数据仓库,请使用Google表格。 该解决方案的客观优势包括免费使用,可见性和易用性。 内置的脚本编辑器允许您在Apps脚本(基于JavaScript)中描述游戏的逻辑,参考API表并将其发布为Web应用程序。

创建具有必要标题的表后,您可以转到脚本编辑器:


可以在Apps脚本的一个项目中描述游戏的逻辑,将其组织为一组gs文件,然后进行发布:


发布时,必须指定应用程序对匿名用户的可用性:


在输出时,您将获得发布的Web应用程序的URL。 脚本中的doGet()和doPost()函数将处理相应类型的请求,以便接收和保存用户上下文。

下面是使用API​​表进行数据处理的示意图:

//  var sheet = SpreadsheetApp.openById("<id >").getSheetByName("< >"); //  var range = sheet.getRange(< >); //   var values = range.getValues(); //    range.setValues(< >); 

在还原的上下文中解释请求


在一般情况下,正确解释文本查询需要使用智能NLU算法。 而且,尽管这类算法在Aimylogic所描述的简单工具中都可以使用,但在这种情况下,我还是决定放弃自然语言处理, 以求简化。

在拟议的游戏中,玩家与爱丽丝的互动限于十二种可能的状态,并且可以减少为一小部分意图。 为简单起见,我总是向玩家提供三种可能的动作:发送“一个”,“两个”或“三个”。 对于其他任何请求,Alice要求澄清操作。

在这种情况下,该方案可归结为以下Apps脚本代码:

 //     switch(user.state){ case "start": //       switch(utterance){ case “1️⃣ ”: case “2️⃣ ”: case “3️⃣ ”: //     default: //     } break; //    default: //      } 

对于用户,这样解决的交互表示为三个选项之一的选择,其含义在每个Alice的答案中均已明确定义。 选项本身由“一个”,“两个”,“三个”按钮表示,可显着加快游戏速度。

响应消息生成


爱丽丝的答案包括几个部分,每个部分都需要形成,包括:

  • 要在屏幕上显示的文本;
  • 用于语音合成的文本;
  • 提示按钮集。

最近,我提出了EASY对话概念 ,描述了设计对话界面的原理,包括针对Alice的对话。 爱丽丝的响应格式允许实现这些原则。

因此,将显示的文字和语音文字分开,可以使答案更加简洁自然。 您不能强迫Alice合成用户已经熟悉的长文本,也不能在消息文本和按钮名称中使用表情符号。

提示按钮实现了主动性原则:Alice总是指出并建议可能的措施以继续对话。 在建议的游戏场景中,按钮列表不取决于上下文,而是添加到每个消息中。

因此,我们有一个Google Table,其中包含通过网络应用程序的URL存储和检索的用户数据。 该应用程序是用Apps脚本编写的,它根据其上下文解释用户的操作并为响应消息生成数据。

它仍然可以连接到爱丽丝...

两个! 整合性


Yandex.Dialogs允许开发人员向Alice添加他们的技能。 连接技能可归结为三点:

  • 激活
  • 设计
  • 网页挂钩。

激活与设计


对于激活,重要的是选择一个爱丽丝能够很好地识别并符合Yandex 正式要求的短语。 如果激活名称中有数字,请从键盘和语音输入时分别检查激活。

技能设计包括名称,说明,图标,类别等。
值得考虑的是,在目录中的技能列表中,仅显示图标和激活短语,并且目录中的搜索主要根据描述进行。

获取网页挂钩


网络挂钩是Alice将向您的技能发送消息并等待上述格式的JSON响应的地址。



默认情况下,在Apps Script上创建的Web应用程序以html页面的形式返回响应,但是使用ContentService时,它也可以被强制返回JSON:

 return ContentService.createTextOutput(JSON.stringify(<JSON >)) .setMimeType(ContentService.MimeType.JSON); 

但是,在使用ContentService时,Google会将用户的请求重定向到一个临时URL,而Yandex.Dialogs尚未准备好。 因此,Web应用程序的地址不适合用作Web挂钩。

有免费的服务提供适合Alice的Web挂钩, 例如Zenbot 。 在Zenbot中,对于所建议的游戏,您可以编写一个简短的脚本来访问Google Web应用程序并返回响应以及按钮。 顺便说一句,通过这种方式,游戏不仅可以与Alice集成,而且可以与其他渠道集成。

下面是提供游戏“一,二,三!”的示例脚本。 在Telegram机器人@RazDvaTriBot中:

 <context> <input pattern="$Text"> <var name="Utterance" value="$Text" scope="input"/> <get url="https://script.google.com/macros/s/<id ->/exec" var="Result"> <param name="userId" value="$req_telegram_chat"/> <param name="utterance" value="$Utterance"/> <param name="channel" value="telegram"/> </get> <var name="Answer" value='javascript: $Result.text'/> <output value="$Answer"/> <sample> <item value=""/> <item value=""/> <item value=""/> </sample> </input> </context> 

为了更灵活地处理请求,您可以使用例如Google App Engine编写自己的服务器。 该工具也可以免费使用。

在Google App Engine中创建一个项目后,您可以使用Cloud Shell界面在一个网页上编写服务器代码,然后将其部署到https:// <project id> .appspot.com形式的所需URL,这将是Web挂钩的地址。

服务器操作包括以下步骤:

  1. 接收来自爱丽丝的请求数据;
  2. 与游戏的网络应用程序进行交互;
  3. 发送爱丽丝格式的回复。

接收/发送爱丽丝数据


从Alice中获取会话,用户,消息的标识符以及请求的文本很重要。 以下是PHP中的示例:

  $data = json_decode(file_get_contents("php://input")); $session_id = $data->session->session_id; $user_id = $data->session->user_id; $utterance = $data->request->original_utterance; $messageId = $data->session->message_id; 

作为答案,提示按钮和文本将返回到游戏中以进行显示和发音:

  $button1 = array('title' => '1️⃣ ', 'hide' => true); $button2 = array('title' => '2️⃣ ', 'hide' => true); $button3 = array('title' => '3️⃣ ', 'hide' => true); $yaButtons = array($button1, $button2, $button3); $yaResponse = array('text' => $text, 'tts' => $tts, 'buttons' => $yaButtons, 'end_session' => false); $yaSession = array('session_id' => $session_id, 'message_id' => $messageId, 'user_id' => $user_id); $yaResult = array('response' => $yaResponse, 'session' => $yaSession, 'version' => '1.0'); echo json_encode($yaResult); 

三! 同步处理


从Web应用程序发送/接收数据需要时间,而且Alice渴望为用户提供答案,因此同步问题会干扰此问题。

自然,对于大型项目,Google表格不适合作为Alice技能的后端:响应时间随着大量并行请求而增加。 尽管如此,仍有一些建议可以优化聊天机器人,从而使一个小型项目在实时交互式对话系统中可行。

爱丽丝的同步协议超时-每个响应1.5秒。 如果服务器在此期间没有时间给出答案,则用户会本着“对不起,<对话框名称>没有响应”的精神看到一条悲伤的消息。 系统不提供任何线索下一步该怎么做。

为避免这种情况,您可以而且应该加快服务速度,并跟踪和处理超时。 游戏脚本操作期间最冗长的操作是读取和写入表数据。 因此,首先,这些操作的数量必须最小化,其次,希望将它们并行化。

一次读取表数据。 执行完逻辑后,脚本可以在结果记录结束之前立即为用户提供答案。

应允许在有限的时间内接收响应-例如1100毫秒:

  $request_params = array( 'userId' => $user_id, 'utterance' => $utterance, 'channel' => 'alice' ); $get_params = http_build_query($request_params); $ctx = stream_context_create(array('http'=> array( 'timeout' => 1.1 ) )); $answer = file_get_contents('https://script.google.com/macros/s/<id ->/exec?'. $get_params, false, $ctx); 

如果GET请求准时收到了响应,我们可以将其发送给用户,并通过POST请求在后台启动结果保存。 否则,我们为用户提供带有按钮的存根文本以继续,并忽略脚本的结果,以便用户可以在当前上下文中重复其请求。

  if($answer === FALSE) { $text = ' ,   .'; $tts = ',   .'; } else { $answer = json_decode($answer); $text = $answer->text; $tts = $answer->tts; //   $data2store = $answer->data; $postdata = json_encode(array( 'data' => $data2store )); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/json', 'content' => $postdata, 'timeout' => 0.1 ) ); $context = stream_context_create($opts); file_get_contents("https://script.google.com/macros/s/<id ->/exec", false, $context); } 


在Alice的多人游戏中,必须在游戏服务器和Yandex之间以及玩家之间解决同步任务。 如果玩家想与其他用户对战,则游戏本身会从最近想玩的对手中选择对手。 用户必须确认他们愿意互相玩游戏才能开始游戏。

目前,该技能无法启动向爱丽丝的用户发送消息。 因此,游戏脚本可用于检查对手的准备情况以及为比赛一轮分配的时间。 如果对手延迟游戏,则提示用户等待他:“还等对手吗?” 通过同意等待,用户将开始另一个检查。 如果游戏分钟结束,则游戏结束。

结论


Google表格作为聊天机器人后端的优势(免费除外)包括以下事实:它是开发过程中的调试工具,之后它成为技能管理员的控制台,可以通过任何设备进行协作编辑。 通过缺点-大量用户同时运行的延迟。

我希望本文能帮助发烧友和开发人员快速为Alice或其他渠道创建有用的技能。 拟议的游戏可在Yandex.Dialog技能商店中找到,名称为“ 1、2、3 多人游戏 。”

除通用工具外,还有用于聊天机器人开发的专用解决方案。 我邀请读者参加关于我在该领域所知服务的小型调查。 该列表未包含所有现有产品-如果您使用其他工具,请提供带有名称的评论和简短评论,我们将不胜感激。

Source: https://habr.com/ru/post/zh-CN414213/


All Articles