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
方法来“捕获”这个错误信息,以备调试或后期优化。
进一步了解“艾娃”
如果内置的“艾娃”方法,其功能不能满足你的需求,你还可以扩展“艾娃”的功能。“艾娃”的功能扩展,也是非常容易的。我们知道,所有预定义的“意图”和“行动”,其实都是一些具有固定特征的函数。所以,只要你遵循的函数的输入接口标准,就可以轻松地创建属于自己的“艾娃”,详见文档说明。如果你想了解更多有关“艾娃”信息,请看看相关的维基信息。
千里之行,始于足下。“大白”也不是一日构建起来的。现在的“艾娃”可能看起来还比较幼稚,但正是因为如此,才更加期待你的参与,只有这样,“艾娃”的成长,才会更加茁壮。
译者介绍:张玉宏,著有《品味大数据》一书
本文标签: 嗨,我是艾娃,如果对我的服务满意,请点赞!跨领域虚拟助理是如何构造的
版权声明:本文标题:嗨,我是艾娃,如果对我的服务满意,请点赞!——跨领域虚拟助理是如何构造的?... 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732361668h1535390.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论