返回列表 发布新帖
查看: 1098|回复: 0

蓝海AIoT一站式工作台 | 自定义技能开发实践

41

主题

0

回帖

0

积分

网站编辑

积分
0
发表于 2026-7-22 11:10:45 | 显示全部楼层 |阅读模式 来自 浙江杭州
借助 AI 生成 IoT 代码效率显著提升,但随意输出、协议参数 “凭空猜测”,往往大幅增加后期联调成本。针对这一痛点,萤石蓝海 AIoT 一站式工作台支持自定义专属 Skill。合理规划 Skill 规则与知识库,能够约束 AI 严格遵循接口文档与设备协议,产出规范、可落地的业务代码。

技能(Skill)的介绍

技能(Skill)是一双能替开发者落地执行的实操之手,不是一段要运行的代码。在项目对话框的技能选择入口里勾选某个技能,就能把它“喂”给 AI。技能里的调用规范会注入到 AI 的上下文,之后再用自然语言描述需求,AI就会照着这份说明书生成代码,而不是凭空猜。

1.1 最大的误区:写技能 ≠ 开发软件

这是新手最容易踩的坑。技能里通常不需要写一个可以独立运行、需要部署的程序。它的产物是结构化的文字说明(Markdown 为主),核心是讲清楚:“要用这个能力,接口怎么调、参数怎么填、返回长什么样?” 输入的是“说明书”,AI 才是根据说明书写代码的“人”。

1.2 技能能解决什么问题

用 AI 生成应用时,最常见的问题不是AI不会写代码,而是它不知道接口/协议的真实规范。比如,端口是多少、字段顺序如何、地址要不要偏移、异常怎么判断。它只能猜,猜错了就反复改都对不上。

而技能,就是把这些规范固化下来,让AI一次性写对。

1.3 什么时候该自己写技能

平台已内置一批技能(萤石设备控制、云存储、Web 视频播放、消息推送、视觉模型等)。当内置技能覆盖不了业务需求时,就需要自己写:
  • 自有设备的私有通信协议
  • 内部系统的业务 API
  • 特定行业协议(如 Modbus、BACnet、GB/T 等)
  • 专有的数据格式、编解码规则


技能的组成

一个技能是一个目录,核心是一份 SKILL.md,可选带若干附属目录。
your-skill/├── SKILL.md              

# 核心:技能主入口和骨架(必需)├── references/           
# 分主题的详细规范文档,按需读取(可选)├── scripts/              
# 可直接复用的编解码/工具脚本(可选)└── assets/               
# 模板、配置样例、测试数据等资源(可选)

2.1 核心文件

技能的主入口,AI 激活技能时首先读它。它给出全貌:这个技能是什么、何时用、核心概念、调用规范、参数、示例、注意事项。

2.2 附属目录

0714附属目录.png
2.3 一份合格 SKILL.md的五块内容

无论技能多简单,输入的“说明书”正文都应覆盖:
  • 能力说明:这个技能能做什么、边界在哪
  • 调用/协议规范:怎么连、怎么调
  • 参数定义:每个参数含义、必填/选填、取值范围
  • 调用示例:请求样例 + 返回样例
  • 注意事项:易错点、边界、经验


写好 Frontmatter:让 AI 知道“何时该用”

SKILL.md顶部是一段 YAML frontmatter,决定技能是否会被识别和触发。这是最关键、也最容易被写差的部分。

官方规范只定义 6 个字段:必填 name、description,可选 license、compatibility、metadata、allowed-tools。没有所谓的“触发模式”开关—技能是靠 description被模型自动发现并加载的,写好 description 就等于写好了触发条件。
---name: modbus-protocoldescription: Modbus 工业通信协议对接。当用户提到 "Modbus"、"RTU"、"TCP"、"读写寄存器"、"功能码"、"PLC 通信" 时使用此 Skill。---

3.1 name命名规范

  • 全小写,单词间用连字符 -
  • 语义清晰,见名知意:modbus-protocol、ezviz-device-control
  • 不要用空格、中文、大写


3.2 description 的黄金写法:能力概述 + 触发词

description 不是给人看的简介,而是 AI 判断“这个场景该不该激活本技能”的依据。写法 = 一句能力概述 + 明确的触发词/触发场景。

为什么触发词决定成败:AI 靠 description 里的关键词匹配用户意图。触发词写的全面,用户随口一说就能命中;写的宽泛,技能就难以建立识别路径。

