天天看點

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

通過5天的學習,基本了解天貓精靈技能開發的流程,先總結一些知識點,然後做一個小demo,作為結營作業

一、名詞解釋

1、意圖

意圖(Intent)是自定義技能中提供功能的載體,是以在建立意圖時需要明确此意圖提供什麼樣的功能。

測試的時候可以看到意圖示識,判斷測試效果

2、實體

設定實體是為了告訴平台算法,當從使用者語句中解析參數時,參數的取值範圍是什麼。

一般選擇公共實體,阿裡這邊已經做了很多預先設定,比如時間,城市,數字等等

測試的時候可以看到參數,判斷測試效果

3、前置意圖

這是用來做參數傳遞的

二、一些坑

1、背景編輯時,要主要參數名詞和平台設定的一緻性,有些自動配置的公共變量有括号,括号也要帶進來

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

2、如果要設定為前置意圖的參數,那名詞中不能帶.不然是不能傳遞的

三、知識庫

技能開發平台——文檔中心

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢
輸入關鍵字搜尋,在下拉菜單中選擇即可
AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

demo:購物清單中物品的價格查詢

一、登入,進入控制台,建立新技能

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

二、利用模闆快速開發

點選後端服務,點選建立應用,關聯阿裡雲開發賬戶

語言選擇python,模闆選擇地理小百科,點選建立

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

 三、編輯意圖

等待一下,來到語言互交模型,發現意圖已經自動幫我建立好了

點選左側的實體,建立一個自定義實體,如圖

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

 回到意圖,編輯歡迎意圖

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

設定好之後,送出

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

在上一條和下一條意圖中,增加前置意圖,設定好參數

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢
AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

 四、編輯背景代碼

點選代碼編輯、前往ide開發

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

 進入阿裡雲開發平台

點選右下角的終端,輸入pip install requests 安裝子產品

AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

 代碼如下

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("請檢查意圖名稱是否正确,或者新增的意圖沒有在代碼裡添加對應的處理分支。")      
AI語音技能雲開發(天貓精靈技能)學習筆記之二demo:購物清單中物品的價格查詢

代碼還有許多需要優化修改的地方,主要是學習掌握,意圖之間的參數傳遞等知識點。

繼續閱讀