资讯动态

从零构建AI技能包:会议纪要Skills实战与踩坑指南

发布时间:2026/10/14 8:32:40 来源:尧图企业网站定制
最近在给某团队做AI助手改造的时候发现一个很典型的现象很多人把skills理解成更长的提示词或者以为它就是系统提示词里多塞几段规则。实际动手之后才发现skills是一套独立的能力封装机制有它自己的目录结构、元数据规范、加载逻辑和调试方法。这篇文章我就拿我们实际做的一个会议纪要整理技能包当案例把从设计到落地的完整过程拆开讲顺便把几个坑位也标出来希望能帮你少走点弯路。1. Skills到底是什么一次把概念讲透1.1 从一段对话到一套技能Skills的定位先说结论Skills可以理解成给AI助手装上的一颗颗专用大脑每一颗大脑负责一类固定任务。比如会议纪要、周报生成、竞品信息提取、数据清洗、日报汇总这些都是单一职责、高度可复用的任务非常适合封装成Skill。和普通系统提示词的区别在哪普通提示词是你每次对话都要带上的一段话它没有被结构化也没有版本概念改一句话就得整体复制一遍。而Skill是一个真正的文件集合里面包含描述文件、参数声明、示例、可能还有可执行的脚本。它被组织成独立目录可以被动态加载和卸载甚至能做版本管理。也就是说提示词是每次临时说一遍的嘱托Skill是提前写好、随取随用的工具箱。我在实际项目中最大的体感是不加Skill的时候每次让AI做会议纪要它都要重新理解一遍任务输出格式时好时坏。配上Skill之后AI会自动判断当前输入是不是该触发这个技能触发之后严格按里面的规则、流程和示例走输出质量肉眼可见地稳定下来。这个自动判断触发的能力正是Skills机制最值钱的地方。1.2 Skills和Prompt、Function Calling、Plugin的边界在哪里很多人一开始都会问我有Prompt工程就够了为什么要用Skills我有Function Calling函数调用了是不是重复了这里我直接给一个最直白的区分Prompt一段文字指令适合描述性任务一次性使用没有文件结构和可执行逻辑。Function Calling一种结构化工具调用协议让模型在对话中请求调用某个函数适合动作型任务比如查天气、算价格。它强调的是单次调用返回值是结构化数据。Plugin插件往往是打包好的、带完整UI或者第三方服务集成的复杂应用重量级依赖平台生态。Skill介于Prompt和Plugin之间。它内部可以包含Prompt规则也可以调用脚本甚至调用API但它更像一种任务模板逻辑包的组合。核心区别在于Skill是以让模型学会完成一类任务为目标的封装而不是简单暴露一个工具接口。如果你把Function Calling比作电话那Skill就是一套完整的办事流程里面有办事手册、表格模板、参考样例甚至还能自动打几个电话。我遇到过团队误用Function Calling来写会议纪要结果发现根本行不通。因为会议纪要本身不是一个函数返回JSON的问题它包含语言理解、信息组织、格式转换、要点归纳多个环节。把这些全塞进一次函数调用既不自然也不稳定。放在Skill里按步骤来反而很顺。1.3 为什么现在Skills突然火起来最近几个月Skills概念密集出现不是没有原因的。一是长上下文窗口带来提示词越来越长的问题用户不想每次把五六个技能都塞进上下文里而Skills可以做按需加载节省日常开销。二是多步骤复杂任务变多单纯靠对话流控制已经到头了需要一种能力包来做流程约束。三是团队协作需求增长大家希望把某个人的业务经验沉淀成可复用的技能文件而不是靠口头交代。另外模型厂商也在这块发力提供了标准化的Skills定义规范和加载协议。这本质上是在把AI能力往模块化方向推和软件工程里组件化的演进路径一模一样。你越早理解这套思想后面出现新的工具链时上手成本就越低。2. 动手前的完整设计思路2.1 先想清楚你的Skill要解决什么实际问题开工之前先别急着写文件。我建议你先回答三个问题这个任务是不是高频、稳定、可复用的这个任务的输入输出能不能被清晰定义这个任务的主观创造性强不强如果答案是强主观创造比如写散文、头脑风暴那就没必要做Skill。如果是格式要求明确、流程固定、重复度高比如会议纪要、数据清洗那就是Skill的合适土壤。记住一个原则Skill是确定性大于创意性的东西。我在实际项目中用过一个判断方法拿过去一周的对话记录统计一下哪些任务反复出现三次以上每次的处理流程是否大致相同如果相同就可以把它沉淀成Skill。当时团队里最频繁的就是会议纪要整理和周报生成所以第一批Skills就从这两个开始。做完这个分析之后再定边界。比如我们的会议纪要Skill明确只处理会议原始文本→结构化纪要不做音视频转写不做待办事项自动排期不主动发通知。边界越清楚Skill触发就越精准误判率越低。2.2 Skill目录结构与文件职责标准化的Skill目录结构通常长这样meeting_minutes_skill/ ├── SKILL.md ├── parameters.json ├── examples/ │ ├── example_input_1.txt │ ├── example_output_1.md │ ├── example_input_2.txt │ └── example_output_2.md ├── scripts/ │ └── preprocess.py └── assets/ └── output_template.mdSKILL.md整个Skill的灵魂。描述这个技能是干嘛的、适用什么场景、不适用什么场景、工作步骤是什么、输出格式是什么。parameters.json定义输入参数的结构一般用JSON Schema。让AI知道该提取哪些字段、类型是什么。examples/: 放示例输入和对应输出。这是让AI学会标准答案最有效的手段。比你在描述里写一百句话都管用。scripts/: 可选的辅助脚本。比如会议纪要里面的预处理脚本可以把原始文本分段、去噪、识别发言人减轻模型负担。assets/: 模板、静态资源。比如固定的Markdown会议纪要模板。先说清楚不是所有Skill都需要脚本。很多纯规则类的Skill只有SKILL.md就能跑得很好。脚本是锦上添花。但一旦涉及文本预处理、格式转换、调用外部API脚本就很有必要了。2.3 元数据是灵魂name与description的写法如果说SKILL.md是灵魂那SKILL.md头部的YAML元数据就是灵魂中的灵魂。AI判断要不要触发某个Skill主要就看这个元数据尤其是name和description。我在给团队讲解时会让他们把description当作电梯演讲来写。要回答清楚三个信息这个技能做什么一句话说清什么场景下该用触发条件什么场景下不该用避免误判我们当时的写法一开始是整理会议纪要结果测试的时候用户说帮我记一下这次会议它不触发用户说总结一下今天的通话内容它也不触发。后来我们改成了--- name: meeting_minutes_organizer description: 从会议记录、通话记录、讨论发言文本中提取结构化会议纪要。 适用于需要输出时间、议题、结论、待办事项和负责人信息的场景。 不适用于音视频直接转写、非会议类文本摘要、创建日程。 ---改完之后触发率明显提升。记一下会议总结通话内容整理讨论结果这些说法都能正确触发。关键在于description里同时写了适用和不适用AI的意图识别准确度高了很多。还有一个小细节description里尽量用自然任务描述不要用系统术语。写从文本中抽取结构化信息AI不一定懂什么时候用但写整理会议纪要它秒懂。3. 核心实操从零做一个会议纪要Skill3.1 第一步定义能力边界与输出格式我们假设你要处理的输入是这样的原始文本2024-05-20 15:00-16:00 产品周会 小张上周用户反馈登录页加载慢大概要3秒。 小李我查了一下是图片没有懒加载接口倒是没什么问题。 小张那这周先把图片优化做了目标是1秒以内。 王姐运营这边下周一要上线一个活动页需要开发支持。 小李周三前给我原型图周五开发完应该行。 王姐行周三发你。 小张那UI走查定在周五下午新来的A同学记得通知到位。问题是想得到什么我们当时想要的输出是会议主题、时间、参会人、核心议题、结论、待办事项谁在什么时间前做什么、风险点。有了这个明确的目标才能写清楚SKILL.md里的输出部分。这一步看似简单但特别容易漏。我建议你开个空文件把输出字段写成表格形式和业务方确认一遍。因为会议纪要每个人期望的格式差别很大——有人要纯文本有人要Markdown表格有人要包含情绪倾向分析。不确认好后面返工成本很高。3.2 第二步写SKILL.md和参数SchemaSKILL.md的核心内容是正文部分。我直接列出我们当时用到的关键片段你可以按这个结构来写--- name: meeting_minutes_organizer description: 从会议记录、通话记录、讨论发言文本中提取结构化会议纪要。 适用于需要输出时间、议题、结论、待办事项和负责人信息的场景。 不适用于音视频直接转写、非会议类文本摘要、创建日程。 --- # 会议纪要整理 ## 适用场景 - 输入是一段或多段会议讨论文本 - 输入包含多个发言人及其发言内容 - 需要输出结构化会议纪要 ## 工作流程 1. 首先识别会议的时间、主题和参会人。 2. 然后按发言人顺序梳理议题。 3. 提炼每个议题的结论。 4. 提取待办事项格式为负责人、动作、截止时间。 5. 标注风险点或需要升级的问题。 ## 输出格式 严格按以下Markdown结构输出 ## 会议概要 - 会议主题 - 时间 - 参会人 ## 议题与结论 ### 议题1xxx - 讨论内容 - 结论 ## 待办事项 | 负责人 | 动作 | 截止时间 | ## 风险与待升级 - xxx ## 注意事项 - 如果会议内容不完整明确标注信息缺失不要臆造。 - 如果同一人有多个待办分行列出。 - 所有人名保持原文不要做模糊化。那段## 注意事项特别重要它是约束模型行为的关键。我们后来发现加了不要臆造缺失信息之后模型生成幻觉内容的概率显著下降。再说parameters.json。这个会议纪要Skill其实只需要一个参数原始会议文本。但为了让AI知道传什么我们这样写{ name: meeting_minutes_organizer, parameters: { $schema: http://json-schema.org/draft-07/schema#, type: object, properties: { meeting_text: { type: string, description: 会议原始文本可以包含时间、发言人、发言内容。 }, include_action_owner: { type: boolean, description: 是否在待办事项中强制标注负责人。如果输入中没有明确负责人标注待确认。, default: true } }, required: [meeting_text] } }这里有个经验参数尽量少越少越稳。每多一个参数就多一次模型理解成本。当时我们还想加output_language中文/English参数后来发现会议纪要的场景巨大多数是中文没必要让它选砍掉了。3.3 第三步脚本与示例在实操中有些场景真的需要脚本。比如会议纪要的原始文本经常很脏这时候可以用一个简单的预处理脚本来清洗。我们在scripts/preprocess.py里做了三件事按行切分去掉空行识别带有时间—发言人—内容的结构抽取出发言人和对应内容对超长文本截断到合理长度避免直接撑爆上下文。脚本不负责理解语义只做机械化的结构整理。模型负责的是理解、归纳、生成纪要。这种脚本预处理模型智能处理的分工是我个人非常推荐的组合方式它能让模型集中精力做它最擅长的事。然后说示例。示例是纯文本的比如我们在examples/目录下放了2组。一组是标准的、信息完整的会议记录另一组是信息残缺的比如没有明确结论或者缺少截止时间。为什么要特意放残缺示例因为真实场景中大多数输入都是不完整的。如果你只给完美示例模型遇到缺信息时会倾向于自己编造补齐而范文里如果明确演示了遇到缺失就标注待确认的做法它就学会正确处理了。示例文件不需要多2到4组足够。我看到有人放20组示例反而让模型无所适从。核心是典型和边界覆盖不是数量堆砌。3.4 第四步本地调试与效果验证把所有文件放到指定的Skills目录之后就到了调试环节。我建议调试时不要直接在生产环境反复试而是模拟调用一遍流程。我们当时是分了三个维度来验的触发准确率用不同的说法比如把这段会议记一下帮我总结一下我们的讨论整理一下下午的会议室录音文字稿看能不能全部触发到Skill。输出格式符合度检查输出的标题层级、表格是否和SKILL.md里定义的一致。内容信息保真度逐个核对原始文本里的待办事项是否都被提取出来了有没有漏项或杜撰。这三个维度分开测哪里挂了就修哪里。我们第一轮测试时触发准确率只有70%后来改进了description的措辞加了一条不适用于声明提高到95%以上。输出格式符合度一开始只有40%因为模型时不时自作主张加个总结小节加了示例文件和明确的严格按结构输出约束后才稳定到80%以上。有一件事必须提醒调试Skill不是一次性的是一个持续迭代过程。我们上线后前两周每周都看一次失败的case把典型失败样本整理进示例文件。Skill会越调越准但你得给它时间。4. 容易踩的坑与排查实录4.1 Skill不触发九成是描述写得不对Skill不触发是最高频的问题大概占我遇到问题的60%。最常见的表现是用户输入明明很相关但模型就是没调用Skill。排查顺序如下第一看description里有没有明确触发词。我们一开始写整理会议纪要但用户实际说的是记录一下和客户沟通的结果完全没有会议纪要四个字肯定不触发。改成上面那种覆盖多种说法的描述后问题就消失了。第二看skill名称是否具备语义关联。name字段不要用meeting_minutes_organizer这种偏内部工程的命名虽然它不影响触发但如果模型对名称的语义理解和你不同也会降低触发意愿。当然这个影响没那么大真正起决定作用的还是description。第三看示例文件是否足够。如果没有示例模型不知道触发后该用什么风格、结构输出有时会不愿意触发。加一两组完整示例触发概率能大大提升。还有一个容易忽略的点某些平台对Skill描述有长度限制或者要求description写成纯文本。如果你发现带换行和列表的描述有时生效有时不生效大概率是解析器不支持多行格式。排查时把description收敛成一句话试试。4.2 误触发多个Skill在打架当你的Skills数量多起来之后误触发的问题就会爆发。比如我们同时有会议纪要和待办事项提取两个Skill用户说帮我记一下待办结果两个Skill都触发了输出就成了四不像。解决思路有两个。一是收紧description明确写出本Skill不适用于XXX。比如待办提取Skill里写仅提取待办事项不生成会议纪要和摘要这样模型触发它时就会排除掉会议纪要场景。二是依赖优先级机制如果运行平台支持设置Skill优先级把更通用、更底层的Skill优先级调低把特定场景的Skill调高。我再分享一个偏门但有效的土办法在冲突的Skill之间互斥引用。比如在会议纪要Skill的description里加一句如果有单独的待办提取需求不要使用本Skill。这种交叉排除描述实测对误触发有奇效。4.3 参数不匹配与输出格式漂移参数不匹配的场景多发生在用户输入信息不够时。比如用户只发了半句话整理一下会议meeting_text参数缺失Skill跑不起来。我们的应对策略是在SKILL.md里写明如果缺少会议文本主动询问用户补全不要猜测。输出格式漂移则更经典。第一版跑得好好的改了一次参数Schema之后输出里突然多了数据来源字段而且时间格式从2024-05-20变成了5月20日。原因是什么模型对输出格式的遵循本质上靠的是SKILL.md里的明确指导和示例文件的示范。一旦你改动过参数模型可能重新理解了输出要求。解决办法很简单改动任何配置之后必须用同一批测试用例回归一遍不要只测新功能。4.4 更新不生效缓存和路径问题我们在调试中遇到一个特别磨人的问题SKILL.md改了十几次但模型输出一点变化都没有。后来排查发现是平台对Skill文件做了缓存更新后需要手动刷新或者重启会话才生效。不同平台的机制不一样但没生效时的第一反应应该是确认文件路径对不对、缓存刷新了没有而不是怀疑内容写错了。还有个路径问题。如果Skills目录支持子目录把Skill文件放错层级也会导致加载失败。规范来说每个Skill应该是一个独立目录SKILL.md必须在这个目录的根下。曾经有同事把SKILL.md放到了和parameters.json平级的父目录结果平台完全没识别到。这个事看起来低级但真的很常见所以列出来提醒一下。4.5 我总结的避坑清单根据这些经验我给出一份可以直接拿来用的避坑检查清单你配置Skill之前把每一项过一遍能省不少时间检查项检查要点若不合格的后果description是否包含触发场景和不适用边界不触发或误触发示例文件是否有至少1组准确完整的输入/输出对输出格式不稳定、内容发散参数Schema是否声明了required字段调用时参数缺失、流程中断输出格式是否模板化并放进SKILL.md输出结构漂移优先级是否与其他Skill产生歧义多个Skill同时触发缓存刷新更新后是否手动刷新或新建会话改动不生效单一职责是否在一个Skill里塞了多个任务触发判断混乱、维护困难我个人最深的体会是Skill设计和软件工程里的模块化设计几乎一脉相承单一职责、接口清晰、边界明确这些老生常谈的原则在AI技能配置里全都用得上。很多人做不好Skill不是不懂AI而是没有用工程思维去管理它。最后分享一个后续扩展方向。我们做完会议纪要Skill后很快复用了它的底层逻辑孵化了客户访谈纪要需求评审纪要等多个变体Skill。本质上就是把同一个处理框架换一套场景描述和输出模板就能覆盖一类任务。你可以把Skill理解成你团队里的数字实习生培养一个熟手BI后面带出十来个新手BI就容易了。配置一个好的Skill前期投入两三个小时后面每天省下的时间远不止这个数。所以我的建议是挑一个你日常最烦、最重复的文本类任务今天就试着做成第一个Skill你会感受到完全不一样的使用体验。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