前言

最近,在做一些Openclaw相关的事情,后续也可能会从事一些AI咨询,或者Openclaw,或者OPC(One Person Company)之类的活动,所以在此之前再熟悉一下Openclaw的框架和相关skill的问题。

正文

1. Skill 目前发展

所谓Skill,其实可以理解为是openclaw的一个功能或者技能吧,其实在我看来是把以前的mcp server,又向上集成了一步,变成了一个功能的集合体或者说是功能的载体。但是目前为止,我自认为skill 或者说 整个openclaw还是属于一种不太完善的地步。

1.1 “养龙虾”

说实话,我和我的很多AI朋友,到现在都不太清楚什么是养龙虾,也不清楚什么叫龙虾养死了,我目前能够理解的是,养龙虾的意思大概是,因为目前openclaw的作用,在我看来说的言简意赅点,就是去替代一个现有的工作岗位,养龙虾就是将openclaw培养成具有这个能够替代工作岗位的过程,养成功了大概就是这个龙虾能够替代这个工作岗位上的人了。

其实说实话,我觉得养龙虾这个目的是合理的,但是目前感觉很多人养龙虾的过程很奇怪,就像盲人过河一样,乱养,或者工程上来讲,乱prompt,至少我觉得是挺不合理的,至少我认为现在的AI还没有进化到 你丢给AI几本书, 他就能够学习出来他要做什么,然后就能够跟着书来做来替换上一个工作岗位上的人了,有一种东西我们需要理解的是,AI是有上下文的,你如果所有的逻辑都交给AI去做,我是觉得他是很难完成好的。

1.2 如何正确“养龙虾”

说到底,AI的一级学科还是计算机科学,无论如何也逃不过编程,虽然目前的AI已经越来越让coding这个行为被边缘化了,但是就像我说的,他还没有进不到足以让所有东西都不需要coding,或者让你把所有逻辑都交给AI自己去执行,这样我是觉得很难的啦。

在我看来正确的养龙虾应该是,AI/ openclaw作为一个事件的调度者,AI的context 他的理解能力应该更多的用于信息交互上,而一些具体的逻辑行为,应该由人们编程来定义,我也能理解这也是为什么skill这个概念会被重新启用的原因,其实skill这个概念最早来源于机器人领域去定义机器人的技能/或者有能力去做哪些事情。现在我觉得用于openclaw / 或者龙虾来说也是挺合理的,就是去定义龙虾有什么skill,有能力去做什么事情,我们去告诉龙虾他有什么技能 他应该做什么事情,而不是让龙虾去自己定义 自己去编程做什么事情。

我能够理解的是,现在的人们去养龙虾应该没有思考这么多,因为龙虾自带一个 skill-creator,他收到指令的时候会自己去创建一些技能去实行,但是有一说一,比起他的skill-creator,我是更old school一点,我觉得应该自己线下create 一个skill 然后测试,最后上传到clawhub/ 或者闭源上面,这样更合理一点。

2. Skill 思维链

2.1 Skill在openclaw的地址

说回skill的问题,官方的skill 和 外部的skill一般被放于不同的地址:

位置

Skills

官方 (~/.npm-global/.../skills/)

weather, tmux, healthcheck, discord, github, notion 等 54 个

自定义 (~/.openclaw/skills/)

akshare-stock, bocha-search, finance-visualizer, local-bookkeeping

所以我们的skill将会放在这里:~/.openclaw/skills/

2.2 local-bookkeeping

我这里写了一个记账的skill,目录大概如下:

local-bookkeeping/
|------references
|      |------chat-reference.md
|      -------commands.md
|------scripts 
|      |------bookkeeping.py
-------SKILL.md

其中references是一些skill使用时候会参考的文档,然后scripts是这个skill使用时候需要的python文件,然后SKILL.md 就是这个skill的主入口,里面定义了一系列的触发器,当用户与openclaw的交互里面有触发词汇的时候,将会激活这个skill。

2.3 Skill的触发:记账功能

我们用户输入“记账 今天我喝了10元的奶茶”

以下是openclaw的行为:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py --help
No output — tool completed successfully.

他先是调用了我们的bookkeeping.py 里面的help查看帮助,因为它需要知道我们可用的函数是什么,然后他得到了我们函数的使用方法

usage: bookkeeping.py [-h] [--db DB]
{init-db,list-categories,set-categories,record,list-transactions,recent-transactions,latest-entry,month-report,update-entry,delete-entry,delete-latest-entry,delete-category}
...

Local bookkeeping helper backed by SQLite.