好的写法(有具体触发词):
  • Modbus 工业通信协议对接。当用户提到 "Modbus"、"RTU"、"TCP"、
  • "读写寄存器"、"功能码"、"PLC 通信"、"RS-485 设备通信" 时使用此 Skill。


差的写法(太泛,AI 不知道何时用):
帮助进行设备通信。

触发词怎么选:想想用户会怎么说—协议名、同义词、场景词、典型操作词都列上。

3.3 可选字段与“如何被触发”

技能没有inclusion之类的模式开关。它的加载机制是:模型读所有已安装技能的 description,判断与当前任务是否相关,相关就自动加载正文(不相关时几乎不占 token)。所以“何时触发”完全由 description 决定,这也是 3.2 强调触发词的原因。

几个可选字段(按需使用,不用则省略):

0714-3.3.png 0714-3.3.png

在蓝海 AIoT 一站式工作台里,还可以在项目对话框的【技能选择入口】主动勾选某个技能,把它拉进上下文。这是平台提供的“手动引用”入口,和“模型自动发现”并不冲突—好的 description 两种方式下都更可靠。

写好 SKILL.md 正文:把“怎么接入”讲清楚

正文按第 2.3 节的五块展开。核心原则:信息密度 > 篇幅,能用表格和示例说清的就不要长篇大论。

4.1 能力说明:先给全貌与边界

开门见山说清能做什么、不做什么。边界写清楚能避免 AI 越界生成。

本 Skill 帮助在应用中正确实现 Modbus 协议通信,覆盖 RTU / ASCII / TCP三种传输模式,提供功能码定义、帧格式、CRC/LRC 校验、异常处理及可复用编解码代码。

本 Skill 只负责协议编解码,不含具体串口/socket 收发实现。

4.2 核心概念速览:陌生协议先建心智模型

接入一个陌生协议,AI(和读代码的人)都需要先有心智模型。用表格把概念固化下来最有效。

Modbus 是请求/响应协议,采用主从模型。四类数据模型:| 数据块 | 访问 | 单位 | 典型功能码 | 地址惯例 ||--------|------|------|-----------|---------|| Coils(线圈) | 读写 | 1 bit | 01 读 / 05,15 写 | 0xxxx || Discrete Inputs | 只读 | 1 bit | 02 读 | 1xxxx || Input Registers | 只读 | 16 bit | 04 读 | 3xxxx || Holding Registers | 读写 | 16 bit | 03 读 / 06,16 写 | 4xxxx |

4.3 调用/协议规范:怎么连、怎么调

写清协议分层、地址、端口、鉴权、请求-响应格式。协议类要精确到字节 / 位 / 字段顺序。

ADU = 地址/头 + PDU + 校验PDU = 功能码(1B) + 数据(NB)
先构造 PDU,再按传输模式包装成 ADU:RTU:| 从站地址 1B | PDU | CRC16 2B(低字节在前)|TCP:| MBAP 头 7B | PDU |,默认端口 502

4.4 参数定义:用表格锁死每个参数

读保持寄存器(功能码 0x03)参数:
| 参数 | 必填 | 类型 | 取值范围 | 说明 ||------|------|------|----------|------|| slave_addr | 是 | int | 1–247 | 从站地址,0 为广播 || start_addr | 是 | int | 0–65535 | 协议地址,从 0 开始 || quantity | 是 | int | 1–125 | 读取寄存器个数 |

4.5 调用示例:给可直接套用的样例

示例是 AI 复用率最高的部分。给请求 + 返回 + 结果解读。

读从站 0x11 的保持寄存器,起始地址 0,读 1 个:请求帧:[11] [03] [0000] [0001] [CRC低] [CRC高]返回帧:[11] [03] [02] [01 F4] [CRC低] [CRC高]解读:字节数=2,值=0x01F4=500,若手册说 ÷10,则温度=50.0°C

4.6 注意事项:把坑写在前面

把你踩过的坑、边界、经验固化下来。这是资深经验的沉淀,价值极高。

地址偏移:手册写 40001 → 协议发 0x0000(减掉基址)字节序:CRC 低字节在前,与寄存器大端相反异常判断:响应功能码最高位 = 1 表示出错,后跟异常码优先用成熟库(pymodbus / libmodbus),别手写协议栈
面向“代码接入特定协议”的实战写法

这是把技能从“AI 能看懂”升级到“AI 能据此写出可用接入代码”的关键一步。

5.1 为什么协议接入类技能必须拆附属文件

协议规范往往很长(功能码几十个、帧格式好几种、异常码一大表)。如果全塞进 SKILL.md:
  • 上下文一次性膨胀,挤占了描述需求的空间,反而降低生成质量
  • AI 每次都要读全部,效率低

