文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

在过去的几个月里,聊天机器人变得非常受欢迎。多亏了Slack、Telegram 和FackbookMessenger,但是聊天机器人的想法并不新鲜。

第一个提到聊天机器人接口的是1950年的著名的图灵测试。然后是1966年的Eliza,一个模拟了罗杰斯心理疗法和早期自然语言处理的例子。之后是1972年Parry模拟了一个偏执型精神分裂症的人(是的,当然,Parry见过Eliza1)。

在1983年,有本书叫做《The Policeman’s Beard Is Half Constructed》,是由灵感产生的,一个由人工智能计算机程序随机生成的英文散文,后来才作为一个聊天机器人发布。

第 1 段(可获 1.48 积分)

其中最著名的是Alice (人工语言网络计算机实体), 1995年发布。它没能通过图灵测试,但是它却3次赢得罗布纳奖金。在2005年和2006年,两个Jabberwacky 机器人同样获得该奖。

在2014年,Slackbot使得聊天机器人再次流行起来。在2015年,Telegram和稍后的FacebookMesager宣布支持聊天机器人;后来,在2016年Skype也宣布支持,Apple和其他一些公司发声要对聊天机器人平台提供更多的支持。

Chat bots3

(图片: Stocks4) ( 预览大图5)

第 2 段(可获 1.14 积分)

建立一个聊天机器人你需要知道那些?

当然了,答案主要是取决于你想建立什么。

在大多数情况下,你不需要知道太多关于人工智能(AI)的知识就可以建立一个聊天机器人,要么完全避免使用人工智能或者使用一些现有的基于人工智能的库。

这同样适用于自然语言处理(NLP); 这比人工智能(AI)更重要,但你可以用自然语言库建立一个聊天机器人,或者说,对于一些平台,简单使用按钮和UI元素就可以替代文字处理。

最后,你还需要知道编程吗?有很多视觉机器人工程师就可能不会,但是编程很有用。

第 3 段(可获 1.5 积分)

如何建立一个FacebookMessenger机器人 

这是一篇关于建立聊天机器人的文章,所以让我们深入驾驭它,我们一起来建立一个简单的FacebookMessager机器人。

我们将使用Node.js, 但是你可以用任何能创建WebAPI的编程语言来建立聊天机器人。

为什么用Node.js? 因为它完美的适合聊天机器人:你用hapi.js可以很快的建立一个简单的API或Express等东西; 它对SlackRTM机器人提供实时消息支持;还容易学习(至少很容易建立一个简单的聊天机器人)。

Facebook已经写了一个示例在Node.js里,GitHub6可用. 如果你检查代码,你会发现它用Express框架并含有三个webhook(核查、身份验证和消息接收)。你还会看他它用Node.js请求模块时的响应。

第 4 段(可获 1.94 积分)

听起来很简单?

的确是,但是这个完整的机器人实例有839行代码,不是很多,你可能只需要其中的一半,但是它的入门仍然太公式化了。

我会告诉你,我们可以只用五行JavaScript就可以有同样的结果吗?

var botBuilder = require('claudia-bot-builder');

module.exports = botBuilder(function (request) {
  return 'Thanks for sending ' + request.text;
});

如果你用ECMAScript 6的话甚至更少:

const botBuilder = require('claudia-bot-builder');

module.exports = botBuilder(request => `Thanks for sending ${request.text}`);
第 5 段(可获 0.79 积分)

认识 Claudia Bot Builder 

Claudia Bot Builder帮助开发者为Facebook Messenger, Telegram, Skype 和 Slack创建聊天机器人 ,并且几分钟内就可以部署到AWS的Lambda和ApI Gateway上。

项目背后的关键想法是去除所有的样板代码和常见的基础设施任务, 以至于你可以专注于写机器人真正重要的部分 — 你的业务流程。其他的一切都是由Claudia Bot Builder处理。

为什么是AWS Lambda? 它非常切合聊天机器人: 创建一个简单的编程接口是很容易的;对于第一个个请求它的响应速度比免费的Heroku实例更快;而且它真的很便宜。每个月前一百万个请求都是免费的, 而余下的每一百万只要0.20美元!

第 6 段(可获 1.64 积分)

通过Claudia Bot Builder建立一个Facebook Messenger机器人是多么容易的一件事:

让我们建立一个太空探索者机器人

Space Explorer是一个简单的信使聊天机器人,它使用美国宇航局的API得到关于空间数据和图像。

在我们开始之前,创建一个Facebook的页面和应用程序,添加Messenger集成,如Facebook的“started7指南”描述的那样。

然后,创建一个名为bot.js含有下列内容的文件:

const botBuilder = require('claudia-bot-builder');

module.exports = botBuilder(request => `Hello from space explorer bot! Your request was: ${request.text}`);
第 7 段(可获 0.91 积分)

安装这些依赖库:

npm init;

npm install claudia-bot-builder -S;

npm install claudia -g;

 

使用Claudia Bot Builder创建聊天机器人

创建一个Lambda函数,并按照说明在上面的视频连接你的Facebook应用程序:

