在開始之前,我們應該初步了解一下什麼是 Serverless。
什麼是 Serverless
Serverless 的全稱為 Serverless computing,即無伺服器運算,也被稱為函數即服務(FaaS),是繼 IaaS、PaaS、SaaS 後的一種雲計算模型。它以 PaaS 為基礎提供一個微型的架構,開發者不需要部署、配置、管理伺服器和服務,隻需要将代碼放到 Serverless 空間中運作,即可提供服務,代碼運作所需要的伺服器資源均由雲平台提供。
使用 Serverless,能真正實作免運維和按量(調用量)計費,降低開發難度,節約營運成本。
先立 flag
我要做什麼功能呢,預期的功能如下:
- 歡迎和幫助:簡單的語音互動
- 實況天氣查詢:可以查詢某地(北京、北京朝陽)的天氣情況
- 生活指數查詢:查生活指數、污染指數等
- 吃什麼推薦:選擇困難症晚期使用者剛需
準備
既然需要查詢天氣,肯定是需要接入一個天氣服務 API,這裡我選擇的是
和風天氣 API,免費版的 API 剛剛好可以滿足查天氣和生活指數等内容,而且通過 GET 即可調用,非常友善。
當然既然是開發天貓精靈技能,天貓精靈少不了,這裡我手頭隻有方糖,是以就是他了。
有了 API 和天貓精靈,剩下的就是賬号的事情了,你需要提前到
AliGenie 開發者平台上使用淘寶賬号登入,因為後期要真機調試,為了減少不必要的麻煩,最好使用和天貓精靈綁定的淘寶賬号。登入 AliGenie 平台後記得進行開發者認證~否則你是不能建立技能的。既然要使用阿裡雲開發作為後端,還需要注冊一個
雲開發平台,直接使用阿裡雲賬号登入,第一次使用雲開發平台需要建立一個團隊,在完成團隊建立和同意許可協定之後,即可登入到雲開發平台。

