阿里云云开发平台x天猫精灵:打造天猫精灵个人助理Skill

简介: 各大厂商都在推自己的 Serverless 方案,今天通过一个天猫精灵技能开发来试水一下阿里云的云开发平台,整个流程走下来,不是很复杂,给我的感觉是通过阿里云开发平台开发天猫精灵技能,减轻了开发者部署后端和配置后端的环境,整个过程流畅,甚至不需要 IDE,通过浏览器就可以完成,极大降低了上手难度,是不是很神奇。

在开始之前,我们应该初步了解一下什么是 Serverless。

什么是 Serverless

Serverless 的全称为 Serverless computing,即无服务器运算,也被称为函数即服务(FaaS),是继 IaaS、PaaS、SaaS 后的一种云计算模型。它以 PaaS 为基础提供一个微型的架构,开发者不需要部署、配置、管理服务器和服务,只需要将代码放到 Serverless 空间中运行,即可提供服务,代码运行所需要的服务器资源均由云平台提供。
使用 Serverless,能真正实现免运维和按量(调用量)计费,降低开发难度,节约运营成本。

先立 flag

我要做什么功能呢,预期的功能如下:

  • 欢迎和帮助:简单的语音交互
  • 实况天气查询:可以查询某地(北京、北京朝阳)的天气情况
  • 生活指数查询:查生活指数、污染指数等
  • 吃什么推荐:选择困难症晚期用户刚需

准备

既然需要查询天气,肯定是需要接入一个天气服务 API,这里我选择的是和风天气 API,免费版的 API 刚刚好可以满足查天气和生活指数等内容,而且通过 GET 即可调用,非常方便。
当然既然是开发天猫精灵技能,天猫精灵少不了,这里我手头只有方糖,所以就是他了。
有了 API 和天猫精灵,剩下的就是账号的事情了,你需要提前到 AliGenie 开发者平台上使用淘宝账号登录,因为后期要真机调试,为了减少不必要的麻烦,最好使用和天猫精灵绑定的淘宝账号。登录 AliGenie 平台后记得进行开发者认证~否则你是不能创建技能的。既然要使用阿里云开发作为后端,还需要注册一个云开发平台,直接使用阿里云账号登录,第一次使用云开发平台需要创建一个团队,在完成团队创建和同意许可协议之后,即可登录到云开发平台。

20200508000927

20200508000944

{% note info %}
后端会使用 Node.js 进行开发,如果你对某一种语言熟悉,Node.js 的语言差异并不会成为在实践中遇到的困难。Node.js 教程
{% endnote %}

开发

基于阿里云开发打造天猫精灵技能应用:个人助理(小助手)。对于天猫精灵技能开发,一般开发流程可以抽象成以下几个步骤。

AliGenie-skill

天猫,当然要吃 🐠🐠🐠 咯~

编写示例对话

根据文章开头我立的 flag 编写示例对话。

  • 欢迎和帮助

问题:打开“小助手”
回复:欢迎使用小助手,我现在可以帮你查天气、查生活指数、解决你中午吃什么的问题,其他技能正在修炼中。

  • 实况天气查询

问题:北京海淀的天气怎么样/保定的天气怎么样/保定的天气如何/北京海淀的天气如何/帮我查查保定市的天气/帮我查查北京海淀的天气
回复:今天{海淀}天气{晴},温度{26}摄氏度,体感温度{25}摄氏度,相对湿度{60},{东南风}{2}级。

  • 生活指数查询

问题:查查杭州的生活指数/杭州生活指数查询帮我查查杭州的生活指数/北京海淀生活指数查询/北京生活指数查询/查查北京海淀的生活指数/查查北京的生活指数/帮我查查北京的生活指数/帮我查查北京海淀的生活指数
回复:今天杭州{天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!}

  • 吃什么推荐

问题:帮我推荐今天晚上吃什么/帮我推荐今天中午吃什么/推荐吃什么给我/帮我推荐吃什么/帮我推荐今天吃什么
回复:今天适合吃{肉夹馍}。