positional arguments:
{init-db,list-categories,set-categories,record,list-transactions,recent-transactions,latest-entry,month-report,update-entry,delete-entry,delete-latest-entry,delete-category}
init-db Create the database file and schema
list-categories List categories
set-categories Add or replace categories
record Record one transaction
list-transactions List transactions for one month
recent-transactions
List the most recent transactions across all dates
latest-entry Show the latest transaction
month-report Get totals and category breakdown for one month
update-entry Update one transaction by id
delete-entry Delete one transaction by id
delete-latest-entry
Delete the latest transaction
delete-category Deactivate one category by name

options:
-h, --help show this help message and exit
--db DB Custom SQLite database path

在此之后他又开始输入 record --help,看看 record的具体指令是什么,这些都是他为真实要用的指令所作的准备:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py record --help
No output — tool completed successfully.

Tool Output

usage: bookkeeping.py record [-h] [--type {expense,income}] --amount AMOUNT
[--category CATEGORY] --description DESCRIPTION
[--note NOTE] [--date DATE] [--currency CURRENCY]
[--source-text SOURCE_TEXT] [--strict-category]

options:
-h, --help show this help message and exit
--type {expense,income}
Transaction type
--amount AMOUNT Positive amount
--category CATEGORY Category name
--description DESCRIPTION
Short description
--note NOTE Additional note
--date DATE Occurrence date in YYYY-MM-DD
--currency CURRENCY Currency code
--source-text SOURCE_TEXT
Original natural-language prompt
--strict-category Require the category to match an active predefined
category

在了解了所有的命令之后,他直接调用了命令,他也能清晰的理解 “记账 今天我喝了10元的奶茶” 里面的记账是触发词汇,不需要记录在所谓的参数 source-text 里面:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py record --type expense --amount 10 --description "喝奶茶" --source-text "今天我喝了10元的奶茶"
No output — tool completed successfully.

最后成功插入到数据库之中:

{
  "ok": true,
  "command": "record",
  "db_path": "/home/ubuntu/.local-bookkeeping/bookkeeping.db",
  "entry": {
    "id": 1,
    "type": "expense",
    "amount": "10.00",
    "amount_cents": 1000,
    "currency": "CNY",
    "category": "未分类",
    "description": "喝奶茶",
    "note": null,
    "occurred_on": "2026-03-16",
    "source_text": "今天我喝了10元的奶茶",
    "created_at": "2026-03-15T16:37:10Z",
    "category_matched_active_category": false
  }
}

最后返回给用户:

记账成功!

项目

内容

金额

¥10.00

描述

喝奶茶

分类

未分类

日期

2026-03-16

分类显示"未分类",如果你想预设分类(比如"日常""餐饮"),可以告诉我,我来设置。

2.4 Skill的触发:设置分类功能

同样的,如果我们输入 "我想要预设分类 参与 娱乐 工作 请帮我设置", 这是skill里面的另一个功能的时候,他会首先去查 bookkeeping.py的help是什么,但是由于我们上下文里面记录了这件事情,所以他会直接去查set-categories 的help是什么:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py set-categories --help
No output — tool completed successfully.
usage: bookkeeping.py set-categories [-h] [--replace] names [names ...]

positional arguments:
names Category names

options:
-h, --help show this help message and exit
--replace Replace the active category set

得到相应的参数之后,那么就会执行命令,最终也成功入库:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py set-categories --replace 日常 娱乐 工作
No output — tool completed successfully.
{
  "ok": true,
  "command": "set-categories",
  "db_path": "/home/ubuntu/.local-bookkeeping/bookkeeping.db",
  "replace": true,
  "categories": [
    {
      "id": 1,
      "name": "日常",
      "is_active": true,
      "sort_order": 0,
      "created_at": "2026-03-15T16:38:04Z",
      "updated_at": "2026-03-15T16:38:04Z"
    },
    {
      "id": 2,
      "name": "娱乐",
      "is_active": true,
      "sort_order": 1,
      "created_at": "2026-03-15T16:38:04Z",
      "updated_at": "2026-03-15T16:38:04Z"
    },
    {
      "id": 3,
      "name": "工作",
      "is_active": true,
      "sort_order": 2,
      "created_at": "2026-03-15T16:38:04Z",
      "updated_at": "2026-03-15T16:38:04Z"
    }
  ]
}

然后返回给用户:

分类设置完成!

分类

日常

娱乐

工作

现在记账时可以指定分类了,比如:

  • 记账 喝奶茶10元 分类日常

  • 记账 看电影50元 分类娱乐