{% note info %}
後端會使用 Node.js 進行開發,如果你對某一種語言熟悉,Node.js 的語言差異并不會成為在實踐中遇到的困難。
Node.js 教程{% endnote %}
開發
基于阿裡雲開發打造天貓精靈技能應用:個人助理(小助手)。對于天貓精靈技能開發,一般開發流程可以抽象成以下幾個步驟。
天貓,當然要吃 🐠🐠🐠 咯~
編寫示例對話
根據文章開頭我立的 flag 編寫示例對話。
- 歡迎和幫助
問題:打開“小助手”
回複:歡迎使用小助手,我現在可以幫你查天氣、查生活指數、解決你中午吃什麼的問題,其他技能正在修煉中。
- 實況天氣查詢
問題:北京海澱的天氣怎麼樣/保定的天氣怎麼樣/保定的天氣如何/北京海澱的天氣如何/幫我查查保定市的天氣/幫我查查北京海澱的天氣
回複:今天{海澱}天氣{晴},溫度{26}攝氏度,體感溫度{25}攝氏度,相對濕度{60},{東南風}{2}級。
- 生活指數查詢
問題:查查杭州的生活指數/杭州生活指數查詢幫我查查杭州的生活指數/北京海澱生活指數查詢/北京生活指數查詢/查查北京海澱的生活指數/查查北京的生活指數/幫我查查北京的生活指數/幫我查查北京海澱的生活指數
回複:今天杭州{天氣不錯,适宜晾曬。趕緊把久未見陽光的衣物搬出來吸收一下太陽的味道吧!}
- 吃什麼推薦
問題:幫我推薦今天晚上吃什麼/幫我推薦今天中午吃什麼/推薦吃什麼給我/幫我推薦吃什麼/幫我推薦今天吃什麼
回複:今天适合吃{肉夾馍}。
梳理互動流程
因為不涉及到多輪對話,整體的互動流程不是很複雜,如下圖。
在 AliGenie 平台配置技能
建立技能
登入 AliGenie 智能應用平台,在應用清單中選擇技能,進入技能清單。點選頁面右上角建立語音技能,開始建立自定義技能。
這裡需要注意的是調用詞,使用者是可以用“天貓精靈+調用詞”來進入技能的,這個調用詞可以不同于技能名稱。
調用詞最好是好記、上口、易識别的詞語,因為測試了幾次,如果是含有同音詞的話,可能會被解析成其他詞語,造成無法識别技能。
完成建立,進入技能基本資訊頁,我們可以看到剛剛建立技能的基本資訊。
語音互動模型
在建立語音互動模型的過程中,你會發現下面幾個詞會一直伴随着你,是以我們應該對他們有一點初步的認識。
- 語料
語料可以了解成使用者對音箱所說的話,比如“天貓精靈,我想查快遞”,這就是一個語料。
- 意圖
意圖是對使用者語音輸入後想要得到的響應的一種抽象,比如說“天貓精靈,我想要查快遞”,我的意圖就是查詢快遞;“天貓精靈,今天天氣怎麼樣”,我的意圖應該就是要查天氣,一種意圖可能有多種表達方式(使用者輸入),我們應該合理設計使用者意圖的對話表達。
- 實體
一種規範的自然語言短語的集合,可以是常用的詞或者一些領域的技術術語,例如“時間”、“地點(省)”、“地點(市)”都是實體。目前 AliGenie 平台提供了公共實體和自定義實體兩種實體類型。
- 參數
包括實體的值、互動時産生的上下文資訊等,在實作回複邏輯時,參數是必要的。
- 回複邏輯
使用者語音輸入後,音箱通過處理,分析出意圖、對應實體解析出參數,通過程式處理後,傳回給音箱。這就是一個回複邏輯。
在有了這些基礎知識之後,我們開始正式建立語音互動模型。
因為在配置意圖時,需要在對話表達中标注實體,是以我們應該先配置實體。通過前期示例對話的設計,我們發現該技能應該有 3 個實體:城市、省份和生活指數。AliGenie 很友好的為一些常用的實體定義了公共實體,例如城市和省份,我們就可以直接引入公共實體。
生活指數實體,需要我們自己定義,根據查詢和風天氣 API 文檔,生活指數可以從以下幾個方面進行查詢(紅色标記是免費 API 可以查詢的指數類型),是以生活指數實體應該包含這些值。
建立實體,配置實體名稱和實體辨別。
配置實體的值,我們可以這樣了解,當使用者表達中包含實體中的某個同義詞時,參數會對應成實體值。并以實體辨別+實體值的形式傳遞給後端。
根據需求,該技能應該有 4 個意圖,其中 1 個是預設意圖,用于引導使用者使用該技能。其他 3 個是自定義意圖,大家可以按照下圖建立意圖。
預設意圖的配置如下圖,隻需要填寫意圖資訊,設定為預設意圖即可。
以實況天氣意圖為例,自定義意圖的配置入下圖。
需要根據前面編寫的示例對話,配置單輪對話表達,并将對話中的實體标注出來,AliGenie 會自動幫你配置出參數。
回複邏輯配置
AliGenie 平台給我們提供了三種回複邏輯,因為要使用雲開發平台作為後端,這裡我們選擇
預設邏輯阿裡雲FaaS
,在操作中設定為預設集合,點選+号展開清單,點選雲開發,進入
。
在阿裡雲開發平台編碼
建立應用
通過回複邏輯配置中的雲開發入口進入雲開發平台會自動建立一個應用。雲開發依賴下面 4 個雲服務,如果你沒有開通這些雲服務,可以點選雲服務對應的連結進行開通。
一切就緒之後,點選開發,進入 CloudIDE。
開發應用
目前通過雲開發平台建立的函數計算環境, Node.js 的運作時是 nodejs6。
雲開發平台 demo 代碼功能是做回顯用的,就是說你說什麼,天貓精靈就會回複你什麼。我們可以參考一下 demo 代碼。
整個後端應用的入口檔案是 index.js,同時這個檔案也負責分發群組織意圖,記得把申請到的和風天氣 API 寫在這個檔案裡。
// 意圖
const intentHandlers = require("./intent");
// 和風天氣API KEY
global.key = "XXXXXXXXXXXXXXXXXXXXXXXX";
//雲函數處理入口
module.exports.handler = function (event, context, callback) {
try {
event = JSON.parse(event);
let strBody = event.isBase64Encoded
? new Buffer(event.body, "base64").toString()
: event.body;
let skillReqParams = JSON.parse(strBody);
let { intentName } = skillReqParams;
// 分發群組織意圖
let intentHandler = intentHandlers[intentName];
// 意圖處理結果
let result = intentHandler(skillReqParams);
// 構造傳回
let response = {
isBase64Encoded: false,
statusCode: "200",
headers: {
"content-type": "application/json",
},
body: result,
};
callback(null, response);
} catch (err) {
callback(err);
}
};
我們需要建立一個檔案夾叫 intent,用于存放各種意圖相應的處理程式,這裡的 index.js 檔案定義了都有哪些意圖。
const welcome = require("./welcome");
const weather_now = require("./weather_now");
const lifestyle = require("./lifestyle");
const eat = require("./eat");
module.exports = {
welcome,
weather_now,
lifestyle,
eat,
};
intent 檔案夾中的意圖處理程式的檔案名應該和 AliGenie 平台側配置的意圖名稱保持一緻。
以處理實況天氣這個意圖為例進行代碼編寫。首先在 intent 檔案夾中建立 weather_now.js 檔案。
const urlencode = require("urlencode");
const request = require("urllib-sync").request;
function getHeWeather(slotEntities) {
// 處理地理位置資訊
let location = "";
let res = "";
for (let i = slotEntities.length - 1; i >= 0; i--) {
location +=
slotEntities && slotEntities[i] ? slotEntities[i].slotValue : "";
if (i != 0) {
location += ",";
}
}
// 查詢天氣,處理結果
let api =
"https://free-api.heweather.net/s6/weather/now?location=" +
urlencode(location) +
"&key=" +
key;
let weatherData = request(api);
if (weatherData.status == 200) {
weatherData = JSON.parse(weatherData.data);
weatherData = weatherData.HeWeather6[0];
res = `和風天氣,專業的天氣資料服務,今天${weatherData.basic.location}天氣${weatherData.now.cond_txt},溫度${weatherData.now.tmp}攝氏度,體感溫度${weatherData.now.fl}攝氏度,相對濕度${weatherData.now.hum},${weatherData.now.wind_dir}${weatherData.now.wind_sc}級。` ;
}
return res;
}
module.exports = function (request) {
let { skillName, intentName, slotEntities } = request;
let reply = "<NULL>";
try {
reply = getHeWeather(slotEntities);
} catch (err) {
reply = "擷取目前天氣狀态時出現異常,建議您稍後再試。" + err;
}
return {
returnCode: "0",
returnErrorSolution: "",
returnMessage: "",
returnValue: {
reply: reply,
resultType: "RESULT",
executeCode: "SUCCESS",
msgInfo: "",
},
};
};
最後我們的工程結構應該是這個樣子的。
完整代碼我放到了 GitHub 中,可以自行下載下傳:
連結部署與測試
完成編碼,把代碼推送至線上運作環境,即可完成與 AliGenie 平台的對接。
将代碼部署到線上
阿裡雲開發平台為我們提供了 3 套運作環境,分别為日常環境、預發環境和線上環境,友善開發者進行藍綠釋出。我們直接将代碼發到線上環境就好了。
點選部署,CloudIDE 将自動打包上傳。
如圖,即已經完成部署。
線上調試
部署完成,我們先進行一下線上調試。
回到 AliGenie 平台,進入技能,點選測試,選擇線上測試。将示例對話作為測試用例進行測試,每次測試的傳回都包括識别意圖、參數、傳回狀态和傳回内容四部分。
真機調試
線上調試已經沒有問題了,我們馬上進入真機測試。選擇真機測試 TAB,開啟真機測試。
在AliGenie開發文檔中提到“真機調試需要綁定裝置”,目前真機調試已經不需要進行裝置綁定了, 隻要是這個開發者淘寶賬号配網的天貓精靈裝置都可以測試這個技能。
對音箱說示例對話,觀察音箱的回複是否為預期回複,如果是預期回複,恭喜你,你的天貓精靈技能修煉成功啦。同時歡迎你繼續擴充天貓精靈的技能~~
示範
因為視訊稽核的原因,暫時視訊放在了 CODING 檔案分享上。
示範視訊連結後期會補充 B 站連結。
trouble shooting
我們應該具有一定的錯能力,下面是 trouble shooting 部分。
如何抓 log
我們在進行線上測試時,有時候會遇到接口錯誤的問題,不傳回任何資訊,直接報 IDE Error,我們可以借助阿裡雲函數計算的日志服務進行排錯。
打開阿裡雲控制台,選擇函數計算産品,進入函數計算控制台,在服務/函數頁籤找到對應的函數,進入函數。
函數服務有地域屬性,如果你找不到自動建立的雲函數,請檢視是否選擇了正确的地域。
點選日志查詢後選擇進階查詢,勾選要查詢的時間段,例如一分鐘内,或者一個自定義的時間段,點選查詢分析按鈕。
我刷藍色字型的部分就是儲存,可以參考進行排錯。
為什麼我的精靈不聽話
使用同樣的測試用例進行線上測試和真機測試,結果卻截然不同。真機測試時,有時候精靈并不能有效響應我們的意圖,這是為什麼呢?
我們可以打開天貓精靈 APP,選擇消息,打開裝置對話檢視使用者輸入的識别結果是否正确。
例如我有一個應用叫
和風天氣
,我對天貓精靈說
天貓精靈,打開和風天氣
,而精靈卻識别成了
盒風天氣
,當然傳回的結果就出錯。
參考文獻
作者: 小談談
連結:
https://www.txisfine.cn/archives/3ffcdbbe.html來源: 彈霄博科,已授權阿裡雲開發者社群轉載。