Appearance
OpenClaw × Aloudata CAN:两个 Skill 让 AI 学会查数和归因
全网都在教小龙虾点外卖,我们让它算清了 GMV 为什么跌。这篇文章是配套的上手指南——从安装到提问到进阶调教,手把手带你跑通。
OpenClaw GitHub: https://github.com/OpenClawAI/openclaw
我们把小龙虾接上了 Aloudata CAN 语义层。六轮对话,从「上月销售额多少」一路追到「江西电商渠道销售额环比下降 67%,主因是购买用户数从 28 断崖式跌到 8」,最后还自动生成了一份带因子拆解、城市下钻的 HTML 归因报告。
这篇文章主要回答看完 Demo 之后你大概率会问的三个问题:
- 我自己能跑起来吗?——能,十分钟以内。
- 它到底是怎么做到的?——两个 Skill + Aloudata CAN 语义层 API,不是魔法。
- 我能改它、甚至自己写新的 Skill 吗?——能,而且这才是最有价值的部分。
01 | 十分钟跑起来
你需要准备什么
- 已安装的 OpenClaw(能正常对话)
- Aloudata CAN Demo 环境 API Key(文末申请)
安装步骤
第一步:装 Skill
两个 Skill 已经发布到 ClawHub,用你自己习惯的方式来安装:
- metric-query: https://clawhub.ai/jackyujun/metric-query
- metric-attribution: https://clawhub.ai/jackyujun/metric-attribution
安装过程中如果出现安全提示,点击「仍然安装」即可(这是因为 Skill 需要 API Key 但未在配置中声明,不影响正常使用)。
第二步:配置 API Key
Skill 通过 Aloudata CAN Gateway 访问数据,Gateway 需要 API Key 做认证。把你的 Key 写到 OpenClaw 的环境变量文件 ~/.openclaw/env 里:
bash
CAN_API_KEY=cgk-你的Key写好后,重启 OpenClaw,然后开一个新 session。旧 session 不会自动拿到新的环境变量。
Skill 调用 Gateway 时会通过 X-API-Key 请求头自动带上这个 Key。Key 不会出现在 Skill 文件或对话记录中。
第三步:开始问问题
就这么简单。试试:「上月销售额是多少?」
你会连到什么数据
Demo 环境是一个零售场景的数据集:
| 类型 | 数量 | 示例 |
|---|---|---|
| 指标 | 54 个 | 销售额、客单价、购买用户数、UV、转化率等 |
| 维度 | 58 个 | 渠道、省份、城市、品牌、品类、性别等 |
数据涵盖多个月份,足够你做各种同环比和归因分析。你可以直接问小龙虾「有哪些指标和维度?」,它会给你列明。
不用担心「问错了」——语义层已经定义好了所有指标的口径和计算逻辑,你用自然语言问,它翻译成结构化查询,不存在「写错 SQL」的可能。
02 | 两个 Skill,各管一件事
很多人看完 Demo 以为这是一个大而全的「AI 分析师」Agent,其实不是。我们拆成了两个 Skill,各司其职:
metric-query:问数的 Skill
这个 Skill 只做一件事——把你的自然语言翻译成语义层的指标查询 API 请求。
你说「上月各渠道的销售额和环比」,它做的事情是:
| 步骤 | 操作 |
|---|---|
| 1 | 调 Aloudata CAN 搜索 API,找到「销售额」对应的指标名 retail_amt |
| 2 | 调 Aloudata CAN 维度 API,确认「渠道」对应的维度名 first_channel |
| 3 | 构造一条结构化的 JSON 请求 |
| 4 | 发给指标查询 API,拿回数据 |
| 5 | 用自然语言把结果告诉你 |
注意第 1 和第 2 步——它不是凭记忆猜指标名和维度名的。每次查询前,它都会先去 Aloudata CAN 语义层的 Gateway 搜索,确认指标和维度确实存在。这就是为什么它不会「幻觉」出一个不存在的指标。
这个 Skill 支持的查询能力覆盖:
| 能力 | 说明 |
|---|---|
| 基础查询 | 单指标/多指标查询 |
| 同环比 | 年/季/月/周/日同比环比 |
| 占比 | 维度内占比计算 |
| 排名 | 按指标值排序 |
| 维度筛选 | 按维度值过滤 |
| 结果筛选 | 按指标值过滤 |
| 临时指标定义 | 计算派生指标 |
| 时间限定 | 相对/绝对时间范围 |
| 多层聚合 | 多维度交叉分析 |
metric-attribution:归因的 Skill
这个 Skill 是一个诊断流程的编排器。当你问「为什么跌了」,它不是调一次 API 就完事,而是按照一套诊断逻辑走多个步骤:
Step 1 → 确认波动事实:变了多少?跟什么比?
Step 2 → 因子拆解:哪个业务环节出了问题?(如 销售额 = 用户数 × 客单价)
Step 3 → 维度归因:问题集中在哪个渠道、哪个地区、哪个品类?
Step 4 → 外部事件关联:有没有天气、促销、政策等外部因素?
Step 5 → 综合诊断报告:把所有发现串成一条因果链每一步都会调用 metric-query 的查询能力取数据,然后在本地做归因计算(包括 Shapley 值分解),最后汇总成报告。
视频里那份深色主题的 HTML 归因报告,就是 Step 5 的产出。
为什么要拆成两个 Skill?
因为查数和归因是两个频率完全不同的操作。
| 操作 | 频率 | 重量 |
|---|---|---|
| 查个数 | 日常 80% | 轻量、快速、一问一答 |
| 挖原因 | 发现异常时 20% | 重量、多步、完整诊断 |
拆开之后,简单问题不走复杂流程,复杂问题有专门的方法论。这个原则不只适用于数据分析,适用于所有 Skill 设计。
03 | 怎么问,效果最好
装好 Skill 之后,你会发现「怎么问」直接决定了回答的质量。这里是我们测试过程中总结的提问技巧:
查数:说清楚四件事
小龙虾内部会把你的问题拆解成四个维度,你说得越清楚,它翻译得越准:
好的提问:
上月各一级渠道的销售额环比及占比情况如何?按占比从高到低排序。
效果一般的提问:
数据怎么样?
太模糊了,小龙虾不知道你要看什么指标、什么时间、什么维度,只能"虾"猜。
归因:给它一个业务公式
如果你要做归因分析,最有效的做法是直接把业务公式告诉它。视频里那句话就是一个好例子:
江西环比下降这么多(销售额=购买用户数×客单价),生成一个归因诊断报告
括号里的公式告诉了小龙虾:销售额可以拆成两个因子来分析。有了这个公式,它才能判断「是用户少了还是价格低了」。
如果你不给公式,它也能做维度归因(按渠道、地区等维度看贡献度),但少了因子拆解那一层,分析深度会打折扣。
追问:跟着它的建议走
你可能注意到小龙虾经常主动建议下一步——「要不要帮你看看是哪个渠道拖的后腿?」「要不要继续下钻江西?」
这不是客套话,而是它根据当前数据情况判断的合理分析方向。如果你不确定接下来问什么,跟着它的建议走通常不会错。当然你也完全可以无视它的建议,按自己的思路追问。
一些容易踩的坑
| 坑点 | 说明 |
|---|---|
| 「同比」和「环比」别混 | 「同比」默认是年同比(yoy),「环比」根据时间粒度选择(月环比=mom,周环比=wow)。如果要月同比,明确说「月同比」 |
| 不要问太笼统的排名 | 「销售额排名前 10」——什么时间段?哪个维度?没说的话会用默认策略,不一定是你想要的 |
| 筛选条件要精确 | 「按渠道筛选」但系统有「一级渠道」和「二级渠道」两个维度——不确定时先问「渠道有哪些维度和值?」 |
04 | 它背后到底调了什么 API
如果你是工程师,可能想了解得更深一些。这一节拆解 Skill 背后的 API 体系。
Gateway:所有请求的入口
两个 Skill 的所有请求都走一个 Gateway:https://gateway.can.aloudata.com
Gateway 内置了认证,你不需要在每次请求中手动传 token。Gateway 暴露了两类 API:
搜索类(用来找指标和维度):
| API | 说明 |
|---|---|
GET /api/metrics/search?keyword=销售额 | 搜指标 |
GET /api/metrics/{metricName}/dimensions | 查某个指标有哪些维度 |
GET /api/metrics/dimensions?metricNames=指标1,指标2 | 查多个指标的共同维度(交集) |
查询类(用来取数据):
| API | 说明 |
|---|---|
POST /api/metrics/query | 指标数据查询 |
整个流程就是两步:先搜后查。每次查询前都先通过搜索 API 确认指标名和维度名的正确性,避免幻觉。
一条查询长什么样
以「上月各渠道销售额及环比」为例,小龙虾构造的 JSON 请求体大概长这样:
json
{
"metrics": [
"retail_amt",
"retail_amt__sameperiod__mom__value",
"retail_amt__sameperiod__mom__growthvalue",
"retail_amt__sameperiod__mom__growth"
],
"dimensions": ["first_channel"],
"timeConstraint": "DateTrunc(['metric_time'], \"MONTH\") = DATEADD(DateTrunc(NOW(), \"MONTH\"), -1, \"MONTH\")",
"orders": [{"retail_amt__sameperiod__mom__growthvalue": "asc"}]
}核心概念解释:
| 字段 | 说明 |
|---|---|
metrics | 要查的指标。retail_amt 是销售额本身,带 __sameperiod__mom__ 后缀的是快速计算——环比值、环比变化额、环比增长率 |
dimensions | 按什么维度拆分。first_channel 是一级渠道 |
timeConstraint | 时间范围。用 NOW() 做相对时间计算,下个月再跑同一条查询,自动就是最新数据 |
orders | 排序。按环比变化额升序排,跌得最狠的排最前面 |
快速计算的命名规则
语义层的快速计算用双下划线拼接在指标名后面,像搭积木一样:
指标名__对比基准__对比方式__计算类型有一个重要限制:每个指标只能做一次快速计算,不能链式叠加。Skill 约束了小龙虾不能写类似 retail_amt__sameperiod__mom__growth__rankDense__desc__xxx(先算环比再排名)这样的代码。如果需要多步计算,会用临时指标定义(metricDefinitions)分步来做。
05 | 怎么调教和改造
如果你不只是想用现成的 Skill,而是想根据自己的业务场景调整,这一节告诉你怎么做。
看懂 Skill 的结构
Skill 本质上就是一份 Markdown 文档,里面包含了:
| 组成部分 | 说明 |
|---|---|
| 触发条件(description) | 什么时候该调用这个 Skill |
| API 信息 | 接口地址、请求格式 |
| 规则和约束(铁律) | 防止 LLM 犯常见错误的护栏 |
| 示例 | 完整的 JSON 请求体示例 |
| 常见错误模式 | 告诉 LLM 哪些坑不能踩 |
你可以把它理解成一份写给 LLM 的「操作手册」——LLM 读了这份手册,就知道怎么正确地调用 Aloudata CAN 语义层 API。
可以改什么
| 改什么 | 说明 |
|---|---|
| 触发条件 | 如果你们管销售额叫「实收」,在 description 里加上同义词 |
| 业务规则 | Skill 规定「同比」默认映射为年同比(yoy)——如果你们公司说「同比」其实是指月同比,改掉就行 |
| 归因流程 | metric-attribution 的五步诊断流程不是固定的,按需调整 |
| 报告模板 | 归因报告的结构定义在 Step 5 里,想换汇报格式直接改模板 |
怎么写一个全新的 Skill
如果你想针对自己的业务场景写一个新的 Skill——比如「毛利监控 Skill」「库存预警 Skill」——关键是想清楚三件事:
| 问题 | 说明 |
|---|---|
| 它需要调哪些 API? | 语义层 API 支持的能力是底座,你的 Skill 就是编排这些能力的「剧本」 |
| 它需要哪些护栏? | 哪些错误是 LLM 容易犯的?写进「铁律」里,防患于未然 |
| 它的输出长什么样? | 一个数字?一段文字分析?一个 Word 文档还是一份 HTML 报告? |
Skill 是纯文本文件,不需要写代码,不需要编译部署。改完之后重新加载就能生效。
06 | 已知的不完美
这个 Demo 我们没花多少时间,也没太过精心编排,Demo 和小龙虾都会有些小瑕疵,在这里坦诚说说:
| 问题 | 说明 | 应对 |
|---|---|---|
| 归因报告外部事件模块需手动配搜索 Key | Tavily 的 Key 和 Brave Search API 没对上,导致「外部事件关联」变成「待验证假设」 | 后续会修复,让搜索引擎配置更灵活 |
| 报告生成偶尔有文件路径问题 | 文件名拼写错误(attribution 少了个 t),属于 LLM 的随机性 | 直接问小龙虾「为什么打不开」,它会自己排查修复 |
| 复杂查询偶尔需要多轮纠正 | 涉及多步计算时,LLM 有时会犯链式叠加的错误,铁律能拦住大多数但不是 100% | 如果结果看起来不对,让它重新构建一次查询 |
| 定时任务目前比较基础 | 只能做到定时触发 + 生成归因报告 | 计划后续做更完善的「数据月报 Skill」 |
07 | 最后总结
最深的感受
小龙虾(OpenClaw)解决的是 Agent 的「执行力」问题——它能操作你的电脑、调用各种工具。但当我们让它去做数据分析的时候,我们发现它缺的不是手脚,而是业务常识。
「销售额」这个词,在你公司的口径里到底含不含退款?「客单价」是按订单算还是按客户算?「环比」是跟上月比还是跟上周比?
这些问题,LLM 不知道,也不该猜。语义层的价值就在于它把这些业务常识编码成了结构化的定义——指标怎么算、维度怎么分、口径怎么对——然后通过 API 暴露给 Agent。Agent 不需要懂你的业务,它只需要会调 API,语义层保证返回的数据是对的。
这就是为什么我们选择做 Skill 而不是做 Prompt。Prompt 是「教 LLM 怎么猜」,Skill + 语义层 API 是「让 LLM 不用猜」。
开始试试
| 步骤 | 链接 |
|---|---|
| 申请 API Key | Aloudata CAN Demo 环境 |
| 安装 metric-query | https://clawhub.ai/jackyujun/metric-query |
| 安装 metric-attribution | https://clawhub.ai/jackyujun/metric-attribution |