2.5 Skill的触发:不存在的功能

当然我们的script里面可能会有不存在的功能,那么如果我们强制让openclaw去调用一些不存在的功能会发生什么事情呢?这也是我为什么觉得直接让openclaw去自己写skill的时候会发生的事情,我不太相信他能够把 create skill/ update skill/ read skill/ 和 delete skill这件pipeline能够做的这么顺利,我还是更偏向于人工的创建/更新/审查和删除。

当我输入 ”帮我查看我今天的账单“, 他应该是查不到的,因为我只写了查询月份的,虽然这只是一条sql命令的变换,但是我确实没有写这个功能,然后AI也大概没有默认自己可以创建sql,(说实话我觉得这个还是挺安全的,毕竟数据库这个东西还是需要一点authorization 和 authentication的control的)

AI这里看见我的skill.md 里面并没有 查看每日的账单,只有一个查询月份的账单,所以自动把我本来的需求 查询今日的账单 变成了 查询本月的账单:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py list-transactions --date 2026-03
No output — tool completed successfully.

但是他这个地方的参数写错了,估计是我本来想查看的是日 所以它写成了date 但是又不知道是什么原因让她把今天的具体日期 又换成了月 2026-03,从这里可以看出来AI 某些执行边界非常的模糊,一些地方还是需要hard code 人为的coding去控制才可以。

{
  "status": "error",
  "tool": "exec",
  "error": "usage: bookkeeping.py [-h] [--db DB]\n                      {init-db,list-categories,set-categories,record,list-transactions,recent-transactions,latest-entry,month-report,update-entry,delete-entry,delete-latest-entry,delete-category}\n                      ...\nbookkeeping.py: error: unrecognized arguments: --date 2026-03\n\nCommand exited with code 2"
}

得到报错之后,openclaw回去再次查询 help 究竟这个查询命令是是怎么样的:

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py list-transactions --help
No output — tool completed successfully.
usage: bookkeeping.py list-transactions [-h] [--month MONTH]
[--type {expense,income}]
[--category CATEGORY] [--limit LIMIT]

options:
-h, --help show this help message and exit
--month MONTH Target month in YYYY-MM; defaults to the current month
--type {expense,income}
Optional type filter
--category CATEGORY Optional category filter
--limit LIMIT Maximum number of entries to return

然后使用正确的查询每月的命令,查询3月

exec
Command: python3 ~/.openclaw/skills/local-bookkeeping/scripts/bookkeeping.py list-transactions --month 2026-03
No output — tool completed successfully.
{
  "ok": true,
  "command": "list-transactions",
  "db_path": "/home/ubuntu/.local-bookkeeping/bookkeeping.db",
  "month": "2026-03",
  "start_date": "2026-03-01",
  "end_date_exclusive": "2026-04-01",
  "type_filter": null,
  "category_filter": null,
  "limit": 100,
  "entries": [
    {
      "id": 2,
      "type": "expense",
      "amount": "100.00",
      "amount_cents": 10000,
      "currency": "CNY",
      "category": "工作",
      "description": "工作用文具",
      "note": null,
      "occurred_on": "2026-03-16",
      "source_text": "我刚刚买了100元的工作用文具",
      "created_at": "2026-03-15T16:41:38Z"
    },
    {
      "id": 1,
      "type": "expense",
      "amount": "10.00",
      "amount_cents": 1000,
      "currency": "CNY",
      "category": "日常",
      "description": "喝奶茶",
      "note": null,
      "occurred_on": "2026-03-16",
      "source_text": "今天我喝了10元的奶茶",
      "created_at": "2026-03-15T16:37:10Z"
    }
  ]
}

然后openclaw返回给用户:

📋 2026年3月账单(共2笔)

日期

分类

金额

描述

2026-03-16

工作

¥100.00

工作用文具

2026-03-16

日常

¥10.00

喝奶茶

本月总计:¥110.00

总结

其实就两点

  1. 养龙虾可以养,但是skill还是得自己写,要养的“科学”。

  2. 对于一些很“严格”的任务,还是要coding,因为AI他即使报错了你也很难发现,同时他如果做不了他会对问题的精确度进行降级,比如你本来查的是一天的,但是他却给你降级为一个月的,这样的误差对于一些财务/或者更加精密的行业还是挺危险的,想想看一天的消费流水和一个月的消费流水本来就是很大的东西。

参考

[1] 自己

[2] ChatGPT

立志做一个有趣的碳水化合物。