AI研究

AI蒸馏:蒸馏出来的Skill文件,输入、步骤、依赖和停止条件怎么写,Agent才真的能执行而不是“看起来能跑”?

👤 为我痴狂 👁 3 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-11-06
首页› AI› AI研究› 正文
AI蒸馏:蒸馏出来的Skill文件,输入、步骤、依赖和停止条件怎么写,Agent才真的能执行而不是“看起来能跑”?

摘要: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 流水线的一环,使结构缺陷在合入前暴露;其三,蒸馏过程本身可被半自动化,从专家操作轨迹中抽取候选步骤与断言,再由人确认。笔者认为,第三条路径的关键不在于抽取算法,而在于抽取结果的可反驳性——专家能快速指出“这一步不对”,比系统自动写对更有工程价值。

十、主要参考文献

  1. Hinton G, Vinyals O, Dean J. Distilling the Knowledge in a Neural Network. arXiv:1503.02531, 2015.
  2. Yao S, Zhao J, Yu D, et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR, 2023.
  3. Schick T, Dwivedi-Yu J, Dessì R, et al. Toolformer: Language Models Can Teach Themselves to Use Tools. NeurIPS, 2023.
  4. Shinn N, Cassano F, Gopinath A, et al. Reflexion: Language Agents with Verbal Reinforcement Learning. NeurIPS, 2023.
  5. Liu X, Yu H, Zhang H, et al. AgentBench: Evaluating LLMs as Agents. ICLR, 2024.
  6. Wang L, Ma C, Feng X, et al. A Survey on Large Language Model based Autonomous Agents. Frontiers of Computer Science, 2024.
  7. Wu Q, Bansal G, Zhang J, et al. AutoGen: Enabling Next-Gen LLM Applications via Multi-Agent Conversation. arXiv:2308.08155, 2023.
  8. Chase H. LangChain 与 LangGraph: Building Stateful Agent Workflows. 官方文档, 2024.
  9. Anthropic. Building Effective Agents. 工程博客, 2024.

说明:文中涉及评测的对照数据为模拟整合数据,用于演示评测口径与分析方法,不代表任何真实实验结果。引用文献共 60 余篇(含上述主要文献及文中提及的框架文档、综述与会议论文),近三年文献占比超过 50%,引用时请以原始文献为准。

文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

内容仅供学习参考。如需引用,请以原始文献为准。  全文约 12600 字 | 参考文献 60 余篇(主要 9 篇)。

🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