admin 管理员组

文章数量: 887006

嗨,我是艾娃,如果对我的服务满意,请点赞!——跨领域虚拟助理是如何构造的?...

导语:看过电影《超能陆战队(Big Hero 6)》的朋友,想必对那个健康助手机器人——大白(Baymax)印象深刻吧?这里,也有一款很酷的智能助手——艾娃(AWA),其全名为“跨领域虚拟助理”(Agnostic Virtual Assistant,AWA)。如果说大白还是一个虚幻的角色,那么“艾娃”则是一个真实的、在研的、你我都能参与的开源项目。如果你也想开发一个类似于大白的智能助手,那么“艾娃”这个项目,就是一个绝佳的练手机会(至少让你知道“猪”是怎么跑的)。


以下为“艾娃”项目说明文档部分编译内容,读者朋友可点击此处查看原文。


“艾娃”项目的主要目的在于,为任意领域辅助创建一个聪慧的、快速反映的虚拟助手。这是一个基于NodeJS的开源项目,任何对此项目感兴趣的人,都可以出点力、发点热,让“艾娃”愈发聪明、贴心。

如今,已有很多智能助手,渗透于我们的工作和生活之中。在未来几年,这样的趋势,将会愈发明显。我们知道,在本质上,这些助手,都是一些应用程序,依靠人工智能引擎,协助人类便捷地完成某类工作。

很显然,在未来,人们会越来越少利用点击/动作(click/action),来操控这类智能程序,而更多的是,利用对话式(conversational)的交互,来表明自己的目的。出于这个原因,“艾娃”项目就是为了创建一个跨领域的和可重用的系统,以帮助开发者创建任意领域的虚拟助理。

关于语言处理的小故事...以及“艾娃”是如何工作的?

如果你还从没跟虚拟助理/机器人打过交道,那么你需要了解一点这类智能程序的基本运行模式,通常来说,它需要分析一个给定的输入(通常是一句话),然后给出一个语义值(即它的理解和反应)。

要做到这一点,不可避免地,我们要用到自然语言处理(Natural Language Processing,NLP)技术,“艾娃”利用NLP技术,结合上下文场景,做出必要反应。例如,你给“艾娃”下一个指令:

"I need an appointment with the dentist tomorrow at 2pm in London"(明天下午在伦敦我需要预约一个牙医)

为了理解这句话的内涵,“艾娃”就需要为这句话创建一个分析场景,例如:

主语:我(I)

行为:需要(need)

:1

宾语:预约(appointment)

项目:牙医(the dentist)

何时:周五2016年6月11日14:00:00

位置:伦敦(London)

“艾娃”据此给出一个上下文信息:

语言=英语(EN)

类型=陈述句

情绪=0(中性)

分类器=/旅游/过境

特征文件:如果当前用户以前与“艾娃”聊过,则返回聊天记录

“艾娃”的行为取向,自然取决于“构造者”的设置。接下来的一步是,处理“构造者”设置的所有意图。所谓意图呢,无非就是在理解场景(句子要素之间的关系)和上下文信息基础上,给出一系列的规则。例如:

有位置信息吗?是的,伦敦

是负面情绪吗?不,是中性的

知道在什么时候吗?是的,明天下午2点以后

如果上下文理解是成功的,那么意图就显而易见了。它会落实为一个或多个行为,这些行为,将以应答的模式,反馈给用户。例如说,“艾娃”会自动做到:

•在$ { LOCATION}$ {DATE}和${ITEM}为要素,自动在用户的手机日历中设置预约。

以$开头并以花括号括起来的是变量,在这里,它们分别是伦敦、2016年6月11日14:00:00、牙医

请注意,在手机日历中设置预约,是“艾娃”在正确理解语意的基础上的自主行为,否则“智能”何以体现?

有点心动吧?心动不如行动,接下来,我们要做到的就是——

安装“艾娃”

“艾娃”(AVA)是可以用npm来安装(注:NPM全称为node package manager,是随同NodeJS一起安装的包管理工具):

 
$ npm install --save ava-ia

“艾娃”的基本用法,读者可以参阅该项目文档说明,下面我们简要介绍有关“艾娃”的2个重要的实例方法。

“艾娃”中的实例方法

intent()

在“艾娃”中,第一个重要的方法就是intent(),intent意为“意图”,顾名思义,这种方法的目的,就是教懂“艾娃”,以用什么样的形式来答复你。如前文介绍,“艾娃”的核心部分,就是由若干“意图”(intents)和“行为”(Actions)构成的。在实现上,这些“意图”和“行为”,实质上,都是一些是简单的函数,它们接收状态参数,通过“运算”,然后据此给出一个内部反应。

intent方法是可链接的(chainable),这意味着,你可以将所有你要表达的意图,层层附加起来。意图越多,遇事时,“艾娃”就会有为多元的表现,看起来就会更聪明。intent方法通常需要两个参数:

  • intent: 想要链接的函数
  • actions: 行为函数(或者行为函数数组),当“意图”被充分理解后,这些函数就会被调用。

