什么是 Skill? 简单说,Skill 是一个文件夹,里面包含 SKILL.md(核心指令文件)和配套脚本。它的作用是给 Agent 赋予特定的"工作流程"能力,而不是零散的、每次都要重新解释的指令。

Skill vs Memory:最根本的差别是精度。Memory 是模糊检索——Agent 每次都要"理解"存储的内容,时间长了还会衰减、遗忘。Skill 是精确的文本合约SKILL.md 白纸黑字地写清楚"什么时候用、怎么做、不能怎么做",Agent 不需要理解和解释,只需要执行。

什么时候用 Skill? 当你需要 Agent 重复、稳定地执行同一类任务时,比如定时生成报告、按流程处理数据、自动巡检系统。一个任务如果要跑 3 次以上,流程相对稳定,就值得做成 Skill。

我开发了几个 Skills,踩了不少坑。下面分享几个主要问题、解决方案和相关经验。


踩坑记录

起因:靠 memory 执行重复任务,不稳定

最初的想法很简单:让 OpenClaw 执行一个任务,然后告诉它"记住这个流程",存到 memory 里。想着以后再让它跑同样的任务就直接用 memory 里的流程。

但实际上很快就出现了问题:多跑几次,输出质量飘忽不定;第二天再让它做,要么格式全变、完全不符合要求,要么直接失忆;更离谱的是,有时候它还会否认自己之前做过这个任务。

根本原因是 OpenClaw 的 memory 是模糊检索,不是精确存储。它记住的是大概的意思,不是逐字逐步的流程。每次回忆时重新"理解"一遍,自然每次理解不一样。而且 memory 会被新信息冲刷,时间一长,早期存的内容权重就下降了。

所以我最后的结论是:要让 Agent 稳定重复执行同一个任务,不能靠 memory(不精确),必须靠 Skill(精确的文本指令)。SKILL.md 是白纸黑字的,不存在"忘了"或"理解偏差"的问题。

在开发 Skill 的过程中,我遇到了几个问题。下面逐一记录。


问题 1:OpenClaw 找不到刚部署的 Skill

现象:把新 Skill 部署到 <workspace>/skills 目录下,但 OpenClaw 找不到这个 Skill,不会自动触发。

原因:OpenClaw 似乎不会主动扫描 <workspace>/skills 下的新 Skill,新部署的 Skill 不会自动加载 (原因不明)。

解决方案

  1. 先执行命令确认 Skill 状态为"ready"
    openclaw skills list
    
  2. 告诉 OpenClaw:
    刷新 skill 列表
    
  3. 如果刷新后还没有识别到新 Skill,告诉它:
    我在 workspace 下加了新的 [abc] skill
    
  4. 然后要求它读取新 Skill:
    读一下 [abc] skill
    
  5. OpenClaw 会读取该 Skill 的 SKILL.md 文件并描述其内容,证明 Skill 已被成功加载

OpenClaw Skill 加载优先级(官方文档)

OpenClaw 从多个位置加载 Skills,优先级从高到低:

优先级 位置 说明
1(最高) <workspace>/skills 工作区 Skill
2 <workspace>/.agents/skills 项目 Agent 的 Skill
3 ~/.agents/skills 用户个人 Skill
4 ~/.openclaw/skills 本地全局 Skill
5 Bundled skills OpenClaw 安装包自带的内置 Skill
6(最低) skills.load.extraDirs 配置文件指定的额外目录

同名 Skill 出现在多个位置时,高优先级覆盖低优先级。

:这部分内容参考自 OpenClaw 官方文档。


问题 2:修改 SKILL.md 后 Agent 还在用旧版本

现象:改了 SKILL.md 的内容,但 Agent 下次执行时还是按旧逻辑走。

原因:OpenClaw 宣称支持热重载,配置里也开了 watch: true,但实际上 Skill 更改后并不一定会自动更新(原因不明)。这个坑特别隐蔽 — 你可能测了半天,最后才意识到 Agent 根本没用新版本。

我的配置(watch 已开启):

"skills": {
  "load": {
    "watch": true,       // 已设为 true,但不一定生效
    "watchDebounceMs": 250
  }
}

解决方案

  1. 修改 SKILL.md 后,告诉 OpenClaw:

    [abc] skill 已更新,重新加载
    
  2. 通常 OpenClaw 会总结一下变化点(新增/删除/修改了什么)

  3. 确认一下总结是否正确,确保新版本已被加载

  4. 如果发现还是用旧逻辑,让 OpenClaw 清除记忆:

    清除和 [abc] skill 相关的记忆
    

    然后重新加载 Skill

教训:不要假设热重载生效了。每次在测试 Skill 的改动前,要确保 Skill 已经更新。


问题 3:黑盒创建 Skill 可能行不通

现象:最开始我让 OpenClaw 用 skill-creator 把任务执行的过程直接写成 Skill(我并没有检查 SKILL.md 的内容),纯黑盒测试 — 跑一遍看结果,不行就让 skill-creator 改,改完再跑,反复循环。但这种做法总有各种问题,而且效率很低。

原因

  • 不管是 OpenClaw 对需求的理解、它设计的方案,还是它做的改动,都可能存在偏差。它以为自己改好了,实际上问题还在。而我在不清楚 Skill 内容的情况下,做出的判断也不一定对 — 双方都在猜。
  • Agent 对"什么是好的 Skill"缺乏判断力 — 它能写出语法正确的 SKILL.md,但不懂什么样的指令能让自己严格执行。它的"修改"本质上是猜测,不是反思。