正确做法:SKILL.md 给全貌 + 索引,细节下沉到 references/,AI 按需读取。

5.2 references/ 怎么写

按主题拆分,一个主题一个文件,职责单一:

references/├── frame-formats.md      # 三种传输模式的帧格式、CRC/LRC 算法├── function-codes.md     # 每个功能码的 PDU 结构、参数、示例└── troubleshooting.md    # 异常码、常见故障与排查

关键要求:内容要“可被 AI 直接翻译成代码”
  • 精确到字节、位、字段顺序,不留模糊
  • 用表格 / 伪代码固化规则,减少歧义
  • 每个字段标清长度、字节序、取值范围


反面教材:“CRC 放在帧尾”——AI 不知道 2 字节还是 1 字节、什么字节序。

正面写法:

| 字段 | 字节 | 说明 ||------|------|------|| CRC | 2 | 低字节在前,高字节在后(little-endian) |

5.3 scripts/ 怎么写

对于有固定算法的协议(校验、编解码、帧构造),给一份可运行的参考代码作为“算法范本”,让 AI 据其逻辑生成,而不是凭空重写——重写极易出错。

写法要点:
  • 因为新建项目的语言由平台固定,脚本主要作为算法逻辑的权威参照:AI 会把它翻译到目标语言,未必原样照搬。所以要把算法步骤和字节级细节写清楚,可翻译性比“能直接跑”更重要
  • 零依赖或最小依赖,纯标准库优先,逻辑清晰易读
  • 每个函数写清用途、参数、返回、字节序
  • 附带用法示例
  • 顶部注释说明适用场景(如“受限环境或需逐字节掌控时用,否则优先成熟库”)

例如 scripts/modbus_codec.py 里的 CRC 实现:

def crc16(data: bytes) -> int:"""计算 Modbus RTU CRC16(多项式 0xA001,初值 0xFFFF)。"""   crc = 0xFFFFfor byte in data:       crc ^= bytefor _ in range(8):if crc & 0x0001:               crc = (crc >> 1) ^ 0xA001else:               crc >>= 1return crc & 0xFFFFdef crc16_bytes(data: bytes) -> bytes:"""返回 RTU 帧尾 CRC 的 2 字节,低字节在前。"""return struct.pack("<H", crc16(data))

有了这段脚本,AI 生成接入代码时会直接调用它,CRC 一次就对。

5.4 assets/ 怎么写

放静态、可复制的资源,减少 AI 编造:
  • 连接参数模板(串口 8E1、TCP 端口 502 等默认值)
  • 配置文件样例
  • 测试数据 / 样例帧


5.5 主文件与附属文件的引用/索引方式

在 SKILL.md 里明确列出“何时读哪个文件”,这样 AI 才知道去哪找细节:

## 参考文件(按需深入阅读)- 需要具体功能码的 PDU 结构 → 读 references/function-codes.md- 需要封装成可传输的帧(含 CRC/LRC)→ 读 references/frame-formats.md- 遇到异常响应或通信故障 → 读 references/troubleshooting.md- 需要现成编解码代码 → 用 scripts/modbus_codec.py

5.6 协议接入通用要点清单

写任何协议接入技能,这些点都建议覆盖:
  • 字节序:大端/小端,多字节数值跨字段的顺序
  • 地址偏移:文档地址 vs 协议地址的换算
  • 超时与重试:无响应怎么办
  • 异常响应:如何判断和解析错误码
  • 帧定界 / 粘包:怎么切分一帧
  • 成熟库优先:列出各语言推荐库,避免不必要的手写


完整范例:写一个“协议接入”技能

6.1 目录结构

modbus-protocol/├── SKILL.md├── references/│   ├── frame-formats.md│   ├── function-codes.md│   └── troubleshooting.md└── scripts/└── modbus_codec.py

6.2 SKILL.md(骨架示意)
---name: modbus-protocoldescription: Modbus 工业通信协议实现指南。当用户需要与 PLC、RTU、传感器、 电表、变频器通信,或提到 "Modbus"、"RTU"、"ASCII"、"TCP"、"线圈"、"保持寄存器"、"功能码"、"CRC16"、"读写寄存器" 时使用此 Skill。---# Skill: Modbus 工业通信协议## 能力说明本 Skill 帮助在应用中正确实现 Modbus 通信,覆盖 RTU / ASCII / TCP。只负责协议编解码,不含实际串口/socket 收发。## 何时使用- 与工业设备(PLC、仪表、传感器)通信- 读写线圈、离散输入、保持寄存器、输入寄存器## 核心概念速览(四类数据模型表格、PDU/ADU 分层、字节序说明)## 实现工作流

