本文将使用 Watson Question and Answer (Q&A) 技术和 Watson 所公开的 Q&A API 构建一个简单的演示应用程序 Watson Films。认知存在于人类所做的几乎任何活动中,比如语言理解、感觉、判断、运动技巧、学习、空间处理和社交行为。我们越来越期望所使用的机器能表现出相同的认知行为。IBM Watson 代表着向认知系统(一个新的计算时代)进军的第一步。除了使用编程计算,Watson 拥有 3 大让它变得真正独一无二的功能:
自然语言处理
假设生成和评估
动态学习
IBM Watson 通过前所未有的独特方式将这 3 种强大功能结合在一起,从根本上改变了企业着眼于快速解决问题的方式。IBM Watson 是一种自然语言问答系统,它不使用准备好的答案,而是基于它获取的知识来确定答案和相关的置信度。
Watson 鼓舞着许多开发人员构想出新的创新性应用程序理念,使用认知元素向用户提供更好、更个性化的体验。受 Watson 支持的应用程序所能做的不仅仅是简单的数据处理,而且可以找到关联,建立假设,并从结果中不断学习。本文将使用 Watson Question and Answer 技术和 Watson 所公开的 Question and Answer API (QAAPI) 构建一个简单的演示应用程序 Watson Films。
备注:要完整地运行本文中的 “Watson Films” 应用程序,必须能够访问一个 IBM Watson 实例。要访问一个 IBM Watson 实例,请参阅Watson Developer Cloud Enterprise(PDF 文件) 和/或申请加入 Watson Ecosystem 计划。为了帮助您理解 Watson 的输入和输出,我们在 DevOps Services 项目中的 watson_films_dw/samples 文件夹下提供了 Watson QAAPI 请求和响应 JSON 示例。感谢大家的理解!
该应用程序将在 IBM Bluemix 上托管和管理,Bluemix 是一个基于 Cloud Foundry 的 PaaS,用于构建、管理和运行各种类型的应用程序(Web、移动、大数据和智能设备)。该应用程序的代码将通过 加以管理。
认知系统的特征
认知系统:
操控人类语言和理解的
复杂性 获取并处理海量的结构化和非结构化(大)数据 生成并评估无数的可能性 仅基于相关的证据来权衡和评估响应 提供特定于情景的建议、洞察和指导 在每次迭代和交互中不断
改善知识和学习 支持在影响点制定决策 可与任务成比例地扩展
这些系统应用类似人类的特征来传达和处理想法。与数字计算的内在优势相结合时,它们可以更高的准确性和弹性在更大规模上解决问题。Watson 是认知系统的一个例子。它可梳理人类语言并在文本消息之间进行推断,具有与人类相似的准确性,但速度和范围比任何人都大得多。基于规则的方法需要几乎无限数量的规则,用以捕获我们可能在语言中遇到的每种情形。
图 1. 认知系统的关键特征
准备构建 Watson Films
Watson Films 应用程序是对如何构建一个应用程序来使用 Watson QAAPI 与 Watson 进行交互的简单演示。这个应用程序允许用户询问有关电影的问题,尤其是美国电影协会 100 大美国电影,以及一般性的电影制作问题。
图 2. Watson Films 界面
在回答用户问题之前,IBM Watson 必须拥有一个包含信息的知识库,以便可从中推断出正确的答案。对于此应用程序,我们使用 Wikipedia 上提供的有关 美国电影协会 评选出的有史以来 100 部最伟大美国电影清单的内容。这些来自 Wikipedia 的内容为 HTML 格式。我们还使用来自柯达的 The Essential Reference Guide for Filmmakers 的内容,这些内容也采用 PDF 格式。
获取 Watson Films 代码
可以
首先试用一下!查阅 Watson Films 演示。 要获取或查看 Watson Films 代码,可单击前面的 Get or view the code 按钮,或者结合使用 IBM DevOps Services 和 Web IDE。因为此项目包含 JavaScript、HTML 和 CSS 代码,所以在创建项目分支后,惟一需要查看或编辑的可能只有 Web IDE。 要将此项目下载到您的本地 local Eclipse IDE(已安装 Nodeclipse 插件)中并进行设置,请按照以下 说明 操作。 也可创建 “Watson Films” 项目的分支,基于此项目的内容而创建您自己的 DevOps Services 项目。
关于 Watson Films 代码
Watson Films 演示应用程序使用 Express 构建于 Node.js 之上。我们还使用 Bootstrap 和 Slick Carousel 构造用户界面并设置其样式。
以下简短概述了使用的技术:
IBM Watson Watson QAAPI – Watson 的一个 RESTful 界面,支持用户询问问题并从 Watson 接收答案。 Node.js - 一个构建于 Chrome 的 JavaScript 运行时之上的轻量级平台,用于
轻松地构建快速、可扩展的服务器端网络应用程序 Express.js - 一个面向 Node 的 Web 应用程序框架 Bootstrap.js – 一个简单且响应灵敏的前端 Web 开发框架 jQuery - 一个快速、小型、功能
丰富的 JavaScript 库 Ladda – 一个响应灵敏的按钮工具包 Slick Carousel – 一个 JavaScript carousel。Bootstrap 也有一个 carousel,但我们希望尝试一下 Slick!
关于 Watson Films 架构
Watson Films 架构由以下层和关联的组件组成:
视图:一个响应灵敏的前端用户界面,主要使用 HTML5、CSS3、Bootstrap、jQuery 和其他 JavaScript 客户端插件构建。此层中的视图 组件允许用户通过一个输入点向 Watson 提问。 控制器:一个基于 Node.js 和 Express 的中间件和控制器层,向 视图 组件公开 RESTful 业务 API。这个 REST API 通过调用 Watson QAAPI 并处理响应来与 Watson 进行交互。可扩展它来执行其他业务操作,包括与其他认知服务和第三方服务集成。 认知后端:IBM Watson 消化吸收了有关电影和电影制作的内容。Watson 提供了一个 RESTful 接口 QAAPI。这个 API 使开发人员能够向 Watson 询问有关电影和电影制作的问题,并接收答案。答案包括各种不同的信息,比如答案文本、Watson 的置信度和支持该答案的证据。 平台和 DevOps:Watson Films 应用程序将部署在 IBM Bluemix 上。它还使用 DevOps Services 来管理代码。DevOps Services 负责管理 Watson Films 源代码及其向 Bluemix 的部署。Bluemix 托管着响应灵敏的前端用户界面和 Node.js 中间层,而 IBM Watson 及其 QAAPI 托管在 IBM Watson 开发者云中。
图 3. Watson Films 架构
在代码与架构之间建立映射
评审 WatsonFilms 代码时,您会在 watson_films_dw 项目根目录下看到少量文件和目录。这些文件和文件夹与 架构组件 具有直接关系。
public/ – 此目录包含所有 Watson Films 客户端 HTML、CSS 和 JavaScript。它由 Node.js 提供支持。 watson/ – 此目录包含我们的 REST API 所使用的逻辑。它使用 Watson QAAPI 直接与 Watson 进行交互。 app.js – 此文件启动 Web 服务器,后者托管着我们的 REST API 和所有客户端内容。
使用 Watson Experience Manager 将相关内容摄入到 Watson 中
IBM Watson 提供了一个基于 Web 的工具集,称为 Watson Experience Manager。借助这些工具,您可以:
上传和管理文档 创建和管理知识库 创建培训数据,以向 Watson 传授您的领域知识 使用一个开箱即用的 UI,提交问题并查看返回的答案或回复来测试 Watson 监视和查看使用报告
图 4. Watson Experience Manager
Watson 可摄入各种格式的内容,包括 DOCX、DOC、PDF、HTML 和文本。这些格式代表着存在的大多数非结构化内容。对于 Watson Films 应用程序,我们将从 Wikipedia 获取有关美国电影协会评选的 100 部最佳美国电影的 HTML 内容。我们还将从 The Essential Reference Guide for Filmmakers 获取一个 PDF 文档。我们将使用 Watson Experience Manager 上传和获取这些文档。
图 5. Watson Experience Manager - Corpus Management
构建和运行 Watson Films
需要一个 IBM DevOps Services 帐户来在本地构建和运行 Watson Films 演示。如果还没有 IBM DevOps Services 帐户,您可创建一个 帐户。
Watson Films 演示可使用 Eclipse 或不使用 Eclipse 构建。下面将介绍这两种方法。
下载项目并在本地设置它之后,您需要访问一个 Watson 实例来端到端地运行它。还需要更改 watson.js 文件中的 URL 和凭据,以反映您自己的 Watson 实例。我们提供了许多 Watson QAAPI 请求和响应 JSON 示例,可在 watson_films_dw/samples 文件夹下找到它们。
使用 Eclipse/Nodeclipse 构建和运行
第 1 步. 安装 Eclipse 下载并安装 Eclipse(v4.3.2 或更高版本)。 安装 Nodeclipse – 将 Install 按钮拖到 Eclipse 工具栏。 第 2 步. 获取代码
Watson Films 代码包含在 IBM DevOps Services 上托管的一个 Git 存储库中。要获取代码:
打开 Git 透视图:Window->Open Perspective->Git。 克隆该存储库:源代码位于 origin/master 分支上。
图 6. 克隆存储库
输入以下 Git 存储库 URL:https://hub.jazz.net/project/dimascio/WatsonFilmsDW。 输入您的 jazz hub 凭据并完成向导。 第 3 步. 将 WatsonFilm 项目导入 Eclipse 中
从 Git 透视图,打开 Working Directory 文件夹并选择 Import Projects。
图 7. 导入项目
第 4 步. 安装依赖项
选择 package.json 并运行 npm install 来安装依赖项,例如 Express。依赖项的安装是可选的。所有依赖项都包含在存储库中。
图 8. 安装依赖项
第 5 步. 运行代码
从 Node 透视图,选择 app.js 和 Run As->Node Application。
图 9. 运行代码
Watson Films 现在已在端口 3001 上运行。将浏览器指向 http://localhost:3001,以使用该演示应用程序。
不使用 Eclipse/Nodeclipse 构建和运行
Git 克隆 https://username:password@hub.jazz.net/git/dimascio/WatsonFilmsDW,其中 username 和 password 指的是您的 IBM DevOps Services 帐户。 安装 Node.js。 运行 npm install express。 运行 npm install request。 导航到您克隆的存储库和 WatsonFilmsDW/watson_films_dw 文件夹。 运行 node app.js。
Watson Films 现在已在端口 3001 上运行。将浏览器指向 http://localhost:3001,以使用该演示应用程序。
使用 Node.js 创建一个 REST API
要使用 Node.js 构建我们的 Watson Films REST API,我们将使用以下两个模块:Express.js 和 Request。之前我们已介绍如何使用 npm install 安装这两个模块。
第 1 步. 公开 REST API
我们的 REST API 很简单。它仅包含一个资源 /question。向 /question 发出 POST 请求时,业务逻辑通过 QAAPI 调用 Watson。
通过几行简单的 Node 代码,来自 app.js 的以下代码段定义了我们的问题资源,创建并启动了 Web 服务器。
清单 1. 定义问题资源
// Get access to our Watson modulevar watson = require('./watson/watson');// Set up RESTful resources// POST requests to /question are handled by 'watson.question'app.post('/question', watson.question);// Start the http serverhttp.createServer(app).listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port')); 第 2 步. 调用 Watson QAAPI
在上一节中,我们为向 /question 发出的所有 POST 请求设置了一个处理函数。这个处理函数在一个名为 watson 的简单 Node 模块中定义。文件 watson/watson.js 负责通过 QAAPI 调用 Watson。
清单 2. 通过 QAAPI 调用 Watson
// Describe the Watson Endpoint// Specify the information and credentials pertinent to your Watson instancevar endpoint = { // enter watson host name; for example: 'http://www.myhost.com' host : '', // enter watson instance name; for example: '/deepqa/v1/question' instance : '', // enter auth info; for example: 'Basic c29tZXVzZXJpZDpzb21lcGFzc3dvcmQ=' auth : ''};// Handler for /question POST requests// Submits a question to Watson via the IBM Watson QAAPI// and returns the QAAPI response.exports.question = function(req, res) { if (!endpoint.host) { res.send(404, 'Watson host information not supplied.'); } var uri = endpoint.host + endpoint.instance; var request = require("request"); // Form a proper Watson QAAPI request var questionEntity = { "question" : { "evidenceRequest" : { // Ask Watson to return evidence "items" : 5 // Ask for five answers with evidence }, "questionText" : req.body.question // The question } }; console.log('Ask Watson: ' + req.body.question + ' @ ' + uri); // Invoke the IBM Watson QAAPI Synchronously // POST the questionEntity and handle the QAAPI response request({ 'uri' : uri, 'method' : "POST", 'headers' : { 'Content-Type' : 'application/json;charset=utf-8', 'X-SyncTimeout' : 30, 'Authorization' : endpoint.auth }, 'json' : questionEntity, }, function(error, response, body) { // Return the QAAPI response in the entity body res.json(body); });}
那么此代码有何用途?首先,它导出 question 函数(我们的处理函数),以便可从 app.js 访问该函数。question 函数接受两个参数:请求req 和响应 res。
请求 req 应是包含问题文本的字符串。question 字符串然后用于创建一个符合 QAAPI JSON Request and Response 模型的适当的 Watson QAAPI 问题请求。
最后,question 函数使用 request 模块同步调用 Watson QAAPI,“按原样” 返回响应。