ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Agent技能管理实战:从提示词工程到可复用技能模块

2026/10/8 5:05:48 拓冰建站 浏览量
Agent技能管理实战:从提示词工程到可复用技能模块 1. 项目概述1.1 核心需求解析先说个现实过去一年我见过太多团队在 Agent 项目里反复折腾同一个问题——模型明明表现很好一落到真实业务流程就拉胯。聊天室里讲得头头是道真让它去处理把财务部上周五发来的对账单解析后写入 CRM 并通知负责人这种任务它就开始一本正经地胡编。问题不在模型在于我们从来没给 Agent 准备好一套真正可复用、可管控、可治理的能力体系。这是 agent-skills 最核心的价值命题。它解决的不是怎么让模型更聪明而是怎么把聪明模型的能力沉淀成可执行的技能模块。要给那些反复出现的任务场景查库存、算报价、写周报、转录会议纪要、解析附件字段建立一套标准化封装让 Agent 不需要在每次对话里从零推理业务规则调用一个技能模块就能稳定执行。这个思路本质上跟程序员把高频逻辑抽象成函数一样先有可复用的函数库才能有工程化的业务系统。1.2 适用场景与人群这套方案最适合两类团队一类是已经跑通了 Agent Demo 但不知道怎么推向上线的创业者一类是在企业里搭 AI 工具链、被模型能力很强但落地难折磨的开发者。如果你是刚开始接触 Agent 的新手这套技能管理思路也可以帮你避开很多后期重构的坑——技能体系这件事越早搭越省心等到 Agent 已经学会各种花式幻觉再回头治理代价至少翻三倍。我觉得 agent-skills 最值得借鉴的一点是它把技能当作一套有生命周期、有版本、有测试的工程单元来看待而不是靠把提示词写长一点来解决问题。把 Agent 能力拆成技能模块后每个模块的 prompt、参数、工具调用、返回结构都是可单独测试、单独迭代的。这也是我在实际操作中体会最深的部分提示词工程做到后期拼的不是玄学是一套工程化流程。2. 核心设计思路Agent 能力拆分与管理2.1 从全知型对话到模块化技能的范式转变当前主流 Agent 框架都在做让模型自己规划、自己调用工具这件事。这个方向没毛病但它有一个隐性问题当 Agent 面对的长尾任务越来越多你把所有工具和指令一股脑塞进上下文会出现两个严重的内耗——第一上下文越来越长模型注意力被摊薄工具选择准确率下降第二业务规则全部写在系统提示词里模型对规则的理解其实是一堆概率分布不是确定性逻辑输出自然不稳定。agent-skills 的做法是把任务描述、工作流、规则、工具调用代码打包成一个独立技能模块。比如模型判断当前任务属于对账提醒技能域就把整套对账相关指令注入当前会话其他无关能力全部隔离出去。这样模型每次只需要在较小的上下文空间内做判断规则是模块内部写死的确定性内容准确率和稳定性都会显著改善。从工程角度看这个设计的收益很直接模块可以独立测试回归只测变更模块模块可以独立升级A 技能加了新功能不影响 B 技能模块可以独立授权只给某个 Agent 开放指定技能模块可以独立溯源这次出错到底是在哪个环节直接查对应模块的日志就行。如果你是经历过改一处提示词整个 Agent 行为都变的开发者应该能感受到这种隔离设计有多香。2.2 技能生命周期管理从定义到废弃技能管理不是把几个 YAML 文件丢仓库里就完事它是一套完整生命周期治理流程。我在实际项目里会把技能生命周期分成五个阶段设计、实现、注册、运行、退役。设计阶段的关键是能力边界定义——这件事必须回答三个问题这个技能解决什么任务类型覆盖哪些工具调用产出什么结构在 agent-skills 设计中边界模糊是头号杀手因为模型会在模糊边界上去猜而猜就是幻觉的开始。实现阶段要把设计文档落到实际的 prompt 模板和工具代码配好参数 Schema这一部分下面第三节会展开讲。注册阶段是技能入库的过程。一个技能注册时至少要带以下信息技能名称、描述用于模型路由判断、版本号、入口文件、依赖组件、权限诉求、输出 Schema。这些信息在 maniest 里统一登记Agent 运行时从注册表拉技能列表做路由。运行阶段就是技能真实干活的时候核心关注点放在模型是否成功触发该技能、参数是否按 Schema 校验、工具调用是否按预期执行、是否返回异常。我在实际项目里还会额外加一层探针——每个技能执行完毕记录耗时、token 消耗、工具调用次数这些数据是判断技能模块健康度的核心依据。退役阶段最容易被人忽略但又非常重要。旧技能如果直接删掉线上 Agent 可能因为路由不到该技能而出现发呆状态如果留着不维护又会跟新技能竞争同一类任务造成路由不稳定。我的建议是维护一个废弃名单把退役技能降级为仅接受显式调用模式等所有引用方切换完毕后再彻底移除。2.3 技能与工具的关系解耦很多初学 Agent 的人会把技能和工具混为一谈这是两个完全不同的抽象层次。工具是最原子化的能力单元比如发送 HTTP 请求读取数据库执行代码它不关心业务。技能则是业务场景 工具调用组合 规则约束的封装体比如自动对账提醒技能内部可能会用到读取邮件、解析附件、查询数据库、发送通知四个工具。把两者解耦之后底层工具可以被不同技能复用。一个技能更新了 prompt 或规则不需要去改工具一个工具换了实现方式只要保持接口不变技能层完全无感。这个设计对大型项目尤其重要因为 Agent 系统的演化从来不是线性的工具会越来越多技能也会越来越多没有清晰的分层抽象系统就会变成一锅粥。3. 核心细节解析与实操要点3.1 skill definition 的标准结构一个技能模块本身就够写一篇博文但核心结构其实可以拆成几块。我最建议的工程实践是每个技能一个独立目录结构大致如下agent-skills/ └── skills/ └── reconcile-reminder/ ├── SKILL.md # 技能定义名称、描述、触发规则、约束 ├── tool/ # 工具封装代码 │ ├── fetch_mails.py │ └── query_orders.py ├── workflow/ # 工作流定义 │ └── main_flow.md ├── assets/ # 模板资源、配置文件 └── tests/ # 测试用例SKILL.md 是整个技能的黑话字典模型路由时靠它来判断要不要唤醒这个技能。这块文件写得越精确路由准确率就越高。这里有个非常关键的实操细节SKILL.md 的前三行相当于电梯演讲一定要用最简洁的话说清楚这个技能能干什么。因为大模型的注意力分布有个特点——文本开头部分的语义权重通常更高。你可以把技能描述想象成招聘广告候选人Agent浏览所有技能列表时停留时间只有零点几秒标题不够明确的简历直接进回收站。一个常见的反面教材是把技能描述写得像参数文档一样详细结果模型每次都因为关键词匹配错误唤醒错误的技能输出自然一团糟。3.2 参数定义与校验机制任何一个技能要稳定执行参数化是绕不开的环节。假设你要做一个订单对账提醒技能它的输入需要开始日期、结束日期、对账对象、差异阈值几个参数。如果没有参数 SchemaAgent 会凭自己的理解去猜这些字段的含义这对具体业务来说风险很大。我用 Pydantic 定义参数结构的习惯已经很久了它处理起复杂的嵌套结构、类型校验、字段描述都很顺手。一个经典的定义长这样from pydantic import BaseModel, Field from typing import Optional class ReconcileInput(BaseModel): start_date: str Field(..., description对账区间起始日格式 YYYY-MM-DD) end_date: str Field(..., description对账区间结束日格式 YYYY-MM-DD) target: Optional[str] Field(None, description对账对象名称为空则全量对账) diff_threshold: float Field(0.01, description差异告警阈值按小数计算0.01 表示 1%)参数定义的价值在于第一模型在调用技能前必须先按 Schema 生成参数这就把不确定性从瞎写参数纳入了可控范围第二非法输入直接在入口处被拦截不会污染后续逻辑第三参数即文档后续维护和代码审查都省心很多。实操阶段你还会遇到一个很现实的坑——模型填充的日期格式永远五花八门。明明描述里写了 YYYY-MM-DD它可能给你传1月5号可能传2025/01/05。这块建议在 Schema 里把格式约束写清楚同时在校验层做一次宽松解析兜底。经过反复测试我发现严格 Schema 宽松解析 标准输出的组合最稳定模型面向的是结构化定义但真实世界的垃圾输入也不会让技能崩溃这是一套既能约束又不失弹性的方案。3.3 触发策略让模型知道什么时候该用哪个技能参数定义解决的是技能要用什么数据但还有一个更前置的问题——模型怎么知道哪个技能适合当前任务这就是触发策略。核心思路是让模型先做一轮快速意图分类再路由到具体技能。这一步的 prompt 设计很有讲究直接上示例你是一个任务路由代理。请从以下技能列表中选择最合适的一个 1. reconcile-reminder订单对账提醒适用于财务对账、账单核对场景 2. sales-report-gen销售日报生成适用于销售数据汇总和报表输出 3. meeting-minutes会议纪要整理适用于语音转文本后的会议记录处理 判断依据 - 用户描述了具体任务场景且该场景与技能描述高度匹配 - 如果存在多个候选优先选择边界更窄的那个 - 无法确定时返回 none 输出格式JSON {skill: reconcile-reminder, params: {...}}这段设计里有三个细节值得展开。第一边界更窄优先这个约束非常重要两个技能描述都模糊覆盖同一场景时模型更容易选到那个覆盖面更宽的但这通常不是最优解窄覆盖的技能往往对特定场景执行得更好。加这个约束后路由准确率提升明显。第二输出格式强制为 JSON方便下游解析。这一步很基础但从不能省我曾经见过输出纯文本然后下游用正则硬解的场景维护起来非常痛苦。第三无法确定时返回 none这个兜底选项极其关键。宁可让 Agent 承认不会也不要让它硬选一个技能硬跑。实际项目中我在路由层后面又加了一层显式的待处理队列——凡是返回 none 或用户对输出表示不解的场景统一进入人工处理队列边收集边补技能这比让 Agent 瞎猜安全得多。4. 实操过程与核心环节实现4.1 从零定义一个技能模块订单对账提醒我用订单对账提醒来完整走一遍实操流程。这个技能的目标是每天定时检查前一天的订单和支付流水计算差异率超阈值的订单在钉钉群推送告警并把详细差异写进 Google Sheets 供财务复核。第一步把 SKILL.md 写出来# 订单对账提醒 - 技能名称reconcile-reminder - 版本1.2.0 - 用途每天执行订单与支付流水对账发现差异超阈值订单并告警 - 适用场景用户提到对账账单不符差异订单财务核对 - 输入参数 - start_date必填对账区间起始日 - end_date必填对账区间结束日 - 执行流程 1. 从订单库拉取区间内订单 2. 从支付流水拉取区间内流水 3. 按订单号匹配流水标记差异 4. 差异率超过阈值时写入告警表 5. 将汇总差异写入 Google Sheets - 输出格式 - 差异订单明细JSON 数组 - 告警汇总文本这份 SKILL.md 就是给 Agent 看的手册务必把触发场景、执行流程、输出格式都交代清楚训练数据量不够的时候$p$ 规范到这里的收益最大。我还见过很多团队在 SKILL.md 里写聪明话——比如细心检查确保准确之类模糊描述其实这部分是给模型看的它不需要被鼓励它需要的是流程和边界。第二步把执行逻辑写成一个可被模型调用的工具模块。我习惯用 Python 直接封装方便测试和复用import pandas as pd def load_orders(start_date: str, end_date: str) - pd.DataFrame: # 连接订单库拉取订单数据 return df def load_payments(start_date: str, end_date: str) - pd.DataFrame: # 连接支付流水库拉取流水数据 return df def calculate_diff(orders: pd.DataFrame, payments: pd.DataFrame, threshold: float) - dict: merged orders.merge(payments, onorder_id, howleft, suffixes(_order, _payment)) merged[diff_amount] merged[amount_order] - merged[amount_payment] diff_df merged[merged[diff_amount].abs() threshold] return { total_orders: len(merged), diff_count: len(diff_df), diff_details: diff_df.to_dict(records), }第三步把技能注册进 Agent 运行时。这一步相当于入编注册表里写明调用入口、输入输出 Schema、权限信息。注册代码大致这样# registry.py from reconcile_reminder.tool import calculate_diff agent.register_skill( namereconcile-reminder, version1.2.0, entry_pointcalculate_diff, input_schemaReconcileInput, required_permissions[read:orders, read:payments, write:sheets, send:dingtalk], description订单对账与差异告警, )这样一整套流程走下来这个技能就完成了从提示词想法到可执行工程单元的转化。4.2 技能编排工作流用 n8n 做 GUI 编排纯代码实现技能编排能解决很多问题但业务团队同事往往希望有一种更直观的编排方式。我最近在项目里开始结合 n8n 这类可视化工具来编排技能把每个技能节点暴露成工作流的一环效果意外地好。在 n8n 里一个典型的 Agent 技能工作流会有这几个节点Webhook 入口节点、技能路由节点、可选各技能分支节点、输出节点。Webhook 收到用户请求后先让 Agent 路由判断该唤醒哪个技能对应技能的输入参数自动带上执行完技能后整理输出再回给用户。整个过程对业务方非常透明也能一目了然地看到每个环节的耗时和 Token 消耗。在技能编排中最重要的经验是不要让 Agent 直接决定工作流的每一步。Agent 擅长的是意图识别 参数填充 技能选择而具体步骤应该由确定性代码或工作流引擎控制。这样做的价值在于一旦流程写死你就拥有一个可审计、可复现、可测试的技能执行管道模型的不确定性被圈在既定边界之内不会乱跑。4.3 技能测试策略先单测再端到端技能测试是很多人会偷懒的环节但它恰恰是最值得投入的部分。我的测试策略分三层单元测试、集成测试、模拟回归。单元测试主要覆盖工具函数——比如上面那个calculate_diff函数拿一份全差异、零差异、各 50% 差异的数据各测一遍保证计算逻辑正确。集成测试则把 SKILL.md 参数 Schema 工具调用串起来整体测这一层最容易发现模型生成了非法参数步骤遗漏之类的问题。模拟回归是最高性价比的一层——我会提前准备一批典型用户输入比如昨天的对账有问题吗盯一下华东区的退款差异每次更新技能之后全部跑一遍看路由是否稳定、输出结构有没有破坏。这里分享一个真实的调优案例。最初版本的reconcile-reminder技能路由准确率只有 68%排查下来发现有两个问题一是技能描述里写了订单但用户对话里习惯说单子模型匹配失败二是财务同事经常说看看这几天的账参数里却没有相对日期处理逻辑。后来我在描述里加了业务黑话备注并在解析层把这几天这类相对日期转成绝对日期准确率直接拉到 92% 以上。做 Agent 技能优化的日常就是这类小事——很多问题跟算法无关跟业务真实语境理解有关。4.4 现有 agent-skills 开源资产盘点与扩展方式社区里其实已经有一些不错的 agent-skills 开源资产可以直接复用核心的扩展路径无非是基础技能套件 自建脚手架。基础套件覆盖文件处理、网络请求、代码执行、数据库查询、邮件收发、日历会议这几件高频事把这些模块先跑通Agent 的通用性就能撑住 70% 的日常场景。剩下 30% 的个性化业务能力就需要自己按上面 4.1 节那套流程来补了。我个人在使用 agent-skills 这套体系时常用的扩展方式是先在本地搭建一个技能沙箱把新技能放进去和三个陪跑用户做端到端测试——第一类用户是菜鸟型提出模糊需求第二类是技术型喜欢直接给命令和参数第三类是干扰型故意绕圈子说话。三类用户输入都跑通了技能才敢上生产。这个过程直观地告诉你Agent 技能开发最后拼的是全场景适应能力不是 prompt 技巧。5. 常见问题与排查技巧实录5.1 技能命中率低的路由寻址问题症状用户问题对上了某技能描述但 Agent 没有唤醒该技能反而去调了另一个完全不相关的技能。这类问题我排查了不下十次最典型的两个根因一是技能描述里的关键词覆盖太少一种业务规则在真实对话里有十几种表达方式你只写了一种模型自然识别不了二是候选技能太多同类技能描述边界模糊模型看到两三个相似描述就撞大运瞎选。解决办法有两个方向。一个是加负例提示在 SKILL.md 里明确写本技能不处理什么场景这个思路非常有效模型对否定边界的把握通常比肯定覆盖更准。另一个是控制路由粒度——如果技能数量超过 15 个我建议在中间加一层技能域概念先粗路由到域对账域、报表域、沟通域再细路由到具体技能两级路由的准确率比单级高很多。5.2 上下文膨胀导致技能失效症状Agent 对话几轮之后后面的技能调用开始出现各种匪夷所思的错误比如参数取到前面的聊天内容、技能重复执行、输出格式逐渐走形。这是上下文膨胀惹的祸。每轮对话都会把消息历史、工具结果、用户输入全部拼进上下文越来越多以后模型对最新指令的注意力会被摊薄技能定义的约束就开始失焦。我习惯的做法是给每轮技能调用做上下文裁剪明确本技能执行需要用到哪几轮信息其余历史塞进摘要。举个例子一个查询订单技能只需要当轮的订单号参数前面的闲聊和历史对话完全没必要给它裁剪之后上下文直接小了一个量级稳定性和响应速度都有改善。核心原则就是给模型的信息一定是它完成当前任务的最小足够集。5.3 权限与安全边界管理技能越封装越深离底层数据越近权限问题就越突出。一个订单查询技能如果拿到了全库查询权限模型一旦被诱导就可能在毫无防护的情况下拉出大量敏感数据。我见过太多团队在这一步翻车——Agent 的技能设计挺漂亮但权限模型几乎没有任何技能一口气连数据库全表查。安全边界管理实际上是技术工程化的关键底线。我的建议是每个技能都要有独立的权限声明调用时按最小权限授予绝不能图省事给一个大而全的权限。审计日志也必齐每次技能调用、工具访问、数据读取都记下来一旦出问题能回溯。我还习惯定期做一次技能权限复核——拿着技能在线上真实产生的调用记录跟权限声明做比对凡是实际权限比声明大的技能单元一律收敛。5.4 跨语言输出与格式异常模型在不同语言间切换时输出格式很容易放飞自我。同一个技能用户用中文问返回的字段可能是中文用英文问字段变成英文甚至可能中途切换。有几次差一点把下游数据库都搞崩。我的解决方案比较简单粗暴Schema 层面全部用固定字段名和枚举约束返回描述和错误信息统一用中文参数中的枚举值不受用户输入语言影响必须按 Schema 定义。此外我强烈建议在技能的最后一道关卡再加一层解析校验——把模型输出按 Schema 重新验证不符合直接打回让模型自己修正。这相当于一道防幻觉的护城河实测能省掉大量下游 bug。5.5 安全检查清单参考根据多次实践我整理了一份 Agent 技能上线前的安全检查清单供你参考检查项检查要点参数校验所有外部输入是否按 Schema 校验是否存在非法参数注入权限最小化技能声明的权限是否仅覆盖必要数据是否包含未使用的敏感接口注入防护用户输入是否可能拼接进系统指令是否存在指令注入风险数据脱敏返回数据是否包含手机号、身份证、银行卡等敏感字段日志覆盖技能调用日志、工具访问日志、异常日志是否完整违规阻断敏感操作删除、批量导出前是否有二次确认机制降级方案Agent 识别不出技能时是否有兜底策略是否转入人工处理流程这个清单里的每一项我都在生产环境里踩过对应的坑。比如数据脱敏那块当时技能返回了一个完整手机号列表所幸只是测试环境要是上了生产后果不堪设想。5.6 技能升级的版本控制与灰度发布技能升级是风险高发区。很多团队直接把 SKILL.md 改了推上线然后线下几十个 Agent 行为突变。技能版本管理的关键是控制影响面——SKILL.md 定义类改动改了描述、触发逻辑影响面最广它会影响路由这类改动必须先小范围验证再全员推进工具实现类改动相对可控只要接口不变影响面会小很多参数 Schema 改动是最敏感的它涉及下游接口对接最好在版本注释里标明是否兼容旧参数。我建议每个技能都维护一份 changelog记录每次版本变化的影响。上线前一定要先在模拟环境跑一遍标准测试集确认无误后再灰度。灰度方式也很简单新版本技能只对指定用户开放观察一段时间业务指标走向没问题再全员放开。这套流程看起来繁琐但对生产系统来说它节省的返工成本远比表面上的时间成本大。6. 进阶实践与效费比反思6.1 技能质检与成本控制技能不是做好就完它像业务代码一样需要持续监控。我建议每个技能都要录入耗费数据——单次调用 Token 量、时间、工具调用次数。一段时间跑下来你会清晰地看到哪些技能经常被调用但消耗很高哪些技能调了百次但基本在空转。数据说话之后优化方向就清楚了。高消耗高频次技能优先优化第一步看 prompt 是否塞了太多模型不关心的冗余描述第二步看工具调用是否重复拉数据第三步看能不能用规则引擎、向量检索这些确定性技术替代一部分模型推理哪怕只替代其中一环节约的成本通常都很可观。低频次技能则要考虑是否存在技能碎片化问题——好几条技能描述高度相似、重复覆盖这时候性价比最高的事情是把它们合并、精简、下沉到一个统一入口再重新设计路由逻辑。6.2 工具链选型与避坑建议在开始建设 agent-skills 体系前工具链选型值得花点心思。如果你团队里面有后端基础、希望高度定制化LangGraph 这类代码优先的框架会更顺手如果业务团队也要参与编排、希望快速看到效果n8n 这类可视化编排工具更合适。但不管选哪套我都会建议先把下面几件事定下来技能注册表用统一 schema 存方便后续迁移和治理日志与监控体系从第一天就接好不然等技术债积累再补改动成本翻倍技能测试集一定要沉淀成公共资产每轮调整都统一回归一遍权限模型足够细分不要让任何技能拥有全局数据库权限有一个经验我反复在新项目里提到一旦技能数量超过五个就不再适合全部存在一个长文件里。那时候你需要的不是更多提示词是制度化、结构化的技能管理规范。6.3 从技能到智能体团队的演进路径当技能体系逐渐成熟你自然会往下一个层级走——从单个 Agent 多个技能演进成多 Agent 协作的智能体团队。这个演进路径里技能库是公共底座每个 Agent 按职责领取一组技能通过消息中间件互相协作。比如客服总控持有意图识别与分发技能订单专员持有订单查询与售后处理技能仓储专员持有库存管理技能财务专员持有对账与开票技能。走向多 Agent 时技能治理的优先级不降反升因为路由问题从单 Agent 的选哪个技能变成了多 Agent 的哪个 Agent 接这个任务复杂度是几何级提升的。我在这个阶段遇到的最大教训是单 Agent 时代你可以靠提示词微操多 Agent 时代没有强约束的协作协议就会彻底失控。所以我建议对每个 Agent 的技能管辖权做严格声明哪些技能只能由哪个 Agent 调用哪些技能是共享的哪些技能之间做了互斥这些都不让模型自己判定。7. 个人体会与一个小技巧聊到最后还是想掏点实际的东西。我做了这么多 Agent 技能治理的实践最大的感受是Agent 的能力上限由模型决定但 Agent 的落地质量由工程体系决定。模型选得再好技能管理一塌糊涂也做不出靠谱的 Agent。反之模型能力稍微逊色一点但技能模块清晰、权限分明、测试覆盖高整个系统的可靠性依然非常能打。关于技能设计最后分享两个我在实际工作中屡试不爽的小技巧。第一个技巧是给技能模块预设为什么锚点。每个 SKILL.md 里除了写做什么、怎么做还强制要求写一段为什么存在这个技能、什么情况下绝对不要用它。这个锚点的作用是在模型执行中途产生犹豫时给它一个回归到出发点重新审视的坐标。实测下来加了这类锚点的技能在长链路任务里的错误率明显更低——模型更像一个知道自己为什么在这里的执行者而不是随机对提示词做出概率反应的文字预测器。第二个技巧是技能执行完毕后的轻量反思环节。每次技能跑完留一小段空间让 Agent 对照输出结果做一次自查结果是否与用户诉求一致是否有字段缺失是否有潜在的执行偏差这个动作会把一部分执行了但没做对的问题提前拦截。成本很低因为通常只需要模型输出极短的反省内容但它贡献的稳定性提升远超投入。回到 agent-skills 本身它不是什么银弹本质上是把工程化、体系化、纪律性的思维引入 Agent 能力建设的一套方法论。你要是现在正被Agent Demo 很惊艳、上生产就拉胯折磨我建议你从定义第一个技能模块开始把提示词、参数、工具、流程、日志都塞进一个目录里跑两轮你再回来体会一下这套思路值不值。