前言
最近,在做一些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一般被放于不同的地址:
所以我们的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
}
}最后返回给用户:
✅ 记账成功!
分类显示"未分类",如果你想预设分类(比如"日常""餐饮"),可以告诉我,我来设置。
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笔)
本月总计:¥110.00
总结
其实就两点
养龙虾可以养,但是skill还是得自己写,要养的“科学”。
对于一些很“严格”的任务,还是要coding,因为AI他即使报错了你也很难发现,同时他如果做不了他会对问题的精确度进行降级,比如你本来查的是一天的,但是他却给你降级为一个月的,这样的误差对于一些财务/或者更加精密的行业还是挺危险的,想想看一天的消费流水和一个月的消费流水本来就是很大的东西。
参考
[1] 自己
[2] ChatGPT