1. 确定角色(主站/从站)
2. 确定传输模式(RTU/ASCII/TCP)
3. 确定通信参数
4. 优先用成熟库
5. 构造 PDU → 包装 ADU → 收发 → 校验 → 解析## 优先使用成熟库Python: pymodbus / minimalmodbus;C: libmodbus;...## 参考文件(按需深入阅读)- 功能码细节 → references/function-codes.md- 帧格式与 CRC → references/frame-formats.md- 异常与排查 → references/troubleshooting.md- 现成编解码代码 → scripts/modbus_codec.py## 注意事项- 地址偏移:40001 → 0x0000- CRC 低字节在前- 异常码:响应功能码最高位=1

6.3 references/frame-formats.md(片段)

## Modbus RTU| 从站地址 1B | PDU | CRC16 2B || 字段 | 字节 | 说明 ||------|------|------|| 从站地址 | 1 | 1–247(0 广播) || CRC | 2 | 低字节在前,高字节在后 |帧定界:靠静默间隔,帧前后静默 ≥ 3.5 字符时间(T3.5);波特率 > 19200 时 T3.5 固定取 1.750ms。

6.4 scripts/modbus_codec.py(片段)

见第 5.3 节的 crc16 / crc16_bytes,另含 lrc、pdu_read、RTU/ASCII/TCP 帧构造与解析,零依赖纯标准库,可直接复用。

6.5 使用效果

用户在项目里勾选 modbus-protocol 技能后,描述需求:
  • 读取 1 号从站保持寄存器 40001 的温度,串口 COM3,9600 8N1,
  • 值除以 10,在页面上展示


AI 就会照着技能:用平台当前项目的语言/框架生成代码,并把地址偏移到 0、正确处理字节序和缩放、按需选用对应语言的成熟库,一次写对。

注意:新建项目时平台会固定应用的开发语言/框架(不可随意指定,如不能强行要求用 Python 写应用)。因此技能应尽量写成语言中立的协议/接口规范——描述“协议规则”而非“某语言实现”,AI 才能按平台实际栈落地。scripts/ 里的参考代码是“算法范本”,AI 会据其逻辑翻译到目标语言,未必原样照搬。

创建、上传与验证

  • 新建技能:按第六章的目录结构组织文件,SKILL.md必需。
  • 上传:在工作台的技能管理入口上传技能目录。
  • 引用:在项目对话框点击选择技能,选中你的技能,其调用规范即注入上下文。
  • 验证:给一个真实接入需求,看 AI 生成的代码是否贴合你的协议规范(端口、地址、字节序、异常处理是否都对)。不对就回到技能里补充规范或示例,再验证。


检查清单 + 常见问题

8.1 提交前自查清单

  • frontmatter 的 name 规范(≤64 字符、小写/数字/连字符)、description 含明确触发词
  • 没有误写 inclusion 等非规范字段;可选字段(allowed-tools 等)按需使用
  • 五块内容齐全:能力说明 / 调用规范 / 参数 / 示例 / 注意事项
  • 协议细节精确到字节、位、字段顺序,无歧义
  • 有可直接套用的调用示例(请求 + 返回 + 解读)
  • 长规范已拆到 references/,主文件有“何时读哪个文件“的索引
  • 固定算法提供了 scripts/ 可复用代码
  • 注意事项写清了坑(字节序、地址偏移、异常判断等)


8.2 FAQ

Q:技能没被触发怎么办?
A:多半是 description 触发词不够。把用户可能说的关键词、同义词、场景词补全。

Q:AI 生成的代码不贴合规范怎么办?
A:说明规范写得不够具体。把出错的那部分(如字节序、地址偏移)用表格/示例固化,尤其补一个正确的调用示例。

Q:技能太长导致效果变差怎么办?
A:按主题把细节拆到 references/,SKILL.md 只留全貌和索引,让 AI 按需读取。

Q:写技能要会编程吗?
A:核心是“把规范讲清楚”,主要写 Markdown。只有 scripts/ 才涉及代码,且多为可复用的参考实现,不是必需项。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by 【杭州赋睿科技有限公司】 萤石用户社区(浙ICP备2024101974号-2) 使用条款 | 隐私政策 | 经营许可
关灯 返回顶部
快速回复 返回顶部 返回列表