共计 2246 个字符,预计需要花费 6 分钟才能阅读完成。
为什么需要 Agent Skill
智能体(Agent)已经成为人机交互的重要入口,而 Agent Skill 则是赋予智能体专业能力的核心模块。就像手机里的 App 一样,每个 Skill 让智能体具备特定领域的服务能力,比如查天气、订餐、控制智能家居等。对开发者而言,掌握 Skill 开发意味着能快速将自己的创意落地为可交互的 AI 服务。

新手开发者的四大痛点
- 意图识别不准:用户说“明天会下雨吗”和“天气预报怎么说”本质是同一个意图,但新手往往处理为不同场景
- 上下文断裂:当用户问“北京呢?”时,系统需要记住前文在讨论天气,而不是要求重新开始对话
- 槽位填充困难 :从“本周五飞上海的航班”中准确提取日期(datetime) 和目的地 (location) 两个槽位值
- 异常流处理弱:当用户突然打断或提问超出范围时,系统容易崩溃
开发工具链推荐
- Rasa:开源框架,适合需要高度定制的场景(Python 系开发者首选)
- Dialogflow:Google 提供的托管服务,快速实现基础对话(适合无服务端经验的团队)
- Lex:AWS 的对话服务,与其它 AWS 服务深度集成
我们以 Rasa 为例展示完整开发流程,它的架构包含:
# 典型 Rasa 项目结构
weather_skill/
│── actions/ # 自定义动作代码
│── data/ # 训练数据
│── models/ # 训练好的模型
│── tests/ # 测试用例
│── config.yml # 管道配置
│── domain.yml # 技能能力定义
│── endpoints.yml # 服务连接配置
天气查询技能全实现
1. 定义 NLU 训练数据
在 data/nlu.yml 中定义意图和示例语句:
version: "3.1"
nlu:
- intent: ask_weather
examples: |
- [北京](location)的天气
- 今天 [上海](location) 会下雨吗
- 查下 [纽约](location) 下周天气
2. 编写核心对话逻辑
在 domain.yml 中声明技能能力:
slots:
location:
type: text
mappings:
- type: from_entity
entity: location
responses:
utter_ask_location:
- text: "您想查询哪个城市的天气?"
actions:
- action_get_weather # 自定义天气查询动作
3. 实现天气 API 调用
在 actions/actions.py 中编写:
class ActionGetWeather(Action):
def name(self) -> Text:
return "action_get_weather"
async def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]
) -> List[Dict[Text, Any]]:
# 从槽位获取位置
location = tracker.get_slot("location")
# 调用天气 API(示例用伪代码)weather_data = requests.get(f"https://api.weather.com/v1?city={location}"
).json()
# 组织响应
dispatcher.utter_message(f"{location}当前气温 {weather_data['temp']} 度,"
f"天气状况{weather_data['condition']}"
)
return []
处理多轮对话的秘诀
- 对话状态机 :用
Tracker对象记录当前对话状态 - 表单模式 :Rasa 的
FormAction可自动处理槽位填充 - 上下文变量 :通过
slot_set事件传递跨轮次信息
优化示例:
# 在 domain.yml 中定义表单
forms:
weather_form:
required_slots:
- location
# 自动处理追问场景
- story: ask location
steps:
- intent: ask_weather
- action: weather_form
- active_loop: weather_form
- slot_was_set:
- requested_slot: location
- intent: inform
entities:
- location: "北京"
- action: action_get_weather
三大避坑指南
- 实体混淆 :区分相近实体如
time(时间) 和duration(时长) -
解决:在训练数据中明确标注差异示例
-
过度泛化 :避免用
.+这样的贪婪正则匹配 -
改进:使用
\b(周一 | 周二)\b等精确模式 -
冷启动慢:首次响应超过 3 秒
- 优化:预加载模型,异步执行耗时操作
扩展思考:多语言支持
实现多语言技能需要考虑:
- 在
config.yml中配置多语言 pipeline - 为每种语言准备独立的训练数据
- 使用
polyglot等库自动识别输入语言 - 对话响应根据语言动态切换模板
# 多语言响应示例
responses = {"en": "Current temperature is {temp}℃",
"zh": "当前气温 {temp} 摄氏度"
}
language = detect(user_message)
dispatcher.utter_message(responses[language])
结语
通过这个天气查询案例,我们走完了 Agent Skill 开发的全流程。建议从简单技能开始,逐步尝试处理更复杂的对话场景。当你的第一个技能成功响应时,那种成就感会让你爱上智能体开发。
正文完
