OpenClaw技能开发入门:为百川2-13B-4bits模型定制专属自动化模块
OpenClaw技能开发入门:为百川2-13B-4bits模型定制专属自动化模块
1. 为什么需要自定义OpenClaw技能?
去年冬天,我每天早晨都要手动查询天气来决定穿什么衣服。直到有一天,我突发奇想:能不能让OpenClaw自动完成这个任务?于是开始了我的第一个技能开发尝试——为百川2-13B模型定制天气查询模块。
开发自定义技能的核心价值在于:
- 解决个性化需求:通用模型无法覆盖所有场景,比如我的"穿衣建议"需要结合当地天气和衣柜库存
- 降低Token消耗:专用技能通过结构化参数调用API,比让大模型自由发挥更节省资源
- 复用工程资产:开发好的技能可以发布到ClawHub社区,形成正向循环
2. 开发环境准备
2.1 基础工具链
我的开发环境组合是:
- 一台搭载RTX 3060的Ubuntu笔记本(显存刚好够跑百川2-13B-4bits)
- VS Code + OpenClaw官方插件
- 已部署的百川模型WebUI服务(默认端口7860)
# 验证环境 curl http://localhost:7860/api/v1/chat -X POST \ -H "Content-Type: application/json" \ -d '{"model":"baichuan2-13b","messages":[{"role":"user","content":"你好"}]}'2.2 技能脚手架安装
OpenClaw提供了标准的技能开发模板:
npx @openclaw/cli new skill weather-query cd weather-query && npm install目录结构说明:
. ├── package.json # 技能元数据 ├── skill.json # 技能注册配置 ├── src │ ├── index.ts # 主逻辑 │ └── types.ts # 类型定义 └── test # 测试用例3. 对接百川模型API
3.1 理解百川的对话协议
百川2-13B的API与OpenAI协议略有不同,需要特别注意:
interface BaichuanMessage { role: 'user' | 'assistant'; content: string; } interface BaichuanRequest { model: string; messages: BaichuanMessage[]; temperature?: number; }3.2 实现天气查询逻辑
我在src/index.ts中封装了专用方法:
async function queryWeather(location: string): Promise<string> { const prompt = `你是一位专业气象学家。请用中文回答${location}未来24小时的天气情况,包含温度、降水概率、风速。如果无法获取该地区数据,请明确说明。`; const response = await fetch('http://localhost:7860/api/v1/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'baichuan2-13b', messages: [{ role: 'user', content: prompt }], temperature: 0.7 }) }); const data = await response.json(); return data.choices[0].message.content; }4. 设计技能交互协议
4.1 定义技能描述文件
skill.json是技能的"身份证",我的配置如下:
{ "name": "weather-query", "description": "基于百川大模型的天气查询技能", "author": "yourname", "version": "0.1.0", "triggers": ["天气", "weather"], "parameters": { "location": { "type": "string", "required": true, "description": "需要查询的城市/地区名称" } } }4.2 实现核心处理逻辑
主入口需要处理两种场景:
- 直接指令调用:"/weather 北京"
- 自然语言触发:"今天上海天气怎么样"
export default async function (ctx: SkillContext) { const { text, parameters } = ctx; // 提取地点参数 let location = parameters?.location; if (!location && text) { // 从自然语言中提取地点 const extractResp = await fetch('http://localhost:7860/api/v1/chat', { method: 'POST', body: JSON.stringify({ model: 'baichuan2-13b', messages: [{ role: 'user', content: `请从以下文本中提取地名作为JSON输出:${text}` }] }) }); location = (await extractResp.json()).choices[0].message.content; } if (!location) { return { text: '请提供需要查询的地点名称' }; } try { const weatherInfo = await queryWeather(location); return { text: weatherInfo, markdown: `## ${location}天气情况\n${weatherInfo}` }; } catch (error) { return { text: `查询失败: ${error.message}` }; } }5. 测试与调试技巧
5.1 本地测试模式
OpenClaw CLI提供了便捷的测试命令:
openclaw skills test ./weather-query \ --text "明天杭州天气怎么样" \ --params '{"location":"杭州"}'5.2 调试百川模型输出
我发现百川有时会返回过于冗长的解释,通过修改prompt工程优化:
const prompt = `用最简练的语言报告${location}天气,格式: 城市:[地点] 温度:[数值]℃ 降水概率:[数值]% 风速:[数值]级 建议:[1条]`;6. 部署与使用
6.1 安装到OpenClaw
开发完成后,通过link方式安装到本地环境:
cd weather-query npm link openclaw skills link weather-query6.2 实际使用示例
现在可以通过多种方式调用:
- Web控制台:输入"/weather 北京"
- 飞书机器人:@机器人 "广州今天会下雨吗"
- 命令行:
openclaw exec weather --location=上海
7. 进阶优化方向
在后续迭代中,我为这个技能增加了这些特性:
- 缓存机制:相同地点1小时内不重复查询
- 多数据源:当百川返回"不清楚"时自动切换至和风天气API
- 穿衣建议:根据温度区间推荐搭配方案
// 示例:扩展穿衣建议 function getClothingAdvice(temp: number): string { if (temp > 28) return "建议穿短袖、短裤等夏装"; if (temp > 20) return "建议穿衬衫、薄外套等春秋装"; return "建议穿羽绒服、毛衣等冬装"; }开发自定义技能最有趣的地方在于,你可以像搭积木一样不断扩展AI的能力边界。我的天气查询模块从最初的简单功能,现在已经发展成包含空气质量监测、出行建议的综合性生活助手。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