梳理交互流程

因为不涉及到多轮对话,整体的交互流程不是很复杂,如下图。

20200508092748

在 AliGenie 平台配置技能

创建技能

登录 AliGenie 智能应用平台,在应用列表中选择技能,进入技能列表。点击页面右上角创建语音技能,开始创建自定义技能。

20200508093620

20200508093545

这里需要注意的是调用词,用户是可以用“天猫精灵+调用词”来进入技能的,这个调用词可以不同于技能名称。
{% note info %}
调用词最好是好记、上口、易识别的词语,因为测试了几次,如果是含有同音词的话,可能会被解析成其他词语,造成无法识别技能。
{% endnote %}

20200508093836

完成创建,进入技能基本信息页,我们可以看到刚刚创建技能的基本信息。

语音交互模型

在建立语音交互模型的过程中,你会发现下面几个词会一直伴随着你,所以我们应该对他们有一点初步的认识。

  • 语料

语料可以理解成用户对音箱所说的话,比如“天猫精灵,我想查快递”,这就是一个语料。

  • 意图

意图是对用户语音输入后想要得到的响应的一种抽象,比如说“天猫精灵,我想要查快递”,我的意图就是查询快递;“天猫精灵,今天天气怎么样”,我的意图应该就是要查天气,一种意图可能有多种表达方式(用户输入),我们应该合理设计用户意图的对话表达。

  • 实体

一种规范的自然语言短语的集合,可以是常用的词或者一些领域的技术术语,例如“时间”、“地点(省)”、“地点(市)”都是实体。目前 AliGenie 平台提供了公共实体和自定义实体两种实体类型。

  • 参数

包括实体的值、交互时产生的上下文信息等,在实现回复逻辑时,参数是必要的。

  • 回复逻辑

用户语音输入后,音箱通过处理,分析出意图、对应实体解析出参数,通过程序处理后,返回给音箱。这就是一个回复逻辑。

在有了这些基础知识之后,我们开始正式创建语音交互模型。

实体

因为在配置意图时,需要在对话表达中标注实体,所以我们应该先配置实体。通过前期示例对话的设计,我们发现该技能应该有 3 个实体:城市、省份和生活指数。AliGenie 很友好的为一些常用的实体定义了公共实体,例如城市和省份,我们就可以直接引入公共实体。

20200508113256

生活指数实体,需要我们自己定义,根据查询和风天气 API 文档,生活指数可以从以下几个方面进行查询(红色标记是免费 API 可以查询的指数类型),所以生活指数实体应该包含这些值。

20200508113617

创建实体,配置实体名称和实体标识。

20200508113739

配置实体的值,我们可以这样理解,当用户表达中包含实体中的某个同义词时,参数会对应成实体值。并以实体标识+实体值的形式传递给后端。

20200508114138

意图

根据需求,该技能应该有 4 个意图,其中 1 个是默认意图,用于引导用户使用该技能。其他 3 个是自定义意图,大家可以按照下图创建意图。

20200508094924

默认意图的配置如下图,只需要填写意图信息,设置为默认意图即可。

20200508111425

以实况天气意图为例,自定义意图的配置入下图。

20200508111522

需要根据前面编写的示例对话,配置单轮对话表达,并将对话中的实体标注出来,AliGenie 会自动帮你配置出参数。

20200508111651

回复逻辑配置

AliGenie 平台给我们提供了三种回复逻辑,因为要使用云开发平台作为后端,这里我们选择 默认逻辑阿里云FaaS ,在操作中设置为默认集合,点击+号展开列表,点击云开发,进入云开发平台

在阿里云开发平台编码

创建应用

通过回复逻辑配置中的云开发入口进入云开发平台会自动创建一个应用。云开发依赖下面 4 个云服务,如果你没有开通这些云服务,可以点击云服务对应的链接进行开通。

20200508115758

一切就绪之后,点击开发,进入 CloudIDE。

20200508115907

20200508120119

