在 AI Agent(如 OpenClaw、AutoGPT、Claude Agent 等)逐渐普及的今天,Skills(技能)已经成为决定 Agent 能力上限的核心模块。
很多人会用 Agent,但不会"教 Agent 做事"。
而 Skills,就是你赋予 AI「可控执行能力」的关键。
这篇文章会带你从 概念 → 设计 → 实战 → 最佳实践,彻底掌握 Skills 的编写。
🧠 一、什么是 Skills?
简单来说:
Skill = AI 可调用的"函数能力"
它本质上就是一段结构化能力描述,让 AI 能:
- 知道"什么时候用你"
- 知道"怎么用你"
- 知道"返回什么结果"
📌 举个例子
你写一个 Skill:
json
{
"name": "get_weather",
"description": "获取指定城市天气",
"parameters": {
"city": "string"
}
}
👉 那 AI 在遇到:
"帮我查一下吉隆坡天气"
就会自动调用这个 Skill。
⚙️ 二、Skill 的核心结构
一个完整的 Skill,一般包含 4 个核心部分:
1️⃣ 名称(name)
- 必须清晰
- 尽量动词开头
✅ 推荐:
- get_weather
- create_file
- deploy_server
❌ 不推荐:
- weather1
- doSomething
2️⃣ 描述(description)
这是最重要的部分!
AI 是否能正确调用 Skill,80% 取决于 description
✨ 好的描述应该:
- 明确用途
- 指出使用场景
- 避免歧义
✅ 示例:
获取指定城市的实时天气信息,包括温度、湿度和天气状况。适用于用户询问天气相关问题时使用。
3️⃣ 参数(parameters)
定义 AI 传入的数据结构:
json
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
📌 关键点:
- 每个字段必须有 description
- required 要写清楚
- 类型要严格(string / number / boolean)
4️⃣ 执行逻辑(handler / function)
也就是你真正的代码:
javascript
export async function get_weather({ city }) {
return `当前 ${city} 天气晴,30°C`;
}
🏗️ 三、Skill 设计原则(非常重要)
写 Skill 不是随便写函数,而是设计"AI能力模块"。
✅ 原则 1:单一职责
一个 Skill 只做一件事:
❌ 错误:get_weather_and_news
✅ 正确:
- get_weather
- get_news
✅ 原则 2:可复用
避免写死逻辑:
❌:get_kuala_lumpur_weather()
✅:get_weather(city)
✅ 原则 3:对 AI 友好(最关键)
你写的是给 AI 用的,不是给人看的。
👉 所以:
- 描述要"像提示词"
- 参数要"明确边界"
🧩 四、Skill 实战示例(OpenClaw)
结合 OpenClaw,我们写一个实用 Skill:
📌 示例:执行服务器命令
json
{
"name": "run_shell_command",
"description": "在服务器上执行安全的 shell 命令,用于查询系统状态、文件信息等。禁止执行删除、格式化等危险操作。",
"parameters": {
"type": "object",
"properties": {
"command": {
"type": "string",
"description": "需要执行的 shell 命令"
}
},
"required": ["command"]
}
}
🧠 为什么这样设计?
👉 关键点:
- 明确"允许范围"(安全)
- 限制 AI 行为(防止乱删文件)
🔐 五、安全设计(必须重视)
如果你在做:
- 云服务器控制
- 文件操作
- 自动部署
⚠️ 一定要做限制!
🚨 常见风险
- rm -rf /
- 删除数据库
- 泄露敏感信息
✅ 解决方案
1️⃣ 命令白名单
javascript
const allowList = ["ls", "cat", "pwd", "df", "top"];
2️⃣ 路径限制
javascript
if (!path.startsWith("/safe-dir")) {
throw new Error("非法路径");
}
3️⃣ 参数校验
javascript
if (typeof command !== "string") {
throw new Error("参数错误");
}
🧠 六、如何让 AI 更容易调用你的 Skill?
这是进阶重点:
🎯 技巧 1:在 description 中加入触发语义
当用户询问天气、气温、下雨情况时使用该技能。
🎯 技巧 2:避免技能重叠
❌:
- get_weather
- query_weather
- fetch_weather
👉 AI 会懵
🎯 技巧 3:返回结构化数据
json
{
"temperature": 30,
"weather": "sunny"
}
👉 比字符串更好!
🧪 七、调试 Skill 的方法
在 OpenClaw 中你可以执行以下命令调试:
bash
openclaw doctor
openclaw logs
📌 调试思路:
- 看 AI 有没有调用 Skill
- 看参数是否正确
- 看返回值是否合理
🚀 八、进阶:组合 Skills(Agent能力跃迁)
真正强大的 Agent,不是靠一个 Skill,而是多个组合:
🎯 示例流程:
- get_git_commits
- analyze_changes
- generate_report
👉 自动生成周报(实战场景落地)
🧾 九、最佳实践总结
| 核心原则 | 关键要求 |
|---|---|
| 命名 | 清晰、动词开头 |
| 描述 | 详细、像 Prompt 一样明确触发场景 |
| 参数 | 类型严格、必填项清晰 |
| 安全 | 白名单、路径限制、参数校验 |
| 设计 | 单一职责、可复用、可组合 |
🎯 十、总结
一句话总结:
Skill = Prompt + API + 安全控制 的结合体
写好 Skills,你的 Agent 才真正"能干活"。
🧠 最后建议(贴合实战场景)
如果你正在做:
- OpenClaw 开发
- 自动周报生成
- 服务器控制
👉 强烈建议优先实现这几个核心 Skills:
- get_git_commits(获取 Git 提交记录)
- generate_weekly_report(生成周报)
- run_safe_command(安全执行服务器命令)
- get_server_status(获取服务器状态)
如果需要,我可以直接提供:
- 生产级可用的 Skills 模板
- 适配 Flutter + AI 的完整 Agent 架构设计