1. 从一份没人看的操作手册说起
企业里最尴尬的资产是什么?我投操作手册一票。写的时候兴师动众,评审的时候一堆人签字,发下去之后躺在共享盘里吃灰。真出了故障,值班的同事第一反应还是抓个老员工问“上次那个报错怎么处理的”,而不是去翻那份三百页的 PDF。
SkillForge 想干的事情,就是把这堆“死文档”变成“活能力”。它的核心命题一句话能说清:把企业操作手册(Runbook)编译成可证明、可进化的 Agent 能力(Skill)。拆开看有三个关键词——Runbook 是输入,Skill 是输出,中间夹着“可证明”和“可进化”两个硬约束。
这个方向适合谁看?如果你在做企业内部 Agent 落地、在维护运维知识库、在纠结“为什么我的 Agent 一上生产就胡说八道”,那这篇值得往下读。它解决的不是“怎么调 API”这种入门问题,而是“怎么让 Agent 的能力有据可查、有据可改”这种工程化问题。我见过太多团队把提示词往 Agent 里一塞就上线,出了事连是哪句话导致的都定位不到,SkillForge 这类思路就是冲着这个痛点去的。
需要先说明,下面涉及的具体实现细节,是基于这类系统常见工程实践做的合理补全,不是对某个特定产品的逆向。思路是通用的,你可以照着往自己的场景里套。
2. 为什么“手册变能力”这件事没那么简单
2.1 Runbook 和 Skill 之间隔着一道鸿沟
很多人第一反应是:把操作手册喂给大模型,让它自己理解不就行了?我试过,翻车率极高。原因在于 Runbook 和 Skill 是两种完全不同的东西。
Runbook 是给人看的,它默认读者有背景知识,会省略大量隐含前提。比如一句“重启服务后观察日志”,人知道要观察哪个日志、观察多久、什么算正常;Agent 不知道。Runbook 还充满模糊表述——“如果异常则回滚”,什么叫异常?哪个指标异常?阈值多少?这些在文档里往往靠人的经验补全。
Skill 是给 Agent 执行的,它必须把每个隐含前提显式化,把每个判断条件量化,把每个动作绑定到具体工具调用。中间这道鸿沟,靠“让模型自己悟”是填不平的,必须有一个结构化的编译过程。
2.2 “可证明”到底在证明什么
“可证明”这个词容易被误解成形式化验证那种数学证明。在企业 Agent 场景里,它更务实的含义是:这个 Skill 的每一步都能追溯到来源,每一次执行都能被评估,每一个结论都有证据链。
具体拆成三层。第一层是来源可追溯:Skill 里的每个步骤,对应 Runbook 的哪一段原文,编译过程要留下映射关系。第二层是执行可验证:Skill 跑完之后,怎么判断它做对了?需要有客观的评估信号,而不是让另一个模型说“我觉得挺好”。第三层是边界可界定:这个 Skill 在什么条件下适用、什么条件下必须交给人,要有明确声明。
没有这三层,“可证明”就是空话。我见过团队号称自己的 Agent“经过验证”,一问验证方法,答案是“我们人工看了几十个 case 觉得没问题”——这不叫可证明,这叫抽样感觉。
2.3 “可进化”不是自动改自己
“可进化”听起来很酷,但必须泼盆冷水:让 Agent 自动修改自己的 Skill 是极其危险的。真正的可进化,指的是基于评估反馈的受控迭代。
流程应该是这样的:Skill 执行产生执行记录,评估模块给出客观评分,当评分低于阈值或出现新的失败模式时,触发人工介入或半自动的 Skill 修订,修订后的版本重新走编译和评估流程。整个链条里,人始终在关键节点上有否决权。
为什么强调“受控”?因为企业操作手册对应的往往是生产环境,一次错误的自动修改可能导致服务中断。可进化的价值在于降低迭代成本,而不是取消人的判断。这个边界如果搞混,项目方向就歪了。
3. SkillForge 的整体架构拆解
3.1 四层结构:解析、编译、评估、进化
把 SkillForge 拆开,我倾向于分成四层,每层职责清晰,层与层之间通过结构化数据通信。
解析层负责吃进各种格式的 Runbook——Markdown、Confluence 导出、Word、甚至扫描件 OCR 结果——输出统一的中间表示。这一层的难点不在格式转换,而在语义切分:怎么把一份长文档切成一个个独立的操作单元,每个单元对应一个可执行的任务。
编译层是核心,把中间表示翻译成 Skill 的结构化定义。这里要做的关键决策是:Skill 用什么 schema 描述?步骤、前置条件、工具绑定、成功判据、失败处理,这些字段怎么设计才能既表达力足够又不过度复杂。
评估层负责给 Skill 打分。它需要两类信号:一类是静态的,比如 Skill 定义的完整性、步骤的可执行性;另一类是动态的,即实际执行后的结果验证。
进化层消费评估层的输出,识别需要修订的 Skill,生成修订建议,并管理版本。
这四层里,解析和编译决定 Skill 的“下限”,评估和进化决定 Skill 的“上限”。很多项目只做前两层就上线,结果就是一堆看起来很美但没人敢用的 Skill。
3.2 为什么选“编译”而不是“检索增强”
一个自然的疑问:为什么不直接用 RAG,把 Runbook 切片存进向量库,Agent 执行时检索相关片段?这样省事多了。
RAG 的问题在于它给的是参考,不是能力。检索出来的片段是“关于这件事的知识”,而不是“做这件事的步骤”。Agent 拿到片段后还得自己组织成行动,这个组织过程不可控、不可复现、不可评估。同一个问题问两次,Agent 可能组织出两种不同的执行路径。
编译的思路是把“组织成行动”这一步提前固化。编译产物是确定的、可审查的、可版本化的。Agent 执行时不再需要临场发挥,而是按编译好的 Skill 走。这带来的可证明性和可复现性,是 RAG 给不了的。
代价是灵活性下降。Runbook 没覆盖的场景,编译出来的 Skill 也覆盖不了。但这个代价在企业场景里是值得的——生产环境要的是稳定可控,不是天马行空。
3.3 Skill 的 schema 设计要点
Schema 设计是编译层的灵魂。我总结几个必须有的字段,以及为什么。
前置条件(preconditions):声明这个 Skill 在什么状态下才能执行。比如“服务处于运行状态”“数据库连接可用”。没有这个字段,Agent 可能在错误的前提下执行,导致灾难性后果。
步骤序列(steps):每个步骤包含动作描述、绑定的工具、输入参数、预期输出。动作描述给人看,工具绑定给机器执行,两者必须对应。
成功判据(success_criteria):怎么算这一步成功了。必须是可客观判定的,比如“返回码为 0”“日志中出现特定字符串”“指标恢复到阈值内”。禁止出现“看起来正常”这种主观描述。
失败处理(failure_handling):这一步失败了怎么办。是重试、回滚、还是升级给人。必须显式声明,不能留空。
回滚点(rollback_points):哪些步骤是可逆的,回滚动作是什么。生产操作没有回滚方案等于裸奔。
这几个字段缺一个,Skill 的可靠性就掉一个档次。我见过只写步骤不写判据的 Skill,执行完 Agent 自己都不知道成没成功,只能瞎猜。
4. 编译流程的实操细节
4.1 从 Runbook 到中间表示:语义切分怎么做
拿到一份 Runbook,第一步不是急着编译,而是切分。切分的粒度直接决定后续 Skill 的质量。
我的经验是按“可独立执行的任务”切,而不是按章节或段落切。一份 Runbook 里可能混杂着背景介绍、原理说明、操作步骤、故障排查。只有操作步骤才需要编译成 Skill,其他内容作为上下文附在 Skill 上即可。
切分的技术手段,纯靠规则很难做好,因为 Runbook 的写法千奇百怪。实践中比较稳的做法是规则打底加模型辅助:先用标题层级、编号列表这些结构信号做粗切,再用模型判断每个粗切块是不是“可执行任务”,是的话保留,不是的话归入上下文。
这里有个坑:模型判断“可执行性”时容易过度乐观,把“了解服务架构”这种也算成任务。所以判断标准要写死——必须包含明确的动作动词和可观测的结果。“重启服务并确认端口监听”算,“理解服务依赖”不算。
切分完成后,每个任务块要标注来源位置(原文的章节、行号),这是后面“可证明”的基础。
4.2 中间表示的结构化字段
切分出来的任务块,要转成中间表示。我建议的字段包括:
task_id:唯一标识source_ref:来源位置,精确到段落raw_text:原始文本action_verb:核心动作target:操作对象preconditions:从上下文推断的前置条件expected_outcome:预期结果ambiguities:识别出的模糊点
最后这个ambiguities字段很关键。编译过程中一定会遇到原文没说清的地方,比如“适当调整参数”里的“适当”是多少。这些模糊点不能靠模型猜,要显式记录下来,交给人工确认。这是保证“可证明”的重要环节——不确定的地方必须暴露,不能隐藏。
4.3 从中间表示到 Skill:绑定工具与量化判据
中间表示还是“人话”,编译成 Skill 要变成“机器话”。这一步的核心工作是两件事:绑定工具、量化判据。
绑定工具指的是把每个动作映射到具体的工具调用。比如“重启服务”这个动作,在你们的环境里可能是调用某个运维平台的 API,也可能是执行某条命令。这个映射关系必须显式配置,不能让 Agent 自己选。为什么?因为 Agent 选工具的依据是训练数据里的常见做法,不一定符合你们的环境。它可能选了一个你们根本没部署的工具,执行直接失败。
量化判据是把“预期结果”变成可判定的条件。这一步最考验功力。举个例子,原文说“确认服务恢复正常”,怎么量化?可能的判据包括:健康检查接口返回 200、关键指标在 5 分钟内回到基线、错误日志停止增长。这些判据要一条条列出来,并且指定判定方式(是查接口、查监控、还是查日志)。
判据的量化程度,直接决定评估层能不能客观打分。判据越模糊,评估越依赖主观,整个“可证明”的链条就越脆弱。
4.4 编译产物的版本管理
Skill 编译出来不是一劳永逸的。Runbook 会更新,环境会变化,Skill 必须跟着变。所以编译产物要有版本管理。
我的做法是Skill 版本和 Runbook 版本绑定。每次 Runbook 更新,触发重新编译,生成新的 Skill 版本。新旧版本的差异要能 diff 出来,方便审查。同时保留历史版本,出问题时可以回滚到旧版本。
版本管理还有个隐性好处:它能暴露 Runbook 的“漂移”。如果一份 Runbook 半年没更新,但对应的 Skill 频繁需要人工修订,说明 Runbook 已经和实际脱节了。这个信号对文档维护很有价值。
5. 可证明:评估体系怎么搭
5.1 静态评估:编译产物的完整性检查
静态评估在 Skill 执行之前就能做,成本低,应该作为第一道关卡。检查项包括:
| 检查项 | 判定标准 | 不通过的后果 |
|---|---|---|
| 前置条件完整性 | 每个步骤都有明确前置条件 | 可能在错误状态下执行 |
| 判据可判定性 | 成功判据不含主观词汇 | 无法客观评估执行结果 |
| 失败处理覆盖 | 每个步骤都有失败分支 | 失败时 Agent 无所适从 |
| 回滚方案存在 | 可逆步骤都声明了回滚 | 出错后无法恢复 |
| 工具绑定有效性 | 绑定的工具在环境中存在 | 执行时直接报错 |
| 来源可追溯 | 每个步骤能映射回原文 | 无法审计和追责 |
这张表可以直接做成 CI 检查,编译产物不通过就不允许发布。我强烈建议把静态评估做成硬性门禁,因为它的成本极低,但能拦掉大量低级问题。
5.2 动态评估:执行结果的客观验证
动态评估是重头戏。Skill 执行完之后,怎么判断它真的做对了?
核心原则是用客观信号,不用模型主观判断。模型说“执行成功”不算数,得有硬证据。硬证据的来源包括:工具调用的返回码、系统状态的实际变化、监控指标的数值、日志中的特定记录。
具体做法是,每个 Skill 的成功判据在编译时就绑定了一个验证器。验证器是一个可执行的检查逻辑,输入是执行后的系统状态,输出是布尔值加证据。比如“端口监听”这个判据,验证器就是去实际探测端口,返回是否可连接。
这里有个容易忽略的点:验证器本身也要被验证。如果验证器写错了,它可能给出错误的通过信号。所以验证器要有单元测试,用已知的正常和异常状态去测它,确保它判得准。
5.3 评估信号的采集与存储
评估产生的信号要存下来,这是“可进化”的燃料。存储的内容包括:Skill 版本、执行时间、执行环境、每步的实际结果、验证器的判定、证据快照。
为什么要存这么细?因为当出现失败时,你需要能回答“是哪一步、在什么条件下、因为什么失败的”。如果只存一个“成功/失败”的结论,排查时两眼一抹黑。
存储格式建议用结构化的,方便后续做聚合分析。比如统计某个 Skill 的失败率、某个步骤的高频失败模式、某类前置条件不满足的频率。这些统计是进化层做决策的依据。
5.4 评估的局限性要诚实面对
必须承认,客观评估有它的边界。有些操作的结果很难用程序判定,比如“确认业务逻辑正确”这种。对于这类判据,硬要量化反而会引入错误的信号。
务实的做法是分层处理:能客观判定的用验证器,不能客观判定的标记为“需人工确认”,并在 Skill 里显式声明。不要为了追求“全自动评估”而把主观判断伪装成客观判据,那是自欺欺人。
6. 可进化:迭代机制怎么设计
6.1 触发进化的信号有哪些
进化不是随时发生的,要有明确的触发条件。我梳理几类信号:
失败率超阈值:某个 Skill 在最近 N 次执行中失败率超过设定值,触发审查。
新失败模式:出现了历史上没见过的失败原因,说明环境或前置条件变了。
人工反馈:执行人员标记某次执行为“结果不对”或“步骤有问题”。
Runbook 更新:源文档变了,Skill 需要重新编译。
环境变更:依赖的工具、接口、指标定义发生变化。
这几类信号里,前两类可以自动检测,后三类需要外部输入。一个完整的进化机制要能接收所有这些信号。
6.2 修订建议的生成与人工审核
检测到信号后,系统可以生成修订建议,但不能自动应用。修订建议的生成方式,可以是基于失败记录的规则匹配,也可以是让模型分析失败原因后提出修改方案。
无论哪种方式,修订建议都要经过人工审核才能生效。审核的重点是:修改是否真的解决了问题、是否引入了新的风险、是否与 Runbook 的意图一致。
我见过想跳过人工审核直接自动修订的方案,理由是“提高效率”。这个思路在企业生产场景里是危险的。Skill 对应的是实际操作,一次错误的自动修改可能造成真实损失。效率的提升应该来自降低审核成本(比如把修订建议做得更清晰、把影响范围分析得更透彻),而不是取消审核。
6.3 版本回滚与灰度发布
修订后的 Skill 不能直接全量替换。要有灰度机制:先在部分场景或部分执行中试用新版本,观察评估信号,确认没问题再逐步扩大。
同时要保留快速回滚能力。一旦新版本出现问题,能立刻切回旧版本。回滚要能在分钟级完成,不能拖成小时级。
灰度发布和快速回滚,是把“可进化”的风险控制在可接受范围的关键机制。没有这两个,进化就是赌博。
7. 实操中踩过的坑与排查技巧
7.1 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| Skill 执行到某步卡住 | 前置条件未满足或工具无响应 | 检查前置条件判定逻辑、工具连通性 |
| 验证器误报成功 | 验证器逻辑有漏洞 | 用异常状态测试验证器 |
| 编译产物步骤缺失 | 语义切分漏掉了任务块 | 检查切分规则、人工复核原文 |
| 工具绑定错误 | 环境映射配置过时 | 核对工具清单、更新映射 |
| 评估信号缺失 | 验证器未正确采集证据 | 检查验证器输出、存储链路 |
| 进化建议质量差 | 失败记录信息不足 | 补充执行上下文采集 |
7.2 几个反直觉的经验
经验一:切分粒度宁粗勿细。我一开始追求细粒度切分,把每个小动作都切成独立任务,结果编译出来的 Skill 步骤过多,执行时容易在步骤衔接处出错。后来改成按“有意义的操作单元”切,一个 Skill 控制在 5 到 10 步,稳定性明显提升。
经验二:判据要留缓冲。比如“指标恢复到基线”,如果判据写成“等于基线值”,实际执行时因为指标波动几乎永远不满足。改成“在基线上下 10% 范围内持续 3 分钟”,才可判定。判据设计要考虑真实系统的噪声。
经验三:验证器要比 Skill 先测。很多人先写 Skill 再写验证器,结果验证器没测过就上线,给出的信号不可信。正确顺序是先确保验证器可靠,再用它来评估 Skill。
经验四:模糊点要早暴露。编译时遇到的模糊点,如果当时糊弄过去,执行时一定出问题。宁可编译阶段多花时间标注模糊点、找人工确认,也不要带着模糊上线。
7.3 关于 Agent 安全的边界
SkillForge 这类系统天然涉及 Agent 安全。核心原则是最小权限加显式授权。Skill 能调用的工具、能访问的资源,都要在编译时明确声明,执行时严格限制在这个范围内。不能让 Skill 执行时动态获取权限,那等于没有边界。
另外,涉及不可逆操作的 Skill,必须强制人工确认。什么叫不可逆?删数据、改配置、停服务这类。这些操作即使 Skill 评估通过,也要在执行前弹人工确认。可证明不等于可放手,这个边界要守住。
8. 这套思路能延展到哪里
SkillForge 的核心思路——把非结构化的操作知识编译成结构化、可评估、可迭代的能力——不局限于运维 Runbook。任何有“标准操作流程”的场景都能套。
比如客服场景,把话术手册编译成 Skill,评估指标换成客户满意度或问题解决率。比如财务场景,把报销审核规则编译成 Skill,评估指标换成审核准确率。比如生产制造,把设备操作规范编译成 Skill,评估指标换成操作合规性。
延展的关键在于评估信号的定义。不同场景的“做对了”标准不同,验证器的设计要跟着变。但整体架构——解析、编译、评估、进化四层——是通用的。
我个人在实际操作中的体会是,这套东西最难的不是技术实现,而是推动团队接受“能力要可证明”这个理念。很多人习惯了“差不多就行”,觉得给 Skill 加评估、加审核是负担。但真出过一次生产事故、被追问“这个操作到底有没有验证过”之后,就会明白这些约束的价值。前期多花的功夫,都是在给后期的稳定兜底。