在前兩課的基礎上,建立兩個意圖,實作意圖間的參數傳遞,實作一個多意圖關聯的語音技能,線上測試将對話界面進行截圖。
我們實作了一個簡單的查詢天氣的功能,這節課我們來建立一個空氣品質查詢的意圖,并學習一下如何将空氣品質意圖與上節課建立的天氣查詢意圖進行關聯,了解兩個意圖間如何進行參數傳遞,實作意圖間的切換。可以為跨意圖的對話提供更加流暢的效果。
配置天氣品質查詢意圖
建立一個空氣品質 意圖。
可選:
和天氣查詢意圖一樣,為了防止使用者在日常語音互動過程中很有可能沒有說出想要查詢 的城市或者日期,導緻語音互動識别過程中缺少必要的參數,我們要為空氣品質查詢意圖設定參數追問來補全一些必要的資訊,以便技能為使用者提供精确的服務;
在系統預設實體值字段中,為時間參數配置預設參數為今天,為城市參數配置精靈追問為“您要查詢哪個城市的空氣品質?”。
配置多輪對話語料,并把明天和北京分别進行标注,明天标注為時間實體,北京标注為城市實體。
配置前置意圖
這樣配置完後,我們一個最簡單的意圖關聯和參數傳遞就完成了。簡單來說,空氣品質查詢的意圖可以用我們天氣查詢意圖的city參數放到空氣品質查詢的city參數中。
儲存意圖:
開發部署後端服務
示例代碼:
package com.alibaba.ailabs;
import com.alibaba.ailabs.common.AbstractEntry;
import com.alibaba.da.coin.ide.spi.meta.AskedInfoMsg;
import com.alibaba.da.coin.ide.spi.meta.ExecuteCode;
import com.alibaba.da.coin.ide.spi.meta.ResultType;
import com.alibaba.da.coin.ide.spi.standard.ResultModel;
import com.alibaba.da.coin.ide.spi.standard.TaskQuery;
import com.alibaba.da.coin.ide.spi.standard.TaskResult;
import com.alibaba.fastjson.JSON;
import com.aliyun.fc.runtime.Context;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description 天貓精靈技能函數入口,FC
* handler:com.alibaba.ailabs.GenieEntry::handleRequest
* @Version 1.0
**/
public class GenieEntry extends AbstractEntry {
@Override
public ResultModel<TaskResult> execute(TaskQuery taskQuery, Context context) {
context.getLogger().info("taskQuery: " + JSON.toJSONString(taskQuery));
// ResultModel<TaskResult> res = new ResultModel<>();
TaskResult taskResult = new TaskResult();
// 從請求中擷取意圖參數以及參數值
Map<String, String> paramMap = taskQuery.getSlotEntities().stream().collect(Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getOriginalValue()));
//處理名稱為 welcome 的意圖
if ("welcome".equals(taskQuery.getIntentName())) {
taskResult.setReply("歡迎使用天氣小蜜,使用小蜜可以查詢天氣喲");
//處理名稱為 weather 的意圖
} else if ("weather".equals(taskQuery.getIntentName())) {
//weather 意圖中 date 參數勾選了必選,請求資料中一定會攜帶 date 參數,隻需要判斷 city 參數有沒有。
if (paramMap.get("city") == null) {
taskResult.setReply("您要查詢哪個城市的天氣?");
return askReply(taskResult, "city", taskQuery.getIntentId());
}
//TODO 根據參數擷取天氣資訊,這裡使用假資料替代
taskResult.setReply(paramMap.get("city") + paramMap.get("sys.date(公共實體)") + "天氣 晴");
//處理名稱為 queryAirQuality 的意圖
}else if ("queryAirQuality".equals(taskQuery.getIntentName())) {
//queryAirQuality 意圖中 date 參數勾選了必選,請求資料中一定會攜帶 date 參數,隻需要判斷 city 參數有沒有。
taskResult.setReply("您要查詢哪個城市的空氣品質?");
//TODO 根據參數擷取空氣品質資訊,這裡使用假資料替代
taskResult.setReply(paramMap.get("city") + paramMap.get("sys.date(公共實體)") + "空氣品質 優");
//其他意圖
}else {
taskResult.setReply("請檢查意圖名稱是否正确,或者新增的意圖沒有在代碼裡添加對應的處理分支。");
}
return reply(taskResult);
}
/**
* 結束對話的回複,回複後音箱閉麥
*/
private ResultModel<TaskResult> reply(TaskResult taskResult) {
ResultModel<TaskResult> res = new ResultModel<>();
taskResult.setExecuteCode(ExecuteCode.SUCCESS);
taskResult.setResultType(ResultType.RESULT);
res.setReturnCode("0");
res.setReturnValue(taskResult);
return res;
}
* 指定追問參數,音箱自動開麥,使用者的回答優先比對追問的參數
private ResultModel<TaskResult> askReply(TaskResult taskResult, String parameterName, Long intentId) {
taskResult.setResultType(ResultType.ASK_INF);
AskedInfoMsg askedInfoMsg = new AskedInfoMsg();
askedInfoMsg.setIntentId(intentId);
askedInfoMsg.setParameterName(parameterName);
List<AskedInfoMsg> askedInfos = new ArrayList<>();
askedInfos.add(askedInfoMsg);
taskResult.setAskedInfos(askedInfos);
}
完成代碼編寫後,要把代碼送出到倉庫中,不然再進來就沒有了,送出步驟:點選源代碼管理,然後點選送出按鈕;送出完成後要選擇部署環境,打開 CloudIDE 左側的 部署調試插件,進入到部署面闆,選擇預發環境進行部署。
測試
參考文檔:
https://aligenie.com/doc/20255408/ugw88c