共计 2327 个字符,预计需要花费 6 分钟才能阅读完成。
核心概念:什么是 Agent Skill?
Agent Skill 可以理解为一种可编程的对话能力模块。它能让聊天机器人、智能助手等具备处理特定任务的能力,比如订餐、查天气或客服问答。举个实际例子,当你对智能音箱说 ” 播放周杰伦的歌 ”,背后就是音乐播放的 Agent Skill 在运作。

典型应用场景包括:
- 智能家居控制(灯光 / 温度调节)
- 电商客服(退货 / 查询订单)
- 企业 IT 支持(密码重置 / 系统报修)
技术选型:主流框架对比
先看三种常见方案的特性对比:
- Rasa
- 优点:开源可定制,支持复杂对话流
- 缺点:学习曲线陡峭,需自行部署
-
适合:需要完全控制对话逻辑的场景
-
Dialogflow(Google)
- 优点:可视化开发,集成 GCP 服务方便
- 缺点:高级功能收费,黑箱操作
-
适合:快速验证想法的 PoC 阶段
-
Microsoft Bot Framework
- 优点:多通道部署,企业级支持
- 缺点:Azure 绑定较深
- 适合:已有微软技术栈的团队
实现步骤详解
环境准备(以 Rasa 为例)
-
安装 Python 3.8+ 并创建虚拟环境
python -m venv rasa_env source rasa_env/bin/activate # Linux/Mac rasa_env\Scripts\activate # Windows -
安装核心包
pip install rasa
意图识别实战
在 data/nlu.yml 中定义训练样本:
version: "3.1"
nlu:
- intent: greet
examples: |
- 你好
- 早上好
- hi
- intent: ask_weather
examples: |
- 今天天气怎么样
- 会下雨吗
- 北京气温多少
实体提取示例代码:
# 自定义实体提取组件
from rasa.nlu.extractors import EntityExtractor
class LocationExtractor(EntityExtractor):
def process(self, message):
# 简化的地名识别逻辑
cities = ["北京", "上海", "广州"]
entities = []
for word in message.text.split():
if word in cities:
entities.append({
"entity": "city",
"value": word,
"start": message.text.index(word),
"end": message.text.index(word) + len(word)
})
return entities
对话管理设计
架构示意图:
用户输入 → NLU 理解 → 对话状态追踪 → 策略选择 → 动作执行 → 响应输出
在 domain.yml 中定义对话逻辑:
responses:
utter_greet:
- text: "您好,有什么可以帮您?"
actions:
- action_query_weather
slots:
location:
type: text
性能优化技巧
- 响应加速
- 使用 Redis 缓存常见问答对
-
启用 Rasa 的
--debug模式分析耗时 -
并发处理
- 部署时使用 uvicorn+ 多 worker
-
异步处理耗时操作(如 API 调用)
-
模型压缩
- 用
rasa data convert精简训练数据 - 选择更小的预训练词向量
新手避坑指南
- 陷阱:忽视数据清洗
- 现象:识别准确率始终低于 60%
-
解决:统一繁简体,去除特殊符号
-
陷阱:过度依赖默认配置
- 现象:复杂场景响应异常
-
解决:自定义 policies 配置超参数
-
陷阱:忘记设置 fallback
- 现象:遇到陌生输入时卡死
-
解决:添加
FallbackPolicy -
陷阱:硬编码业务逻辑
- 现象:需求变更需重写代码
-
解决:通过 slot 动态传递参数
-
陷阱:忽略多轮测试
- 现象:上线后对话流断裂
- 解决:用
rasa test做端到端验证
完整示例:天气查询 Skill
# actions/actions.py
from typing import Dict, Text, Any
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
import requests
class ActionQueryWeather(Action):
def name(self) -> Text:
return "action_query_weather"
async def run(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> list:
# 从 slot 获取地点
city = tracker.get_slot("city")
if not city:
dispatcher.utter_message("请先告诉我要查询哪个城市")
return []
# 调用天气 API(示例伪代码)api_url = f"https://weatherapi.com/{city}"
try:
response = requests.get(api_url)
temp = response.json()["temperature"]
dispatcher.utter_message(f"{city}当前气温{temp}℃")
except:
dispatcher.utter_message("查询失败,请稍后再试")
return []
进阶思考
- 如何设计支持中英文混合输入的 Skill?
- 当用户突然改变话题时,对话系统应该如何优雅处理?
- 在不使用付费 API 的情况下,如何实现语音交互功能?
通过这个完整流程,你应该已经掌握了 Agent Skill 的开发要点。建议从简单的场景开始,逐步增加复杂度。遇到问题时,多查阅框架官方文档和社区讨论,大多数坑都已经有人踩过并分享了解决方案。Happy coding!
正文完
发表至: 技术分享
近一天内
