跨領域虛擬助理是如何構造的?一言不合,自己就可造個智能助理!

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入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。

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!