开发应用

{% note info %}
目前通过云开发平台创建的函数计算环境, Node.js 的运行时是 nodejs6。
{% endnote %}
云开发平台 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,
};

{% note info %}
intent 文件夹中的意图处理程序的文件名应该和 AliGenie 平台侧配置的意图名称保持一致。
{% endnote %}

以处理实况天气这个意图为例进行代码编写。首先在 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: "",
    },

  }; 
}; 

最后我们的工程结构应该是这个样子的。

20200508143105

完整代码我放到了 GitHub 中,可以自行下载:链接

部署与测试

完成编码,把代码推送至线上运行环境,即可完成与 AliGenie 平台的对接。

将代码部署到线上

阿里云开发平台为我们提供了 3 套运行环境,分别为日常环境、预发环境和线上环境,方便开发者进行蓝绿发布。我们直接将代码发到线上环境就好了。

20200508151238

点击部署,CloudIDE 将自动打包上传。

20200508151538

如图,即已经完成部署。

在线调试

部署完成,我们先进行一下在线调试。
回到 AliGenie 平台,进入技能,点击测试,选择在线测试。将示例对话作为测试用例进行测试,每次测试的返回都包括识别意图、参数、返回状态和返回内容四部分。

20200508152049

真机调试

在线调试已经没有问题了,我们马上进入真机测试。选择真机测试 TAB,开启真机测试。

20200509181014

{% note info %}
在AliGenie开发文档中提到“真机调试需要绑定设备”,目前真机调试已经不需要进行设备绑定了, 只要是这个开发者淘宝账号配网的天猫精灵设备都可以测试这个技能。
{% endnote %}
对音箱说示例对话,观察音箱的回复是否为预期回复,如果是预期回复,恭喜你,你的天猫精灵技能修炼成功啦。同时欢迎你继续扩展天猫精灵的技能~~

20200508152729

演示

因为视频审核的原因,暂时视频放在了 CODING 文件分享上。演示视频链接

后期会补充 B 站链接。

trouble shooting

我们应该具有一定的错能力,下面是 trouble shooting 部分。

如何抓 log

我们在进行在线测试时,有时候会遇到接口错误的问题,不返回任何信息,直接报 IDE Error,我们可以借助阿里云函数计算的日志服务进行排错。
打开阿里云控制台,选择函数计算产品,进入函数计算控制台,在服务/函数选项卡找到对应的函数,进入函数。

20200508160111

{% note info %}
函数服务有地域属性,如果你找不到自动创建的云函数,请查看是否选择了正确的地域。
{% endnote %}
点击日志查询后选择高级查询,勾选要查询的时间段,例如一分钟内,或者一个自定义的时间段,点击查询分析按钮。

20200508160813

我刷蓝色字体的部分就是保存,可以参考进行排错。

为什么我的精灵不听话

使用同样的测试用例进行在线测试和真机测试,结果却截然不同。真机测试时,有时候精灵并不能有效响应我们的意图,这是为什么呢?
我们可以打开天猫精灵 APP,选择消息,打开设备对话查看用户输入的识别结果是否正确。
例如我有一个应用叫 和风天气 ,我对天猫精灵说 天猫精灵,打开和风天气 ,而精灵却识别成了 盒风天气 ,当然返回的结果就出错。

20200508154149

参考文献

