尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
導語:看過電影《超能陸戰隊(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方法來「捕獲」這個錯誤信息,以備調試或後期優化。
進一步了解「艾娃」
如果內置的「艾娃」方法,其功能不能滿足你的需求,你還可以擴展「艾娃」的功能。「艾娃」的功能擴展,也是非常容易的。我們知道,所有預定義的「意圖」和「行動」,其實都是一些具有固定特徵的函數。所以,只要你遵循的函數的輸入接口標準,就可以輕鬆地創建屬於自己的「艾娃」,詳見文檔說明。如果你想了解更多有關「艾娃」信息,請看看相關的維基信息。
千里之行,始於足下。「大白」也不是一日構建起來的。現在的「艾娃」可能看起來還比較幼稚,但正是因為如此,才更加期待你的參與,只有這樣,「艾娃」的成長,才會更加茁壯。
譯者介紹:張玉宏,著有《品味大數據》一書
更多深度技術內容,請關注雲棲社區微信公眾號:yunqiinsight。