从 0 开始:如何设计一个实用的 AI Agent 技能(附完整案例)

发布时间:2026/5/22 6:27:27

从 0 开始:如何设计一个实用的 AI Agent 技能(附完整案例) 从 0 开始如何设计一个实用的 AI Agent 技能附完整案例作者飞来城 难度⭐⭐⭐预计耗时35 分钟 为什么要学技能设计你用过各种 AI 助手后可能遇到过这些场景“这个助手什么都行但就是不能帮我查股票…”“它能写代码可我想要它自动部署…”“有个天气功能但我想要带穿衣建议的…”这时候你会意识到现成的功能不够用我需要自己定制。学会设计 AI Agent 技能就等于掌握了无限扩展的能力。本文不讲具体代码而是讲方法论——帮你建立一套可复用、可扩展的技能设计思维框架。读完你能✅ 知道一个好的技能长什么样✅ 掌握从需求到落地的完整流程✅ 避免 90% 的新手踩坑✅ 做出真正实用的技能 目录核心概念设计原则需求分析方法架构设计完整案例演示测试与优化发布与维护一、核心概念1.1 什么是技能在 AI Agent 语境下技能 能力封装单元┌─────────────────────────────────────┐ │ 技能 (Skill) │ ├─────────────────────────────────────┤ │ ┌──────────┐ ┌──────────┐ │ │ │ 触发条件 │→ │ 执行逻辑 │ →输出 │ │ └──────────┘ └──────────┘ │ │ │ │ 说明文档 (SKILL.md) │ └─────────────────────────────────────┘1.2 技能 vs 函数 vs API维度函数API技能调用方式代码直接调用HTTP 请求自然语言触发触发条件程序员决定任何人访问AI 判断时机上下文局部变量请求参数对话历史 状态容错性低需处理异常中高AI 可追问澄清1.3 技能分类体系我用这套分类法来管理所有技能技能类型矩阵 输入复杂度 低 ←─────────→ 高 ┌─────────────────────┐ 低 │ A 型 │ B 型 │ 输 │ 简单工具│ 复杂决策 │ 出 复 ├─────────┼───────────┤ 复 杂 │ │ │ 杂 度 │ C 型 │ D 型 │ 度 │ 标准化 │ 高度定制 │ │ 流水线 │ 多步编排 │ └─────────────────────┘类型特点示例A 型低进低出单一功能、即用即走天气查询、单位转换B 型高进低出复杂判断、简洁结果代码评审、风险预警C 型低进高出标准输入、丰富输出周报生成、报告导出D 型高进出深度协作、多轮交互会议记录、方案讨论二、设计原则2.1 黄金法则原则 1单职责优先❌ 错误示范// 全能助手 —— 什么都能干asyncfunctionassistant(query){if(query.includes(天气))returngetWeather();if(query.includes(新闻))returngetNews();if(query.includes(代码))returnreviewCode();// ... 还有 100 个 if}✅ 正确做法// 拆成独立技能weather-skill/SKILL.md → 说明何时调用天气功能 scripts/→ 只负责获取天气数据 news-skill/SKILL.md → 说明何时调用新闻功能 scripts/→ 只负责获取新闻数据好处易于测试和维护可以独立更新便于复用和分享原则 2边界清晰每个技能必须有明确的触发条件和退出条件## 触发条件什么时候调用 ✅ 适合调用 - 用户明确要求查询天气 - 对话涉及明天穿什么要不要带伞 ❌ 不调用 - 闲聊问候时 - 其他技能的子步骤中除非明确需要原则 3优雅降级当主要功能不可用时要有备选方案asyncfunctiongetWeather(city){try{returnawaitfetchFromPrimaryAPI(city);}catch(error){console.warn(主 API 失败尝试备用);// 备选方案 1缓存数据constcachedgetCachedWeather(city);if(cached)return{...cached,fromCache:true};// 备选方案 2友好提示return抱歉暂时无法获取天气信息请稍后再试;}}2.2 命名规范好的命名让技能一目了然格式示例适用场景动词 - 名词get-weather,send-email动作型技能名词 - 动词weather-check,code-review功能型技能领域 - 功能finance-quote,dev-git-status专业领域-lite后缀search-lite,report-lite简化版本坏名字 vs 好名字❌ tool1, mySkill, test-function ✅ weather-query, daily-summary, code-reviewer2.3 文档标准一个完整的技能文档应该包含必需项-标题 (# skill-name)-描述一句话说明功能-触发条件-使用方法示例 推荐项-配置选项-依赖说明-常见问题-版本历史 加分项-使用场景截图-与其他技能的联动说明-性能基准三、需求分析方法3.1 需求收集模板每次设计新技能前先填这张表问题你的答案痛点是什么每周写周报很烦要翻聊天记录谁有这个痛点所有打工人现有解决方案手动整理、Excel 模板为什么现有方案不够好耗时、容易漏掉重要事项理想效果是啥样输入一周记录自动生成草稿必须支持哪些输入Git 日志、会议纪要、任务列表期望输出形式Markdown 格式的周报响应时间要求30 秒内给出结果准确率达到多少80% 以上内容可用3.2 优先级评估矩阵重要程度 ↑ 高 │ ①周报生成 │ ③个性化学习 │ (必做) │ (长期价值) ├──────────────┼─────────────→ 低 │ ④天气提醒 │ ⑤随机笑话 │ (锦上添花) │ (可做可不做) └──────────────┴───────────── 低频 高频 使用频率决策规则①区立即做②区排期做③区有空再做④区暂不考虑3.3 可行性评估 checklist## 技术可行性 - [ ] 所需 API/工具已存在或可获取 - [ ] 有参考实现或类似案例 - [ ] 我的技术水平能搞定 - [ ] 没有无法解决的技术障碍 ## 业务可行性 - [ ] 确实有人需要这个功能 - [ ] 不会违反平台/公司规定 - [ ] 数据获取合法合规 - [ ] 维护成本可控 ## 综合评分★★★☆☆四、架构设计4.1 分层架构模型┌─────────────────────────────────────┐ │ 表现层 (Presentation) │ │ - 自然语言接口 │ │ - 多轮对话管理 │ │ - 格式化输出 │ ├─────────────────────────────────────┤ │ 协调层 (Coordination) │ │ - 意图识别 │ │ - 参数提取 │ │ - 技能路由 │ ├─────────────────────────────────────┤ │ 业务层 (Business) │ │ - 核心逻辑 │ │ - 数据处理 │ │ - 规则引擎 │ ├─────────────────────────────────────┤ │ 数据层 (Data) │ │ - API 调用 │ │ - 数据库查询 │ │ - 文件读写 │ └─────────────────────────────────────┘4.2 组件设计规范每个层级应该有独立的可测试组件// 数据层专注获取原始数据classWeatherDataSource{asyncgetCurrentTemp(city){/* fetch API */}asyncgetForecast(city,days){/* fetch API */}}// 业务层专注处理逻辑classWeatherService{constructor(dataSource){this.dataSourcedataSource;}asyncgetDressingAdvice(city){consttempawaitthis.dataSource.getCurrentTemp(city);returnthis.adviceByTemp(temp);}adviceByTemp(temp){if(temp10)return多穿点挺冷的;if(temp20)return外套备着;return短袖就行;}}// 协调层专注理解和路由classIntentRouter{asyncroute(userQuery){if(userQuery.includes(天气))return{skill:weather,action:query};if(userQuery.includes(穿衣))return{skill:weather,action:advice};returnnull;// 无法识别}}// 表现层专注对话体验classWeatherResponder{formatAdvice(advice){return️${advice}\n今天出门记得看看天气预报哦;}}4.3 依赖注入模式// 配置文件dependencies.jsmodule.exports{weather:{dataSource:newWeatherDataSource(),service:newWeatherService(newWeatherDataSource()),responder:newWeatherResponder()},email:{dataSource:newEmailDataSource(),service:newEmailService(),// ...}};好处各层解耦便于单元测试方便替换实现五、完整案例演示让我们用一个实际例子贯穿整个流程技能名称meeting-summarizer会议摘要生成器5.1 需求分析阶段填写需求模板问题答案痛点周会两小时纪要半小时太费时间用户团队 leader、项目经理现有方案手动记笔记、找人录音转文字不够好容易遗漏重点、整理耗时理想效果输入会议录音文本输出结构化纪要输入会议转录文本Markdown/JSON输出会议摘要 待办事项 负责人5.2 设计决策技能类型C 型低进高出-输入相对标准会议文本-输出较丰富多个板块 优先级②区高重要性、中频率-每周都会用到-显著提升效率 技术选型-核心处理JavaScript与 OpenClaw 原生兼容-NLP 部分调用大模型 API-存储本地 JSON Git 备份5.3 架构设计meeting-summarizer/ ├── SKILL.md # 触发条件和使用说明 ├── scripts/ │ ├── main.js # 入口函数 │ ├── summarize.js # 摘要生成逻辑 │ ├── extract-todos.js # 待办提取 │ ├── assign-owners.js # 负责人识别 │ └── templates.js # 输出模板 ├── data/ │ └── meeting-history.json # 历史会议存档 ├── tests/ │ └── test-summary.js └── README.md5.4 核心代码片段// scripts/main.jsconst{generateSummary}require(./summarize);const{extractTodos}require(./extract-todos);const{identifyOwners}require(./assign-owners);const{renderReport}require(./templates);/** * 主入口函数 * param {Object} params * param {string} params.transcript - 会议转录文本 * param {string} [params.date] - 会议日期可选 * returns {string} Markdown 格式的会议纪要 */asyncfunctiongenerateMeetingSummary(params){const{transcript,datenewDate().toISOString()}params;// 1. 生成摘要constsummaryawaitgenerateSummary(transcript);// 2. 提取待办事项consttodosextractTodos(transcript);// 3. 识别负责人constassignmentsidentifyOwners(todos);// 4. 渲染最终报告constreportrenderReport({date,summary,todos:assignments});returnreport;}module.exports{generateMeetingSummary};// scripts/summarize.js/** * 生成会议摘要 * 实际可调用大模型 API这里展示伪代码 */asyncfunctiongenerateSummary(text){// 方法 1调用 LLM API// const response await llm.generate({// prompt: 请总结以下会议要点:\n${text},// max_tokens: 500// });// 方法 2基于规则的摘要简单版constparagraphstext.split(\n\n).filter(pp.trim());constkeyPointsparagraphs.slice(0,5).map(pp.trim().substring(0,100));returnkeyPoints.map((p,i)${i1}.${p}...).join(\n);}module.exports{generateSummary};5.5 SKILL.md 文档# meeting-summarizer 自动生成结构化的会议纪要节省整理时间。 ## 触发条件 当用户提供会议转录文本时自动调用 - 把这段会议内容整理成纪要 - 帮我总结一下今天的周会 - 生成会议纪要 ## 使用方法 ### 基础用法 上传会议转录文本或粘贴文字然后说整理一下会议纪要### 指定日期这是上周二的会议整理一下### 只提取待办从会议里提取待办事项## 配置说明 可在 TOOLS.md 中配置meeting-summarizer:outputPath: ~/meetings/template: standard | executive | technical## 输出格式 markdown # XX 会议纪要 **日期**: YYYY-MM-DD **参与人**: ... ## 一、会议摘要 - 关键讨论点 1 - 关键讨论点 2 ## 二、决策事项 - 决议 1 - 决议 2 ## 三、待办事项 | 任务 | 负责人 | 截止日 | |------|--------|--------| | ... | ... | ... |⚠️ 注意事项输入文本最好超过 500 字否则摘要质量不高如果有说话人标注效果更好敏感信息请先脱敏--- ## 六、测试与优化 a name六测试与优化/a ### 6.1 单元测试 javascript // tests/test-summary.js const assert require(assert); const { generateSummary } require(../scripts/summarize); describe(generateSummary, () { it(应该能从简短文本生成摘要, async () { const input 今天我们讨论了三个议题1.预算 2.人员 3.时间表; const result await generateSummary({ transcript: input }); assert.ok(result.includes(预算)); assert.ok(result.includes(人员)); assert.ok(result.includes(时间表)); }); it(空输入应该返回空结果, async () { const result await generateSummary({ transcript: }); assert.strictEqual(result, ); }); });6.2 集成测试# 准备测试数据echo{transcript: 今日会议讨论..., date: 2026-03-24}tests/input.json# 运行测试nodetests/integration-test.js# 验证输出cattests/output.md6.3 用户体验测试找 3-5 个真实用户试用收集反馈问题预期回答改进方向是否解决了你的问题“是的/部分”如果否询问哪里不行输出格式满意吗“很好/一般/差”调整模板操作是否简单“简单/有点复杂”简化交互还会用第二次吗“会/看情况/不会”核心指标6.4 性能优化根据测试结果调优// 慢加缓存constNodeCacherequire(node-cache);constcachenewNodeCache({stdTTL:3600});// 缓存 1 小时asyncfunctiongenerateSummary(transcript){constcacheKeycrypto.createHash(md5).update(transcript).digest(hex);constcachedcache.get(cacheKey);if(cached)returncached;constresultawaitexpensiveComputation(transcript);cache.set(cacheKey,result);returnresult;}七、发布与维护7.1 发布清单上架 SkillHub 前的检查## 发布 Checklist ### 代码质量 - [ ] 无明显的 bug - [ ] 错误处理完善 - [ ] 代码格式统一 - [ ] 关键函数有注释 ### 文档完整性 - [ ] SKILL.md 填写完整 - [ ] README.md 对外友好 - [ ] 有使用示例 - [ ] FAQ 覆盖常见问题 ### 安全性 - [ ] 没有硬编码密钥 - [ ] 输入做了校验 - [ ] 敏感数据已脱敏 - [ ] 符合隐私政策 ### 兼容性 - [ ] 在最新 Node 版本测试通过 - [ ] 依赖声明清晰 - [ ] 向后兼容考虑7.2 版本管理使用语义化版本版本含义示例v1.0.0稳定版正式发布v1.1.0功能新增增加新功能v1.1.1Bug 修复小修复v2.0.0重大变更不兼容更新7.3 用户反馈渠道## 遇到问题 - 评论区留言 - 邮件your-emailexample.com - Issue 提交[GitHub Issues](link) - 社区讨论[Discord](link) 结语恭喜你现在已经掌握了✅ 技能设计的核心概念✅ 五大设计原则✅ 需求分析和优先级评估✅ 分层架构模型✅ 从 0 到 1 的完整案例✅ 测试和优化方法✅ 发布和维护流程记住最好的技能设计不是追求完美而是在可用性和复杂度之间找到平衡。下一步建议选一个实际需求按本文流程实践一遍把自己的经验写成文章分享给大家参与社区讨论互相学习我是飞来城专注分享实用的 AI Agent 开发心得。如果你也在构建自己的数字助手欢迎交流 相关阅读《OpenClaw 自动化实战如何用 AI 帮你写周报》《OpenClaw 技能开发入门从零创建你的第一个 AI 技能》《30 分钟搭建个人 AI 助手OpenClaw 完全教程》OpenClaw 官方文档ClawHub 技能商店觉得有用 点个赞支持原创 评论区说说你想开发什么技能 关注我不迷路➕ 收藏以防找不到

相关新闻