解决 — 用写代码的方式写 Skill (可以用 coding agent 写):

  1. 先开发依赖脚本(scripts) — 抓取、解析、数据处理等脚本,要先测通,确保这层没问题
  2. 再写 SKILL.md — 这一步要仔细检查 SKILL.md 内容,确保描述准确、步骤严谨
  3. 最后放到 OpenClaw 里集成测试 — 测试 Skill 是否能按预期工作
  4. 固化有效版本 — 一旦某个版本工作正常,通过版本控制 (例如git) 管理起来。能用的版本及时 commit,后续改坏了可以随时回退

这样做效率高了很多。更重要的是,出了问题我知道该查哪一层 — 因为我了解 Skill 内部是怎么回事。

教训:Skill 的核心设计还是需要由人来做 (尤其对于复杂的)。Skill Creator 适合生成初稿,不适合迭代打磨。


问题 4:定时任务不执行,或者执行了但不调用 Skill

现象:我需要一个定时任务,按照 Skill 执行操作并把结果发送到飞书 DM。但实际情况是:要么任务没按时执行,要么没调用 Skill,要么执行出错。

原因:定时任务有两种做法:1)系统 cron job;2)OpenClaw 内置的定时任务机制。应该使用方案 2,并正确配置。

解决:在 OpenClaw 的 Web UI 上配置(配置文件位于 ~/.openclaw/cron/jobs.json)。以我的定时任务为例:

基本信息

  • 名称:填任务名称

调度

  • 调度:选"Cron",配置好 Cron 表达式
  • 时区:填 Asia/Shanghai

执行

  • 会话:选"隔离会话"
  • 唤醒模式:选"立即"
  • 执行内容:选"运行助手任务(隔离)"
  • 超时:填一个合理的超时时间
  • 助手任务提示:填具体的任务描述 — 这里要写得能够触发你的 Skill

投递

  • 结果投递:选"发布摘要(默认)"
  • 频道:选"飞书"

注意:Skill 里不需要写发送飞书的步骤,只需返回执行结果即可。隔离会话的结果会通过 Inter-session Message 回传到主会话,再由主会话投递到飞书。

教训:定时任务要用 OpenClaw 内置机制,不要用系统 cron。最关键的是"助手任务提示"那段话必须能触发 Skill,否则 Agent 不知道该调用什么。


问题 5:Agent 不严格执行 Skill,生成质量差

现象:Skill 里写了明确的步骤和格式要求,但 Agent 并不严格执行,输出质量不稳定。

原因:SKILL.md 里的指令太"建议性",不够强制。Agent 天然倾向于偷懒和走捷径。

解决方案

  1. 用强制约束代替建议 — 用 MUSTMUST NOTNEVER 明确规则

    ## 约束
    - MUST 严格按模板输出,NEVER 省略内容
    - MUST 保留具体数字、数据、关键信息
    - NEVER 改原意或自由发挥
    - NEVER 跳过任何步骤
    
  2. 明确输出模板和数据指标 — 不是"参考",而是"必须"

    ### 输出模板(MUST 严格遵守)
    
    - **[项目名称]** — [数据来源](URL)
      [用自己的话写 N 字核心内容]
    
    数据指标(MUST 满足):
    - 类别A MUST ≥ X
    - 类别B MUST ≥ Y
    - 类别C MUST = Z(每项 M-N 字)
    
  3. 用决策树而非文字描述流程 — 让 Agent 按逻辑分支执行,而非自由理解

    ## 执行流程(决策树)
    
    ① 数据获取
    IF 成功 → 进入②
    IF 失败 → 回退:排查错误,通知用户
    
    ② 数据过滤
    IF 符合条件 → 进入③
    IF 不符合 → 回退:调整参数,重新过滤
    
    ③ 内容提取与分析
    IF 质量指标满足 → 进入④
    IF 不满足 → 回退:扩大范围,重新提取
    
    ④ 报告组装
    [按模板输出]
    
    ⑤ 自检清单
    □ 所有指标都满足?□ 所有链接前置?
    □ 无省略内容? □ 格式正确?
    
  4. 强制自检清单 — 明确哪些必须检查,哪些必须 NEVER

    MUST 逐项检查后才能返回:
    □ 所有数据按照规则处理过?
    □ 所有内容用自己的话写过,不是直接复制?
    □ 所有必填项都有吗?
    
    NEVER:
    - NEVER 输出模板占位符文字
    - NEVER 省略任何数据
    - NEVER 等待用户确认(ALWAYS 直接执行)
    

教训:SKILL.md 是给 Agent 严格执行的代码,不是建议文档。用 MUST/NEVER + 决策树 + 自检清单,效果比"应该"强 100 倍。


总结

  1. 写合约,不写建议 — SKILL.md 是执行代码,用 MUST/NEVER 的强制规则替代"应该"的建议。决策树、自检清单、明确格式,是让 Agent 严格执行的关键。

  2. 工程方法 — 像开发代码产品一样开发 Skill。先把脚本逻辑搞定并测通,再精心设计 SKILL.md(流程、格式、验证点),最后在 OpenClaw 中集成测试。别用黑盒 + 反复试错。

好的 Skill 的稳定性和质量,取决于你是否把它当成"代码产品"来开发。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