共计 2194 个字符,预计需要花费 6 分钟才能阅读完成。
标准的 skill 基础概念
标准的 skill 是一种可扩展的对话式交互模块,它能理解用户意图并完成特定任务。典型的应用场景包括:

- 智能家居控制(如调节灯光温度)
- 信息服务查询(天气 / 新闻 / 股票)
- 商务流程自动化(订餐 / 预约 / 客服)
新手开发痛点分析
- 意图定义模糊:将 ” 查天气 ” 和 ” 问气温 ” 分成两个独立意图,导致模型混淆
- 实体提取不全:未考虑 ” 后天下午 ” 这类复合时间表达式
- 对话状态失控:用户打断后无法恢复先前上下文
- 异常处理缺失:当 API 超时时直接返回原始错误堆栈
- 过度依赖 GUI 工具:不了解底层交互协议导致调试困难
天气预报技能开发实战
技能定义文件示例
// skill_manifest.json
{
"skillName": "weather_assistant",
"invocationName": "天气小助手",
"intents": [
{
"name": "QueryWeather",
"samples": ["{city}天气怎么样",
"查询 {date}{city} 的天气"
],
"slots": [{"name": "city", "type": "AMAZON.CN_CITY"},
{"name": "date", "type": "AMAZON.DATE"}
]
}
]
}
关键字段说明:
invocationName:用户唤醒技能的名称samples:至少需要 15 条以上多样化的表达样本slots:建议为每个实体类型添加 2 - 3 个同义词
Python 实现核心逻辑
# weather_skill.py
from datetime import datetime
def handle_query(event):
"""处理天气查询请求"""
try:
city = event['request']['intent']['slots']['city']['value']
raw_date = event['request']['intent']['slots']['date'].get('value')
# 日期解析逻辑
query_date = datetime.today()
if raw_date:
if '天后' in raw_date:
days = int(raw_date.split('天')[0])
query_date = query_date + timedelta(days=days)
else:
query_date = parse_date(raw_date)
# 获取天气数据(模拟实现)weather_data = get_weather(city, query_date)
return {
'version': '1.0',
'response': {
'outputSpeech': {
'type': 'PlainText',
'text': f"{query_date}的 {city} 天气是{weather_data}"
}
}
}
except Exception as e:
# 错误处理标准化
return build_error_response(str(e))
def get_weather(city, date):
"""模拟天气 API 调用"""
# 实际项目应替换为真实 API 调用
return "晴,25-32℃"
对话状态管理方案
推荐采用有限状态机 (FSM) 模式:
- 初始化状态:等待用户发起查询
- 参数收集状态:当缺少城市或日期时主动询问
- 服务处理状态:调用外部 API 获取数据
- 确认状态:询问用户是否需要其他信息
stateDiagram
[*] --> Idle
Idle --> ParameterCollection: 收到查询但参数不全
ParameterCollection --> ServiceProcessing: 参数收集完成
ServiceProcessing --> Confirmation: 返回查询结果
Confirmation --> Idle: 用户选择结束
Confirmation --> ParameterCollection: 用户发起新查询
避坑指南
- 槽位填充陷阱
- 问题:用户说 ” 北京明天 ” 时系统误将 ” 北京明天 ” 整体识别为城市
-
解决:在技能配置中明确设置城市类型的排除词列表
-
时间处理缺陷
- 问题:将 ” 下周三 ” 永远解析为未来最近的周三
-
解决:实现基于 reference date 的相对日期计算
-
API 超时失控
- 问题:天气服务 5 秒未响应导致会话超时
-
解决:设置 3 秒超时并返回缓存数据
-
上下文丢失
- 问题:用户问 ” 那后天呢 ” 时无法关联前文城市
-
解决:使用 sessionAttributes 持久化关键参数
-
测试覆盖不足
- 问题:未测试 ” 大后天 ” 这类边缘表达
- 解决:构建包含 200+ 测试用例的验证集
生产环境部署要点
性能优化
- 使用 Redis 缓存高频查询结果(TTL 设置 1 小时)
- 对第三方 API 调用实现断路器模式
- 对话日志采用异步写入方式
安全实践
- 所有用户输入参数必须进行 HTML 转义
- 敏感配置(如 API 密钥)使用 KMS 加密
- 实现请求签名验证防止伪造调用
- 定期审计 intent 样本中的偏见表达
扩展思考与学习资源
技能扩展方向:
- 增加空气质量指数查询
- 支持多城市天气对比
- 实现异常天气预警推送
推荐学习路径:
- 官方技能开发文档
- 《对话式 AI 设计指南》O’Reilly
- 参加 Alexa Skills Challenge 实战比赛
通过这个天气预报技能的完整实现,你应该已经掌握了标准 skill 的开发脉络。记住,优秀的对话技能不在于功能的复杂度,而在于对用户意图的精准把握和自然流畅的交互体验。接下来试着给你的技能加上个性化推荐功能吧!
正文完
