共计 2222 个字符,预计需要花费 6 分钟才能阅读完成。
核心概念:AI Skill 是什么?
AI Skill 可以理解为让 AI 系统具备完成特定任务的能力模块。比如天气查询、日程提醒、智能家居控制等,每个独立功能都可以视为一个 Skill。它们通常由三个核心部分组成:

- 意图识别:理解用户想干什么(比如 ” 查天气 ”)
- 实体抽取:获取关键参数(如 ” 北京 ”、” 明天 ”)
- 动作执行:调用 API 或逻辑处理并返回结果
典型应用场景包括智能音箱技能、聊天机器人插件、自动化工作流等。技术栈通常选择 Python+Web 框架(Flask/Django),搭配 NLP 服务(如 Rasa、Dialogflow)。
开发准备:工欲善其事
推荐使用这个轻量级工具链:
- Python 3.8+(建议用 pyenv 管理版本)
- Flask 框架(比 Django 更轻量适合初学者)
- Postman(API 调试)
- ngrok(内网穿透测试)
环境配置步骤:
# 创建虚拟环境
python -m venv aiskenv
source aiskenv/bin/activate # Linux/Mac
# 安装依赖
pip install flask requests python-dotenv
实战案例:天气预报 Skill
1. 意图识别设计
我们先定义两个核心意图:
- weather_query:包含城市 (city) 和时间 (date) 实体
- fallback:无法识别时的兜底处理
用简单字典实现意图匹配:
intents = {"weather": ["天气", "天气预报", "会下雨吗"],
"fallback": ["不明白", "听不懂"]
}
entities = {"city": ["北京", "上海", "广州"],
"date": ["今天", "明天", "后天"]
}
2. 对话状态机实现
用有限状态机管理对话流程:
from enum import Enum
class DialogState(Enum):
INIT = 0 # 初始状态
CITY = 1 # 等待城市输入
DATE = 2 # 等待日期输入
CONFIRM = 3 # 确认查询
3. 第三方 API 集成
使用和风天气免费 API(需注册获取 KEY):
import requests
def get_weather(city, date):
url = f"https://devapi.qweather.com/v7/weather/now?location={city}&key=YOUR_KEY"
try:
response = requests.get(url)
return {"temp": response.json()["now"]["temp"],
"text": response.json()["now"]["text"]
}
except Exception as e:
print(f"API 调用失败: {e}")
return None
4. 响应格式化
统一返回 JSON 格式:
from flask import jsonify
{
"version": "1.0",
"response": {
"outputSpeech": {
"type": "PlainText",
"text": f"{city}{date}的天气是 {text}, 温度{temp} 度"
},
"shouldEndSession": True
}
}
完整代码示例
from flask import Flask, request, jsonify
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
@app.route('/weather', methods=['POST'])
def handle_weather():
data = request.json
intent = data.get("intent")
if intent == "weather_query":
city = data.get("city")
date = data.get("date")
if not city:
return ask_for_city()
weather_data = get_weather(city, date)
return format_response(weather_data)
return fallback_response()
def ask_for_city():
return jsonify({
"response": "请问您想查询哪个城市的天气?",
"reprompt": "请告诉我城市名称,例如北京",
"sessionState": "CITY"
})
if __name__ == "__main__":
app.run(port=5000, debug=True)
调试技巧
遇到这些问题时可以这样排查:
- 意图匹配失败
- 检查输入文本是否包含在意图词库中
-
添加更多同义词和表达方式
-
API 返回异常
- 先用 Postman 单独测试 API
- 检查网络连接和 API 密钥
-
查看服务商文档确认参数格式
-
对话状态混乱
- 打印当前状态日志
- 检查状态转移条件是否全覆盖
进阶建议
当基本功能跑通后,可以考虑:
- 添加输入校验防止 SQL 注入 /XSS 攻击
- 实现速率限制(如 Flask-Limiter)
- 使用 Redis 缓存高频查询结果
- 增加多轮对话上下文管理
扩展练习
尝试给天气 Skill 添加这些功能:
- 根据天气自动推荐穿衣建议
- 支持模糊时间查询(如 ” 这周末 ”)
- 添加空气质量查询子功能
开发 AI Skill 就像搭积木,从简单功能开始,逐步添加新模块。我的第一个天气 Skill 从开发到上线用了 3 天时间,虽然简陋但成就感满满。建议新手不要追求完美,先做出可运行的版本再迭代优化。
正文完
