通過5天的學習,基本了解天貓精靈技能開發的流程,先總結一些知識點,然後做一個小demo,作為結營作業
一、名詞解釋
1、意圖
意圖(Intent)是自定義技能中提供功能的載體,是以在建立意圖時需要明确此意圖提供什麼樣的功能。
測試的時候可以看到意圖示識,判斷測試效果
2、實體
設定實體是為了告訴平台算法,當從使用者語句中解析參數時,參數的取值範圍是什麼。
一般選擇公共實體,阿裡這邊已經做了很多預先設定,比如時間,城市,數字等等
測試的時候可以看到參數,判斷測試效果
3、前置意圖
這是用來做參數傳遞的
二、一些坑
1、背景編輯時,要主要參數名詞和平台設定的一緻性,有些自動配置的公共變量有括号,括号也要帶進來
2、如果要設定為前置意圖的參數,那名詞中不能帶.不然是不能傳遞的
三、知識庫
技能開發平台——文檔中心
輸入關鍵字搜尋,在下拉菜單中選擇即可demo:購物清單中物品的價格查詢
一、登入,進入控制台,建立新技能
二、利用模闆快速開發
點選後端服務,點選建立應用,關聯阿裡雲開發賬戶
語言選擇python,模闆選擇地理小百科,點選建立
三、編輯意圖
等待一下,來到語言互交模型,發現意圖已經自動幫我建立好了
點選左側的實體,建立一個自定義實體,如圖
回到意圖,編輯歡迎意圖
設定好之後,送出
在上一條和下一條意圖中,增加前置意圖,設定好參數
四、編輯背景代碼
點選代碼編輯、前往ide開發
進入阿裡雲開發平台
點選右下角的終端,輸入pip install requests 安裝子產品
代碼如下
import logging
import json
import base64
import random
import collections
import requests
USER_MAP = {}
KNOWLEDGE = [
"大米",
"餐巾紙",
"衛生紙",
"醬油"
]
KNOWLEDGEJJDid = [
"4592915",
"100015114144",
"1082266",
"100006624003"
]
def jdprice(l_index):
#京東
URL ='https://p.3.cn/prices/mgets?skuIds='+KNOWLEDGEJJDid[l_index]
headers = {
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36',
'Cookie': '',
'Connection': 'keep-alive',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Host': 'p.3.cn',
'Referer': 'https://book.jd.com/booktop/0-0-0.html?category=1713-0-0-0-10001-1'
}
res = requests.get(URL,headers=headers)
jdp=json.loads(res.text)
return jdp[0]['p']
KNOWLEDGEJTB = [
"55.3",
"60",
"56.9",
"100006624003"
]
def tbprice(l_index):
return KNOWLEDGEJTB[l_index]
KNOWLEDGEJPDD = [
"4592915",
"100015114144",
"1082266",
"100006624003"
]
def pddprice(l_index):
return KNOWLEDGEJPDD[l_index]
def pricecx(l_index,maket):
if maket=='京東':
return jdprice(l_index)
if maket=='淘寶':
return tbprice(l_index)
if maket=='拼多多':
return pddprice(l_index)
#print(pricecx(0,'淘寶'))
def common_reply(reply, result_type):
response = {
"isBase64Encoded": "false",
"statusCode": "200",
"headers": {"content-type": "application/json"},
"body": {
"returnCode": "0",
"returnErrorSolution": "",
"returnMessage": "",
"returnValue": {
"reply": reply,
"resultType": result_type,
"executeCode": "SUCCESS",
"msgInfo": "",
}
}
}
return response
# 未指定追問參數,音箱自動開麥,使用者的回答可跳轉到其它意圖
def ask_reply(reply):
return common_reply(reply, 'ASK_INF')
# 結束對話的回複,回複後音箱閉麥
def result_reply(reply):
return common_reply(reply, 'RESULT')
def handler(event, context):
request = json.loads(event)
logger = logging.getLogger()
body = base64.b64decode(request['body']).decode()
data = json.loads(body)
maket=data['slotEntities'][0]['originalValue']
logger.info('request body:' + body)
# 從請求中擷取意圖參數以及參數值
intent_name = data['intentName']
user_id = getattr(data['requestData'], 'userOpenId', 'testUser')
global USER_MAP
linked_list = USER_MAP.get(user_id)
# 歡迎意圖 或 使用者緩存資料為空
if intent_name == "welcome" or linked_list is None:
linked_list = collections.deque()
random_index = random.randint(0, len(KNOWLEDGE) - 1)
linked_list.append(random_index)
USER_MAP[user_id] = linked_list
return ask_reply(KNOWLEDGE[random_index]+'在'+maket+'平台的價格是'+pricecx(random_index,maket))
# 下一個意圖,随機選擇一個内容回複,并将index追加到使用者資料的List集合最後
elif intent_name == "next":
random_index = random.randint(0, len(KNOWLEDGE) - 1)
linked_list.append(random_index)
USER_MAP[user_id] = linked_list
return ask_reply(KNOWLEDGE[random_index]+'在'+maket+'平台的價格是'+pricecx(random_index,maket))
# 上一個意圖,将使用者資料的List集合中最後一個index移除,并傳回該index的内容。首先要判斷集合内是否有元素,沒有則不需要移除
elif intent_name == "prev":
if len(linked_list) > 0:
linked_list.pop()
if len(linked_list) == 0:
return ask_reply("這已經是第一個了。")
return ask_reply(KNOWLEDGE[linked_list[len(linked_list) - 1]] +'在'+maket+'平台的價格是'+pricecx(linked_list[len(linked_list) - 1],maket))
# 退出意圖,清除使用者緩存
elif intent_name == "exit":
USER_MAP.pop(user_id)
return result_reply("已為您退出,再見。")
return result_reply("請檢查意圖名稱是否正确,或者新增的意圖沒有在代碼裡添加對應的處理分支。")
代碼還有許多需要優化修改的地方,主要是學習掌握,意圖之間的參數傳遞等知識點。