现在举例如下:

import { weather } from `ava-ia/lib/intents`;
import { forecastYahoo } from `ava-ia/lib/actions`;ava.intent(weather, forecastYahoo);

上面代码前两行的功能是,分别从“意图库”导入“天气”,从“行为库”导入“雅虎天气预报”然后第三行代码是用“(天气,雅虎天气预报)”作为参数对,形成intent方法:ava.intent(weather, forecastYahoo)。

如果我们想把同一个intent方法,附加两个行为(action),也非常简单,仅仅需要导入新的行为库,然后在行为参数里用方括号[]将多个“行为”,以逗号“,”隔开,形成一个“行为”数组即可,如下所示:


import { forecastYahoo, forecastMSN } from `ava-ia/lib/actions`;ava.intent(weather, [forecastYahoo, forecastMSN]);

  单一方案,不存在抉择。 那么倘若有多个行为方案呢,又该如何抉择呢,就要看哪个行为反应快了。比如说,上面的代码中,在了解天气“意图”中,有两个行为方案:来自雅虎的天气预报和有来自MSN的天气预报,采取何种行为,这就要看雅虎和MSN哪个网站响应的快了!

 

如果你想创建一系列的“意图(intent)”方法,这也非常方便,你需要做的就是导入更多的“意图”库和“行为”库,然后通过“.”操作,追加更多(意图,行为)对,如下所示:


import { weather, movie } from `ava-ia/lib/intents`;
import { forecastYahoo, movieDB } from `ava-ia/lib/actions`;ava.intent(weather, forecastYahoo).intent(movie, movieDB);

listen()

第二个比较重要的方法就是listen()了。这个方法的目的就是,想办法和“艾娃”交谈,让它能听懂我们的话。

listen()方法接收的是一个字符串(string)参数,输出的就是一个“意愿”(Promise),如下所示:

 
ava.listen('Do you know if tomorrow will rain in Bangkok?').then(state => console.log(state)).catch(error => console.log(state)) 


如果“意愿”得以成功描述,那么将返回一个包括若干状态(state)的对象,这些状态包含了意图的结果。这些状态属性包括:

  • rawSentence(原句):原始句子的字符串。
  • language(语言):原始句子的符合ISO(CCA2)语言规范的字符编码。
  • sentence(句子):原始句子字符串的英文翻译版
  • taxonomy(分类):如果配置文件config.json 包含了AlchemyAPI 编码,则有此项。这套编码包括了一个有关分类的数组
  • classifier分类器):包含一个单词数组,以确定句子的意义。
  • type(类型):句子有三种类型:陈述句、疑问句或感叹句。
  • Topics主题):一个数组,包含判断句子主旨的最重要的单词
  • Tokens令牌):包含一个根词的数组。
  • 关系(relations):描述一个句子中各个对象之间的关系:
    • 主语
    • 副词
    • 行为
    • 宾语
    • 何时
    • 位置
  • sentiment(情绪):一个描述情绪的数值(-5为最消极,0表示中性,+5为最积极)。

一个对象的最重要状态,莫过于它的“行为(action)”,这个“行为”对象包括如下属性:

  • engine(引擎): 一个字符串,表明“行为”的名称。
  • ms毫秒: 一个数字,描述获取一个可用行为的毫秒数。
  • entity(实体): 一个字符串,用以描述行为的内容
  • title(标题): 一个字符串
  • text(文本)一个字符串(可选)
  • value(值): 一个对象,用以描述有关内容的显式信息(可选)。
  • image(镜像): 一个字符串超级连接(可选)
  • url(超级连接): 一个包括更多信息的超级链接(可选)。
  • related(相关信息): 一个带有额外信息的对象 (可选)。
  • date(日期): 一个日期(可选)

为了防止“艾娃”找不到某个语句适用的“行为”,listen()方法允许返回一个错误信息,然后用catch方法来“捕获”这个错误信息,以备调试或后期优化。

进一步了解“艾娃”

如果内置的“艾娃”方法,其功能不能满足你的需求,你还可以扩展“艾娃”的功能。“艾娃”的功能扩展,也是非常容易的。我们知道,所有预定义的“意图”和“行动”,其实都是一些具有固定特征的函数。所以,只要你遵循的函数的输入接口标准,就可以轻松地创建属于自己的“艾娃”,详见文档说明。如果你想了解更多有关“艾娃”信息,请看看相关的维基信息。

千里之行,始于足下。“大白”也不是一日构建起来的。现在的“艾娃”可能看起来还比较幼稚,但正是因为如此,才更加期待你的参与,只有这样,“艾娃”的成长,才会更加茁壮。


译者介绍:张玉宏,著有《品味大数据》一书

本文标签: 嗨,我是艾娃,如果对我的服务满意,请点赞!跨领域虚拟助理是如何构造的