claudia create --region us-east-1 --api-module bot --configure-fb-bot

就是这样!您创建了您的第一个Facebook Messenger聊天机器人。

如果你发送消息到你的页面,你的机器人会回复。但答案都太简单了。让我们添加一些更有趣的回答吧!

整合 NASA’s 接口 

在我们继续之前,访问 NASA’s API portal8 来获取 API key.

第 8 段(可获 1.04 积分)

然后,添加您的API密钥作为nasaapikey的阶段变量在API Gateway上。 您可以从用户界面或运行以下命令:

aws apigateway create-deployment \
    --rest-api-id API_ID --stage-name latest \
    --variables nasaApiKey=YOUR_NASA_API_KEY

这里,API_ID 是你从claudia获取的API ID。上一步中自动生成json文件。

让我们为文本信息添加一个更好的答案。 Claudia Bot Builder 有一个简单的FaceBook Messenger的模板信息生成器(文件是在GitHub9上)。

const botBuilder = require('claudia-bot-builder');
const fbTemplate = botBuilder.fbTemplate;
const rp = require('minimal-request-promise');

module.exports = botBuilder((request, originalApiRequest) => {
  // If request is not postback
  if (!request.postback)
    // We'll get some basic info about the user
    return rp.get(`https://graph.facebook.com/v2.6/${request.sender}?fields=first_name&access_token=${originalApiRequest.env.facebookAccessToken}`)
      .then(response => {
        const user = JSON.parse(response.body)
        // Then let's send two text messages and one generic template with three elements/bubbles
        return [
          `Hello, ${user.first_name}. Welcome to Space Explorer! Ready to start a journey through space?`,
          'What can I do for you today?',
          return new fbTemplate.generic()
            .addBubble(`NASA's Astronomy Picture of the Day`, 'Satellite icon by parkjisun from the Noun Project')
              .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/apod.png')
              .addButton('Show', 'SHOW_APOD')
              .addButton('What is APOD?', 'ABOUT_APOD')
              .addButton('Website', 'http://apod.nasa.gov/apod/')
            .addBubble(`Photos from NASA's rovers on Mars`, 'Curiosity Rover icon by Oliviu Stoian from the Noun Project')
              .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/mars-rover.png')
              .addButton('Curiosity', 'CURIOSITY_IMAGES')
              .addButton('Opportunity', 'OPPORTUNITY_IMAGES')
              .addButton('Spirit', 'SPIRIT_IMAGES')
            .addBubble('Help & info', 'Monster icon by Paulo Sá Ferreira from the Noun Project')
              .addImage('https://raw.githubusercontent.com/stojanovic/space-explorer-bot/master/assets/images/about.png')
              .addButton('About the bot', 'ABOUT')
              .addButton('Credits', 'CREDITS')
              .addButton('Report an issue', 'https://github.com/stojanovic/space-explorer-bot/issues')
            .get();
        ];
      });
}
第 9 段(可获 0.84 积分)

现在我们的机器人有了一个不错的欢迎答复:

Space Explorer bot preview10

( 预览大图11)

更好了!

接下来,我们想要处理回发。让我们用NASA的天文图片来开始这一天:

// In case of the 'SHOW_APOD' postback, we'll contact NASA API and get the photo of the day.
if (request.text === 'SHOW_APOD')
  return rp(`https://api.nasa.gov/planetary/apod?api_key=${originalApiRequest.env.nasaApiKey}`)
    .then(response => {
      const APOD = JSON.parse(response.body)
      return [
        `NASA's Astronomy Picture of the Day for ${APOD.date}`,
        `"${APOD.title}", © ${APOD.copyright}`,
        new fbTemplate.image(APOD.url).get(),
        APOD.explanation,
        new fbTemplate.button('More actions:')
          .addButton('Download HD', APOD.hdurl)
          .addButton('Visit website', 'http://apod.nasa.gov/apod/')
          .addButton('Back to start', 'MAIN_MENU')
          .get()
      ]
    });
第 10 段(可获 0.38 积分)

这里是火星探测器(好奇、机会和精神):

// Common API call
function getRoverPhotos(rover, sol, nasaApiKey) {
  // If sol (Mars day) is not defined, take a random one.
  if (!sol)
    sol = (parseInt(Math.random() * 9) + 1) * 100;

  // Contact the API
  return rp(`http://api.nasa.gov/mars-photos/api/v1/rovers/${rover}/photos?sol=${sol}&api_key=${nasaApiKey}`)
    .then(response => {
      let rawBody = response.body;

      let roverInfo = JSON.parse('' + rawBody);
      // Create generic template with up to 10 photos.
      let photos = roverInfo.photos.slice(0, 10);
      let roverImages = new fbTemplate.generic();

      photos.forEach(photo => {
        return roverImages.addBubble(photo.rover.name, 'At ' + photo.earth_date + ' (sol ' + photo.sol + '), using ' + photo.camera.full_name)
          .addImage(photo.img_src)
          .addButton('Download', photo.img_src)
      });

      // Send the message.
      return [
        `${roverInfo.photos[0].rover.name} rover`,
        `Landing Date: ${roverInfo.photos[0].rover.landing_date} \nTotal photos: ${roverInfo.photos[0].rover.total_photos}`,
        roverImages.get(),
        new fbTemplate.button('More actions:')
          .addButton('Show newest photos', `PHOTOS_${rover}_${roverInfo.photos[0].rover.max_sol}`)
          .addButton('Visit Wikipedia', `https://en.wikipedia.org/wiki/${rover}_(rover)`)
          .addButton('Back to start', 'MAIN_MENU')
          .get()
      ];
    })
    .catch(err => {
      // If the selected sol doesn't have any photos, take the photos from sol 1000.
      console.log(err);
      return getRoverPhotos(rover, 1000, nasaApiKey);
    });
}

// Curiosity photos
if (request.text === 'CURIOSITY_IMAGES')
  return getRoverPhotos('curiosity', null, originalApiRequest.env.nasaApiKey);

// Opportunity photos
if (request.text === 'OPPORTUNITY_IMAGES')
  return getRoverPhotos('opportunity', null, originalApiRequest.env.nasaApiKey);

// Spirit photos
if (request.text === 'SPIRIT_IMAGES')
  return getRoverPhotos('spirit', null, originalApiRequest.env.nasaApiKey);

// Rover photos by sol (Mars day)
if (request.text.indexOf('PHOTOS_') === 0) {
  const args = request.text.split('_')
  return getRoverPhotos(args[1], args[2], originalApiRequest.env.nasaApiKey);
}
第 11 段(可获 0.13 积分)

最后,在末尾添加一些静态内容:

// About Astronomy Picture of the Day
if (request.text === 'ABOUT_APOD')
  return [
    `The Astronomy Picture of the Day is one of the most popular websites at NASA. In fact, this website is one of the most popular websites across all federal agencies. It has the popular appeal of a Justin Bieber video.`,
    `Each day a different image or photograph of our fascinating universe is featured, along with a brief explanation written by a professional astronomer.`,
    new fbTemplate.button('More actions:')
      .addButton('Show photo', 'SHOW_APOD')
      .addButton('Visit website', 'http://apod.nasa.gov/apod/')
      .addButton('Back to start', 'MAIN_MENU')
      .get()
  ];

// About the bot
if (request.text === 'ABOUT')
  return [
    `Space Explorer is simple Messenger chat bot that uses NASA's API to get the data and images about the space`,
    `It's created for fun and also as a showcase for Claudia Bot Builder, node.js library for creating chat bots for various platform and deploying them on AWS Lambda`,
    new fbTemplate.button('More actions:')
      .addButton('Claudia Bot Builder', 'https://github.com/claudiajs/claudia-bot-builder')
      .addButton('Source code', 'https://github.com/stojanovic/space-explorer-bot')
      .get()
  ];

// Finally, credits
if (request.text === 'CREDITS')
  return [
    'Claudia Bot Builder was created by Gojko Adžić, Aleksandar Simović and Slobodan Stojanović',
    'Icons used for the bot are from the Noun Project',
    '- Rocket icon by misirlou, \n- Satellite icon by parkjisun, \n- Curiosity Rover icon by Oliviu Stoian, \n- Monster icon by Paulo Sá Ferreira',
    'This bot was created by Claudia Bot Builder team',
    new fbTemplate.button('More actions:')
      .addButton('Claudia Bot Builder', 'https://github.com/claudiajs/claudia-bot-builder')
      .addButton('The Noun Project', 'https://thenounproject.com')
      .addButton('Source code', 'https://github.com/stojanovic/space-explorer-bot')
      .get()
  ];
第 12 段(可获 0.1 积分)

结果  

经过轻微的重构后,我们的代码应该类似于github12资源。

下面说说我们的机器人是如何工作的:

你可以尝试将它搬到你的网页上或者作为Space Explorer bot page13放到Facebook Messenger 。

Try it live on FB Messenger

就是这样! 你已经成功地构建了您的第一个聊天机器人使用 Claudia Bot Builder15. 这很容易,不是吗?

现在去建立更酷的聊天机器人。

结束语

我挑选 Facebook Messenger 作为出发点因为我们大多数人都很熟悉它。但是在制作我们的第一个机器人时选择了Slack是因为我们整个团队每天都在使用Slack。 所以, 我们决定直接在Slack上使用Claudia Bot Builder,Node.js, MariaDB 和 AWS Lambda来构建一个简单的 team vacation-tracker bot16 ,

第 13 段(可获 1.6 积分)

根据你的想法,目标市场和你最熟悉的平台,你可以在任何其他支持聊天机器人的平台开始你的项目。

访问Claudia17网站,看看如何开发和部署基于microservices和APIs的AWS。并让我们知道你创造了一些很酷的东西。

非常感谢Lav Crnobrnja, Marko Kažić, Goran Gajić, Bojan Matić 和Vuk Nikolić 的帮助和文章的回馈。

第 14 段(可获 0.96 积分)

文章评论