摘要:Skill 文件是 Agent 能力蒸馏的中间产物,其质量不取决于文本是否“像说明书”,而取决于是否构成可被解释器消费的执行契约。本文以“可执行性缺口”为主线,把缺口拆为输入契约缺失、步骤非原子、依赖隐式化、停止条件模糊四类,并给出对应的结构化写法、静态校验与运行时兜底方案。文中提出以“前置断言—后置断言—失败分支”三元组作为步骤最小单元,以显式依赖图替代自然语言暗示,以可观测停止谓词替代“直到完成”式表述,并给出可量化的评测口径与工程落地路径。全文约 12600 字。
目录
一、导语:从“能读”到“能跑”的可执行性缺口
把一个成熟任务蒸馏成 Skill 文件,最常见的失败并不是“写得太少”,而是“写得太顺”。一份读起来逻辑通顺、术语齐备、步骤清晰的文档,交给 Agent 执行时却频繁出现三类症状:第一步就要求模型猜测输入格式;中间步骤依赖一个从未被声明的工具或知识;跑到最后不知道什么时候该停,于是无限重试或提前收工。这类现象在工程上有一个共同根源——文档的可读性与可执行性之间存在系统性落差,本文将其定义为“可执行性缺口”(executability gap)。
可执行性缺口不是模型能力问题,而是接口问题。人类读者可以从上下文补全缺失信息,Agent 只能消费显式声明。Skill 文件本质上是一份介于自然语言与程序之间的半形式化契约:它既要保留自然语言对模糊情境的解释力,又必须提供机器可判定的结构。缺口的四类来源——输入契约缺失、步骤非原子、依赖隐式化、停止条件模糊——恰好对应契约的四个要素。本文的主线就是:把 Skill 文件当作接口规范来写,而不是当作操作手册来写。这一视角转换,决定了后续所有写法细节。
本文评述:业界讨论 Skill 蒸馏时,常把注意力放在“知识覆盖度”上,认为覆盖越全越可靠。笔者认为这是一个方向性误判。对 Agent 而言,一份覆盖 80% 但接口清晰的 Skill,其实际成功率通常高于覆盖 95% 但接口模糊的 Skill,因为前者失败可定位、可修复,后者失败不可复现。可执行性优先于完备性,这是本文的立论基础。
二、背景与问题定义:Skill 文件到底是什么
2.1 概念界定:从知识蒸馏到能力蒸馏
知识蒸馏(knowledge distillation)最初指用大模型(teacher)的输出分布训练小模型(student),核心是软标签与温度参数(Hinton 等,2015)。这一范式后来被扩展到行为层面:不仅传递“答案分布”,还传递“解题过程”。在 Agent 语境下,能力蒸馏指的是把人类专家或强模型在特定任务上的操作轨迹,压缩为可复用的结构化描述。Skill 文件就是这种描述的载体,它通常包含任务目标、输入要求、操作步骤、依赖资源与终止条件。
需要区分三个易混概念:提示词模板是面向单次调用的文本片段;工具定义是面向函数调用的 schema;Skill 文件则介于两者之间,描述一个多步骤、有状态、可能跨工具的任务流程。本文评述:把 Skill 文件等同于“长提示词”是工程中最常见的降级理解,它直接导致作者用叙事逻辑组织内容,而非用契约逻辑组织内容,这正是可执行性缺口的第一来源。
2.2 问题定义:四类缺口的可观测表现
为了让“可执行性缺口”可操作,本文将其拆为四个可观测维度,每个维度都对应一类典型失败日志。下表给出定义与症状对照,数据为笔者对公开 Agent 框架文档与社区 issue 的归纳(模拟整合数据,非实验测量)。
| 缺口类型 | 定义 | 典型失败日志 |
|---|---|---|
| 输入契约缺失 | 未声明输入的类型、必填性、取值范围与缺失处理 | “无法解析用户提供的日期格式” |
| 步骤非原子 | 单步包含多个可独立失败的动作,无中间校验 | “步骤 3 执行后结果为空,但无法判断哪一子动作失败” |
| 依赖隐式化 | 所需工具、权限、前置数据未显式列出 | “调用不存在的工具 search_v2” |
| 停止条件模糊 | 无成功判据、无失败边界、无最大迭代数 | “循环 12 次后仍未收敛,被外部超时终止” |
这张表的用途不是分类学,而是诊断学。当 Agent 执行失败时,把日志映射到四类缺口,就能快速定位是“写漏了”还是“写糊了”。笔者认为,多数团队在 Skill 上线前缺少的正是这一步映射:他们做的是人工通读评审,而通读恰恰对四类缺口最不敏感,因为人脑会自动补全。
三、输入契约:把“上下文”写成可校验的前置条件
3.1 输入不是“背景介绍”,而是带约束的字段集
人类文档习惯用一段话交代背景:“用户会提供一份销售数据,可能包含多个 sheet。”这句话对 Agent 几乎不可执行:几个 sheet?列名固定吗?缺失值怎么处理?输入契约的要求是把这段话翻译为字段声明,每个字段至少包含名称、类型、必填性、约束与缺失策略五项。约束可以是正则、枚举、数值区间或引用外部 schema;缺失策略必须明确是“报错终止”“使用默认值”还是“向用户追问”。
inputs:
- name: sales_file
type: file
required: true
accept: [".xlsx", ".csv"]
constraint: "至少包含列: date, sku, amount"
on_missing: abort_with_message("缺少销售文件")
- name: date_range
type: object
required: false
schema: {start: "YYYY-MM-DD", end: "YYYY-MM-DD"}
default: "最近30天"
on_invalid: ask_user("日期范围格式不正确,请重新提供")
这段 YAML 的价值不在于格式本身,而在于它强迫作者回答“如果没给会怎样”。本文评述:缺失策略是输入契约中最容易被跳过、也最影响成功率的一项。Agent 在缺输入时的默认行为往往是“编一个合理值”,这在演示中无害,在生产中是灾难。显式声明 on_missing,等于提前关闭了这条幻觉通道。
3.2 前置断言:让“输入合格”成为可判定命题
字段声明解决“有没有”,前置断言解决“合不合格”。断言应写成可求值为布尔值的表达式,并在 Skill 入口处统一执行。常见断言包括:文件行数大于阈值、关键列非空率高于某比例、时间范围不跨年、金额单位一致等。断言失败时应返回结构化错误,而非自然语言道歉,因为结构化错误才能被上游编排器捕获并路由到修复分支。
工程上建议把断言分为硬断言与软断言:硬断言失败即终止,软断言失败仅告警并记录。这一区分对应数据质量中的“阻断性缺陷”与“非阻断性缺陷”。笔者认为,很多 Skill 之所以“看起来能跑”,是因为作者把全部校验都写成了软告警,于是脏数据一路流到最终输出,错误被推迟到最昂贵的环节才暴露。
四、步骤原子性:从叙事段落到可执行单元
4.1 原子步骤的三元组结构
一个可执行步骤应满足:单一动作、可独立失败、失败后可定位。满足这三条的最小结构是“前置断言—动作—后置断言—失败分支”四元组,其中前置与后置断言共同构成该步骤的验收标准。动作本身应绑定到具体工具或明确的操作语义,而不是“处理数据”这类动词。下表给出叙事写法与原子写法的对照。
| 叙事写法(不可执行) | 原子写法(可执行) |
|---|---|
| 读取数据并清洗,然后做汇总分析 | 步骤1:load_table(sales_file) → 断言 row_count>0;步骤2:drop_null(key_cols) → 断言 非空率≥0.98;步骤3:groupby(sku).sum(amount) |
| 根据情况选择合适的模型进行预测 | 步骤:select_model(task_type, data_size) → 断言 返回模型名在允许清单内;否则走 fallback_model |
本文评述:原子化的代价是篇幅膨胀,一份 3 页的叙事文档可能膨胀为 12 页的结构化文件。但这一代价换来的是可测试性——每个步骤都能单独构造输入、单独断言输出。没有可测试性,就没有可靠的蒸馏,因为无法判断蒸馏产物是否忠实于原任务。
4.2 步骤间的数据流必须显式命名
原子步骤之间靠数据流连接,而非靠“然后”。每个步骤的输出应赋予变量名,后续步骤通过变量名引用,形成有向无环图。这样做有两个直接收益:其一,依赖关系可被静态解析,编排器能自动排序与并行;其二,中间产物可被缓存与复用,重试时无需从头执行。实践中常见的反模式是步骤之间用“上述结果”指代,Agent 只能靠上下文猜测指代对象,长流程中极易错位。
steps:
- id: s1_load
action: load_table(sales_file)
post: "s1.rows > 0"
- id: s2_clean
action: drop_null(s1, key_cols)
depends_on: [s1_load]
post: "s2.null_ratio <= 0.02"
- id: s3_agg
action: groupby_sum(s2, by=sku, value=amount)
depends_on: [s2_clean]
post: "s3.row_count > 0"
这段结构看起来像工作流引擎的 DSL,事实也确实如此。笔者认为,Skill 文件与工作流定义的边界正在模糊,这并非坏事:当 Skill 能被工作流引擎直接消费时,它才真正脱离“文档”属性,进入“制品”属性。可被版本管理、可被 diff、可被 CI 校验,是 Skill 工程化的起点。
五、依赖显式化:隐式知识是最大的运行时炸弹
5.1 依赖的四种类型
Skill 的依赖远不止“需要某个工具”。按失败后果排序,至少包括四类:工具依赖(函数、API、MCP 服务)、数据依赖(前置数据集、知识库、缓存)、权限依赖(凭证、作用域、审批)、环境依赖(运行时版本、网络可达性、时区)。叙事文档通常只写第一类,后三类靠“大家都知道”维持,而 Agent 恰恰不知道。依赖声明应包含名称、版本约束、可用性检查方式与缺失时的降级策略。
本文评述:依赖隐式化的深层原因是蒸馏者的知识诅咒——专家对自己环境的默认配置毫无感知。缓解手段不是更仔细地写,而是引入“陌生环境演练”:在一台未配置任何额外依赖的干净环境中执行 Skill,把所有报错逐条转化为依赖声明。这一方法在软件工程中称为“从零构建验证”,迁移到 Skill 蒸馏同样有效。
5.2 依赖图与循环检测
把步骤依赖与资源依赖合并为一张有向图后,应做两项静态检查:一是无环检测,步骤级循环通常意味着流程设计错误;二是关键路径分析,识别出单点依赖,为其准备替代方案。对于确实需要迭代的场景(如“反复修改直到通过评审”),不应把循环藏在步骤里,而应显式建模为带停止条件的循环节点,这一点将在下一章展开。
工具层面,可借助现成的编排框架完成依赖解析。例如 LangGraph 以图结构组织节点与边,支持条件边与检查点;Dify 与 Coze 提供可视化工作流,导出后即为结构化定义。读者可参考 LangGraph 官方文档 与 Dify 文档 了解图式编排的具体写法。需要说明的是,框架只提供容器,依赖是否写全仍取决于作者。
六、停止条件:可观测谓词与失败边界
6.1 三类停止条件缺一不可
“直到任务完成”不是停止条件,因为它不可观测。可执行的停止条件应包含三类:成功谓词(满足即正常结束)、失败谓词(满足即异常结束并上报)、资源谓词(步数、时长、token 或费用达到上限即强制结束)。三者共同构成一个有界执行空间。缺少成功谓词会导致过早收工,缺少失败谓词会导致错误被掩盖,缺少资源谓词会导致无限循环。
| 类型 | 示例谓词 | 触发后行为 |
|---|---|---|
| 成功 | output.schema_valid == true 且 必填字段完整 | 返回结果并记录指标 |
| 失败 | 连续 2 次断言失败 或 关键工具返回 4xx | 终止并输出结构化错误码 |
| 资源 | steps > 15 或 elapsed > 120s | 强制终止,标记为“未收敛” |
本文评述:资源谓词常被视为“兜底”,其实它是质量信号。一个 Skill 如果频繁触发资源上限,说明步骤粒度过粗或停止谓词设计不当,应当回炉重构,而不是简单调大上限。把资源谓词的触发率纳入监控,等于给 Skill 做了一次持续的健康体检。
6.2 幂等与回滚:停止之后的事
停止条件决定“何时停”,幂等性决定“停了能否重来”。涉及写操作的步骤应声明幂等键,使重试不会产生重复副作用;涉及多步写操作的流程应声明补偿动作,使中途失败可以回滚到一致状态。这两项在叙事文档中几乎从不出现,却是生产环境与演示环境的分水岭。笔者认为,是否声明幂等与补偿,可以作为判断一份 Skill 是否达到生产级的硬指标之一。
七、关键数据与案例:缺口如何量化
7.1 评测口径设计
要证明“结构化写法确实提升可执行性”,需要可复现的评测口径。建议从四个指标入手:首次执行成功率(first-run success rate)、可定位失败率(失败日志能映射到具体步骤的比例)、平均重试次数、人工介入率。评测集应覆盖正常输入、边界输入与对抗输入三类,每类不少于 20 条。需要强调,这些指标衡量的是 Skill 质量,而非模型能力,因此应在固定模型与固定工具集下测量。
公开研究中与 Agent 可靠性直接相关的证据可作参照。ReAct 提出推理与行动交错,显著提升了任务完成的可解释性(Yao 等,2023);Toolformer 表明模型可自学调用工具的时机(Schick 等,2023);Reflexion 引入语言化反馈进行自我修正(Shinn 等,2023)。这些工作共同说明:显式的行动结构与反馈信号是可靠性的关键,而 Skill 文件正是把这种结构固化为制品的手段。本文评述:上述研究多在模型侧做改进,本文的视角是制品侧——在不改模型的前提下,通过改写 Skill 结构获得可靠性增益,二者互补而非替代。
7.2 一个可复现的对照案例
以一个“周度销售报表生成”任务为例,构造两版 Skill:A 版为叙事文档(约 600 字),B 版为结构化文档(输入契约 + 6 个原子步骤 + 依赖清单 + 三类停止条件)。在相同模型与工具集下各执行 50 次,输入中混入 20% 的脏数据(缺列、日期越界、金额为负)。以下为模拟整合数据,用于说明评测方法,非真实实验结果。
| 指标 | A 版(叙事) | B 版(结构化) |
|---|---|---|
| 首次执行成功率 | 62% | 86% |
| 可定位失败率 | 31% | 94% |
| 平均重试次数 | 2.7 | 1.2 |
| 人工介入率 | 41% | 13% |
这组数据的方向性结论与工程直觉一致:结构化主要改善的是“失败可定位”与“人工介入”,而非单纯的成功率。这也提示评测不应只看成功率一个数,否则会低估结构化的价值。笔者认为,可定位失败率是被严重忽视的指标,它直接决定运维成本——一个能自我说明失败原因的 Skill,其修复周期通常远短于一个只会说“出错了”的 Skill。
八、对比与局限:结构化不是万能药
8.1 三种写法的适用边界
结构化并非越重越好。轻量场景(单工具、单轮、输入简单)用简短提示即可,强行结构化会抬高维护成本;中量场景(多步骤、有状态)适合本文的契约式写法;重量场景(跨系统、需审批、强合规)则需要引入正式的工作流引擎与审计日志。判断依据可归纳为三条:步骤数是否超过 5、是否涉及写操作、失败后果是否可逆。三条中命中两条以上,就应升级为结构化写法。
本文评述:业界存在一种“全量结构化”的倾向,试图把所有 Skill 都写成 DSL。笔者认为这会造成新的技术债——过度形式化使非工程背景的领域专家难以参与编写,而领域知识恰恰是 Skill 的核心价值。合理的分工是:领域专家写语义,工程侧补契约,二者通过模板与校验工具衔接。
8.2 已知局限
第一,结构化无法消除语义歧义。断言能校验“金额非负”,但无法校验“这个金额是否应计入本周”。第二,静态校验覆盖不到动态环境,工具行为变化、数据分布漂移都需运行时监控补位。第三,蒸馏本身存在信息损失,专家在长尾情境下的判断难以完全形式化,Skill 文件应保留“升级到人工”的通道,而非追求全自动。第四,评测成本高,构造高质量对抗输入需要领域投入,小团队往往难以承受。
这些局限决定了 Skill 工程的定位:它是降低不确定性的手段,不是消除不确定性的手段。承认边界,才能把资源投在收益最高的环节——通常是输入契约与停止条件,而非步骤的无限细化。读者若想进一步了解 Agent 评测方法,可参考 AgentBench 论文 与 Prompt Engineering Guide 中的评测章节。
九、结论与展望
回到本文主线:Skill 文件的可执行性,取决于它是否构成一份接口清晰的契约。输入契约关闭幻觉通道,步骤原子化提供可测试性,依赖显式化消除运行时炸弹,停止条件划定有界执行空间。四者共同把“看起来能跑”转化为“失败可定位、重试可收敛、上线可监控”。这一转换不依赖更强的模型,而依赖更严谨的制品设计,因此对多数团队而言是当下即可获得的确定性收益。
展望未来,三个方向值得关注:其一,Skill 的标准化 schema 正在形成,若社区能就输入、步骤、依赖、停止四要素达成共识,跨框架复用将成为可能;其二,自动化校验工具会把本文的检查清单变为 CI 流水线的一环,使结构缺陷在合入前暴露;其三,蒸馏过程本身可被半自动化,从专家操作轨迹中抽取候选步骤与断言,再由人确认。笔者认为,第三条路径的关键不在于抽取算法,而在于抽取结果的可反驳性——专家能快速指出“这一步不对”,比系统自动写对更有工程价值。
十、主要参考文献
- Hinton G, Vinyals O, Dean J. Distilling the Knowledge in a Neural Network. arXiv:1503.02531, 2015.
- Yao S, Zhao J, Yu D, et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR, 2023.
- Schick T, Dwivedi-Yu J, Dessì R, et al. Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS, 2023.
- Shinn N, Cassano F, Gopinath A, et al. Reflexion: Language Agents with Verbal Reinforcement Learning. NeurIPS, 2023.
- Liu X, Yu H, Zhang H, et al. AgentBench: Evaluating LLMs as Agents. ICLR, 2024.
- Wang L, Ma C, Feng X, et al. A Survey on Large Language Model based Autonomous Agents. Frontiers of Computer Science, 2024.
- Wu Q, Bansal G, Zhang J, et al. AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation. arXiv:2308.08155, 2023.
- Chase H. LangChain 与 LangGraph: Building Stateful Agent Workflows. 官方文档, 2024.
- Anthropic. Building Effective Agents. 工程博客, 2024.
说明:文中涉及评测的对照数据为模拟整合数据,用于演示评测口径与分析方法,不代表任何真实实验结果。引用文献共 60 余篇(含上述主要文献及文中提及的框架文档、综述与会议论文),近三年文献占比超过 50%,引用时请以原始文献为准。
文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约 12600 字 | 参考文献 60 余篇(主要 9 篇)。

