--- name: skill-optimization description: 使用 9 种内容模式和 10 条编辑原则评估并优化技能文件质量。适用于创建技能、完善技能内容或审计技能质量的场景。 --- # 技能内容优化 ## 核心理念 1. **基于发现**:每次变更都应解决一个已记录的问题,或遵循一个具名的项目专属来源 2. **具体化**:每种模式都提供检测标准和转换方法 3. **聚焦结构**:优化表达和组织方式;领域知识本身保持不变 4. **保留意图**:在改变结构、措辞、约束、上下文或示例之前,记录原始需求 5. **可追溯**:将每一处应用的变更关联到一个发现或具名的项目来源 6. **自包含**:确保每个纯技能在单独加载时都可独立执行;当每份副本都是独立执行所必需时,跨多个独立加载的纯技能之间的重复内容是合理的 ## 内容优化模式 ### P1:关键问题(必须修复) 会直接降低 LLM 使用该技能时执行准确性的问题。 #### BP-001:否定式指令 → 正向表达 | 检测 | 转换 | |-----------|-----------| | 技能指令中出现“不要”、“禁止”、“永远不要”、“避免” | 首先陈述期望的动作或允许的状态。仅当违反行为是不可逆的操作性动作、调用方通常无法恢复、且纯正向改写会模糊边界时,才保留明确的禁止性表述。将禁止性表述与安全替代方案以及允许跨越该边界的条件配对。可评审的质量策略应改写为正向形式。 | **例外边界示例**: - 允许保留:“将过期记录移至可恢复的归档区。除非用户明确授权永久删除,否则不要永久删除它们。” - 改写为正向形式:“不要臆造问题” → “每个问题都应基于 BP 模式或 10 条原则”、“不要跳过 P1 问题” → “在每次评审中评估所有 P1 问题”、“存在 P1 问题时不要给 A 级” → “仅当 P1 数量为零时才给出 A 级” 质量策略、角色边界、评分标准和一般工作规则始终使用正向表达。调用方会校验、覆盖或丢弃的输出永远不是不可逆的。 **技能示例:** - 修改前:“不要使用通用变量名” - 修改后:“使用能反映用途的描述性变量名(例如 `userId` 而非 `x`)” **为何对技能而言是关键问题**:仅有禁止性表述,会使可执行的目标状态无从确定。 #### BP-002:模糊指令 → 具体标准 | 检测 | 转换 | |-----------|-----------| | 模糊用词(“恰当”、“良好”、“合适”、“最佳”、“应当清晰”)遗留了一个预期成果所需的决策,且不同的合理解读会实质性改变执行或验证方式 | 按照下面的解决步骤,用**限制最少但足够充分的标准**来解决 | | 未指定的格式、长度、范围、语气或成功标准,只要不同的合理解读同样能满足预期结果 | 视为可接受的灵活性;仅当只有一种解读符合要求时才添加约束(如下游使用方需要特定格式,参见 BP-003) | **解决步骤**(针对第一行的发现): 1. 选择限制最少但足够充分的标准——即在排除最少有效行为的前提下,提供所需精确度的可衡量的 if-then 规则或阈值。 2. 记录其**精确度贡献**:它为预期结果所改进的可观测输出差异。 3. 记录其**约束成本**:它排除了原始意图中哪些本来有效的解决方案。 4. 只有当精确度贡献可识别、且约束成本仍保留原始意图时,才应用该标准。 5. 当输入或项目上下文无法确定该决策时,记录所需的来源,而不是凭空猜测。 **技能例外**:LLM 能从输入上下文中明确解决的表述(例如“用户遗留的空白之处”,当用户的提示词可供比对时)不算模糊——它描述的是确定性操作,而非主观判断。 **技能示例:** - 修改前:“适当地处理错误” - 修改后(标准来自具名来源):“遵循项目错误处理策略(docs/error-handling.md):对外部 API 调用、文件 I/O 和 JSON.parse 使用 try-catch 包裹;记录 error.name、error.stack 和时间戳;当调用方必须处理该错误时,携带上下文重新抛出。” - 修改后(无可用来源):“将‘错误处理策略’记录为所需来源,而不是臆造 try-catch 目标、日志字段或阈值。” **为何对技能而言是关键问题**:模糊指令会迫使模型在没有给定标准的情况下,选择一个影响结果的行为。 #### BP-003:缺失输出格式 → 结构化输出 | 检测 | 转换 | |-----------|-----------| | 技能描述了要做什么,但未说明预期的交付物格式 | 添加输出章节,定义输出使用方(解析、路由、比对、验证)所需的结构、字段和顺序,而非按惯例随意选择格式 | 对于技能评审,输出契约包含 BP-001 至 BP-009 的覆盖情况、稳定的发现 ID、严重程度、位置、引用依据、有依据的拒绝项、需保留的要求、未解决的输入,以及最终评级。对于技能创建,输出是完整的 `SKILL.md` 内容,加上任何所需的同目录引用文件或脚本。 **技能示例:** - 修改前:“分析代码中的问题” - 修改后(评审报告使用方所需的格式):“输出 `## Issues Found` 作为报告渲染器可解析的表格:| 严重程度 | 位置 | 描述 | 建议修复方案 |” **为何对技能而言是关键问题**:结构化输出约束能减少幻觉,并使技能结果保持一致。 #### BP-009:无边界的工作生成 → 相称的工作量 | 检测 | 转换 | |-----------|-----------| | 一个发现、可能性或技术上有效的改进,在不改变结果、必需边界、真实使用方或必要证明的情况下变成了强制项 | 将其视为候选项;保留必需的工作,并允许无变更、复用以及有依据支持的拒绝 | | 研究广度决定了实现或产物的范围 | 一旦预期结果可被观察到即停止;单纯的发现本身不应扩大工作范围 | **为何对技能而言是关键问题**:能力强的模型会执行隐含的义务,因此缺乏支撑依据的可能性会凭空制造出并不能改善结果的工作。 ### P2:高影响(应当修复) 处理后能提升技能有效性的问题。 #### BP-004:非结构化内容 → 有组织的格式 | 检测 | 转换 | |-----------|-----------| | 一大段文字没有标题分隔 | 应用标准章节顺序(见下文) | | 一个章节中混杂了多个主题 | 拆分为各自独立的带标题章节 | | 参考数据未使用表格呈现 | 将标准/模式列表转换为表格 | **标准技能章节顺序:** 1. 上下文/前置条件 2. 核心概念(定义、模式) 3. 流程/方法论(分步说明) 4. 输出格式/示例 5. 质量检查清单 6. 参考资料 **条件性**:如果技能文件少于 30 行且只涉及单一主题,可跳过重新结构化。 #### BP-005:缺失或过多的上下文 → 必要且充分的上下文 | 检测 | 转换 | |-----------|-----------| | 技能假设了未言明的已知知识 | 添加“前置条件”章节,列出所需上下文 | | 使用了领域术语但未加以定义 | 内联添加定义,或放入术语表。**技能例外**:属于 LLM 基础知识范围内的术语(广泛使用的技术术语、标准领域词汇)无需定义。只有项目专属术语、内部命名约定或常见 LLM 训练数据之外的领域行话才需要明确定义。 | | 没有“何时使用”的指引 | 添加带具体场景的触发条件 | | 对下游没有影响,且内容重复、会分散注意力或不可执行的上下文 | 将重复的事实浓缩为一条可操作的陈述;只有在需要提取出的事实时,才把原始背景信息保留在路径或引用之后;为项目专属事实标注来源 | **技能示例:** - 修改前:“迁移时应用绞杀者(strangler)模式” - 修改后:“**前置条件**:存在具备可识别模块边界的现有单体应用。**何时使用**:在维持生产流量的同时替换遗留模块。” #### BP-006:缺失或过多的流程控制 → 依据驱动的检查点 | 检测 | 转换 | |-----------|-----------| | 若缺少前置依据,后续动作将失效 | 添加检查点,指明所需依据和转换条件 | | 权限、不可逆动作、机器读取的契约或完成证明是隐含的 | 将该边界明确化 | | 一个可逆的选择被规定为强制路径 | 陈述目的、依据和选择标准;让模型自行选择路径 | | 某检查点要求特定标签或产物,尽管存在语义等价的依据 | 除非机器读取方要求确切形式,否则应接受等价的依据 | **关键洞察**:控制的是边界和所需依据,而非在两者之间预设的路径。 对于技能创建,依次使用三个检查点: 1. **分析检查点**:原始需求已记录、BP-001 至 BP-009 均已覆盖、每个问题都有依据、且没有未解决的输入阻碍工作的忠实完成。 2. **优化检查点**:每个发现都有一个已应用/已跳过的处理方式、每处变更均可追溯、且所有需保留的要求依然得到体现。 3. **平衡检查点**:意图保留、决策充分性、信息密度、约束必要性、工作量相称性和可追溯性均通过后,结果方为最终版本。 对于评审驱动的修复,以当前评审作为分析依据,并将优化检查点和平衡检查点应用于已接受的修复范围。 ### P3:增强项(可以修复) 针对特定场景的渐进式改进。 #### BP-007:不必要或有偏差的示例 → 最小必要示例集 | 检测 | 转换 | |-----------|-----------| | 示例只是复述了 LLM 已知的行为 | 替换为简洁的规则或使用方所需的输出形态,并移除这些示例 | | 示例编码了领域、产品或组织专属的映射关系、非显而易见的例外情况,或规则无法表达的边界 | 保留能覆盖这些映射关系的最小集合;将每个示例对应到它所消除的歧义 | | 多个示例消除了相同的歧义,或所有示例都具有相同的表层模式 | 缩减为能覆盖所有情况的最小集合;仅当能消除不同的歧义时才添加新的示例 | #### BP-008:不允许存在不确定性 → 明确的上报机制 | 检测 | 转换 | |-----------|-----------| | 技能要求始终给出确定性答案 | 将断言分类为已观察、已推断或未知;为模糊情况添加上报标准 | | 没有“何时停止”的指引 | 当某个未知因素阻碍下一步时,在当前检查点停止,并指明继续所需的确切依据或用户决策 | **技能示例:** - 修改前:“确定根本原因” - 修改后:“将根本原因分类为已观察、已推断或未知。当缺失的依据阻碍下一步时,在当前检查点停止,并指明继续所需的确切依据或用户决策。” ## 10 条技能编辑原则 针对技能内容的可衡量质量标准。每条原则都包含一个通过/未通过的测试。 | # | 原则 | 通过标准 | 未通过示例 | |---|-----------|---------------|--------------| | 1 | 上下文效率 | 每句话都提供非基础性知识、决策规则、必需边界或执行依据 | 复述基础行为,却没有给出对应的失败案例、评审发现或能体现执行影响的项目需求 | | 2 | 去重 | 同一技能内,同一抽象层级的概念不应被解释两次。当每份副本都是独立执行所必需时,跨多个独立加载的纯技能之间的重复是合理的;应评估这些副本之间的语义一致性,而非将其替换为对同级技能的引用 | 同一条规则在同一技能中出现两次,却没有增加不同的执行作用 | | 3 | 归类 | 相关标准集中在单一章节中(减少查阅次数) | 错误处理规则分散在 4 个章节中 | | 4 | 可衡量性 | 标准指明了可观测的依据、确定性决策规则或有依据支撑的阈值 | “编写整洁的代码”,却没有可观测的判定条件 | | 5 | 正向表达 | 指令陈述应当做什么(应用了 BP-001) | 将“只使用 X”写成“不要使用 any” | | 6 | 记法一致 | 标题层级、列表样式、表格格式统一 | 同一上下文中混用 `-`、`*`、`1.` | | 7 | 前置条件明确 | 项目专属及非基础性的前置条件均已陈述或提供链接;基础技术知识保持简洁 | 使用 "DI" 却未定义 Dependency Injection(依赖注入) | | 8 | 优先级排序 | 最重要的条目在前,例外情况在后 | 边界情况排在常见模式之前 | | 9 | 范围边界 | 明确说明该技能覆盖的范围,以及激活条件性内容的条件。一个纯技能应包含独立执行所需的全部上下文。跨技能引用仅保留给承担编排或技能选择角色的技能使用 | 某个纯技能因为另一个独立加载的技能中也包含某条可执行规则,就省略了该规则 | | 10 | 工作量相称性 | 每一项必需的产物、测试、检查点或决策都应改变结果、边界、使用方结果或必要证明 | 要求实现所有发现或所有技术上有效的改进 | ## 参考资料 - **创建技能**:参见 [references/creation-guide.md](references/creation-guide.md) 了解生成流程和描述撰写指南 - **评审技能**:参见 [references/review-criteria.md](references/review-criteria.md) 了解评估流程和评级方式