通过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("请检查意图名称是否正确,或者新增的意图没有在代码里添加对应的处理分支。")
代码还有许多需要优化修改的地方,主要是学习掌握,意图之间的参数传递等知识点。