作者: 小谈谈
链接: https://www.txisfine.cn/archives/3ffcdbbe.html
来源: 弹霄博科,已授权阿里云开发者社区转载。

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
相关文章
|
机器学习/深度学习 监控 算法
信用风险评估评分卡建模方法及原理| 学习笔记
快速学习信用风险评估评分卡建模方法及原理。
信用风险评估评分卡建模方法及原理| 学习笔记
|
人工智能 Java
零基础五步骤,从零开始天猫精灵
零基础五步骤,从零开始天猫精灵
1780 1
零基础五步骤,从零开始天猫精灵
|
9月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与可控性。分块策略是其核心,直接影响检索效果与生成质量。本文系统解析五种主流分块方法:固定大小、语义、递归、基于结构及LLM分块,对比其优缺点与适用场景,并提出组合优化建议,助力构建高效、可信的RAG系统。
399 0
|
2月前
|
机器学习/深度学习 缓存 人工智能
SSE流式传输稳定性进阶:心跳保活、断连重连、分片处理与双端容错实战.162
SSE(Server-Sent Events)是基于HTTP的单向流式协议,天然适配大模型逐字输出场景。具备轻量、兼容性好、自动重连、低内存占用等优势,相比WebSocket更契合服务端单向推送需求,是AI应用流式响应的理想选择。
500 7
|
3月前
|
人工智能 程序员
游戏行业最好的 AI 编程大模型
15年游戏开发经验者打造的AI编程工具FreeUltraCode,深度适配虚幻引擎,支持UMG界面、3D模型、2D动画、音频等全类型游戏资产生成与管理,让大模型真正懂材质、蓝图、骨骼动画等游戏开发语义。
374 2
|
3月前
|
人工智能 缓存 数据可视化
中转站余额为什么掉得快?我拆了一次 AI 编程任务的真实消耗
本文揭秘AI编程Agent(如Claude Code、Codex)中转站余额骤降原因:非输出代码贵,而是多轮请求中携带的上下文(工具定义、文件内容、测试日志、Code Plan分析等)大量消耗token。借助ccglass工具可精准拆解每轮请求的input/output/cache/latency,实现成本可视化与优化——核心是减少无效上下文,而非少用AI。(239字)
|
3月前
|
自然语言处理 监控 安全
从入门到精通:阿里云千问大模型功能详解、价格配置与API集成实战指南
阿里云千问大模型是面向个人与企业的全栈式大模型服务,覆盖文本生成、多模态理解、代码开发、知识问答、逻辑推理等全场景能力,依托阿里云百炼平台提供稳定、安全、可扩展的模型调用服务。其核心优势在于中文理解深度、长文本处理能力、多模态融合与企业级安全合规,适配个人创作、开发者集成、企业业务系统嵌入等多元需求。
659 0
|
3月前
|
人工智能 监控 安全
大模型应用:医疗AI智能体幻觉防控:幻觉抑制的四层防护体系应用实践.128
医疗AI幻觉指大模型生成虚假、无据、矛盾的医疗信息,危及生命安全。本文提出“事前约束—事中校验—人工兜底—反馈闭环”四层防护体系,通过提示词强制规范、规则引擎实时拦截、医师审核白名单、用户反馈持续迭代,将幻觉率压至<0.5%,实现医疗场景零容忍安全落地。
314 1
|
5月前
|
弹性计算 人工智能 自然语言处理
阿里云Qwen3.6 MoE大模型全新开源详解:模型特性、ECS/ACS/计算巢部署流程、vLLM配置与代码调用全教程
阿里云Qwen3.6系列是通义千问团队推出的新一代混合专家(MoE)架构大语言模型,凭借稀疏激活、高效推理、多规格覆盖、原生支持智能体与多语言能力,成为企业私有化部署、AI应用开发、智能体构建的理想选择。该系列全面开源,依托阿里云计算巢平台可实现三步一键部署专有版,搭配vLLM推理框架大幅提升吞吐效率,FP8量化版本更让显存占用降低约一半,兼顾顶尖性能与极致成本优势。本文从模型定位、核心优势、规格选型、阿里云计算巢部署流程、API调用代码、环境配置、常见问题全方面展开,为开发者与企业提供完整可落地的实战指南。
4052 7
|
5月前
|
人工智能 安全 API
零基础入门:阿里云 Hermes Agent 一键部署全流程详解(图文版)
Hermes Agent 是 Nous Research 于2026年2月开源的自进化AI智能体,支持持久记忆、技能自主生成与多平台集成,实现从“工具”到“伙伴”的跃迁。本文详解其核心特性及阿里云一键部署全流程。
2667 16

热门文章

最新文章