我的 Prompt & Skill 工程实践
Prompt & Skill 工程最佳实践
从多轮实战对抗式调优中沉淀的方法论。
一、Prompt 工程
1. 调优五原则
| 优先 | 说明 |
|---|---|
| 聚焦 > 全面 | 先保主任务稳定,再补细节 |
| 场景 > 通用 | 先问"缺什么字段会失真",保这些再优化其他 |
| 结构 > 辞藻 | 模块化结构比华丽描述有用,把任务说清楚就够 |
| 定性 > 精算 | LLM 擅长归类不擅长数值计算,需量化时尽可能用整数映射 |
| 减法 > 加法 | 先删冗余;删掉 30% 反而更稳,说明那 30% 不该在 |
2. Prompt 搭建
固定骨架: Role → Constraints → Input → Rules → Output Format
关键写法要求:
- 输出格式 = 可执行模板:直接给表格列名、占位示例,不要只说"按以下格式"。
- Few-shot 选边界 Case:反例选和正例最像、最易混淆的,不选明显错误的。
- 规则聚合不分散:同一意思只出现一次,能内嵌模板的别单独再写。
- 可选项写触发条件:改为"仅当……时输出""若……存在则补充""如未提及则省略"。(EARS语法给自然语言降熵)
- 控制长度:Prompt 太长 → 注意力稀释 → 核心质量下降。删重复、删无效话术、控制模板层级。
3. 对抗式调优
核心思路类似 GAN:目标 prompt 是 G,你扮演 D,用固定标准扫描输出,从 bad case 反推漏洞,精确打补丁。
单轮七步(不可跳):
1. 备份当前 prompt(版本号+时间戳)
2. 全量测试用例跑一遍,结果落盘
3. 判定标准逐条扫描,标记 bad case
4. 归类误判模式(找共性,不逐条修)
5. 只改一个变量(保证可归因)
6. 修改后全量重跑
7. 对比数据,按决策树决定保留哪版
判定标准: 必须是可二值判定的命题("缺少时间字段" ✓,"不够详细" ✗)。初期 5-8 条,单独存文件与 prompt 解耦。
Bad case 归类: 标注命中哪条标准 → 同标准下找共性 → 只挑本轮最突出的一种模式修。
反例写法: 选和正例最像的错误 case,附"为什么错"划定边界:
✅ 正例:[正确输出] → 为什么对:[判断依据]
❌ 反例:[相似但错] → 为什么错:[具体错误点]
版本决策树:
格式合规 < 100% → 否决
bad case 减少 → 替换
bad case 相同但 prompt 更短 → 替换
其他 → 保留旧版
约束分层: 宪法级(禁止编造、必须备份)不可动摇;法律级(阈值、批次大小)可随迭代调整。元指令与业务指令用明确标记隔离,防止泄漏到输出。
停止条件: ① 连续 2 轮 bad case=0 → 达天花板;② 连续 3 轮未减少 → 局部最优需重构;③ 剩余 bad case 全属软约束无法解决 → 转代码层面。
软约束 → 机制约束: 某类 bad case 加反例后仍 >20% 出现率,转为代码约束(输入端过滤 / 输出端截断 / 枚举收口)。不要依赖 LLM 的自觉性,能在代码层面解决的不寄希望于 prompt。
二、Skill 工程
Skill 是微服务,不是文档。有输入输出契约、触发边界、失败处理、版本管理。
1. 路由契约
路由契约决定 Skill 能否被正确触发,回答:什么时候该调?不该调?调需要给什么?
- 触发条件(AND)+ 排除条件(OR)显式写出。误触发损害 > 漏触发。
- description 一句话说清:做什么 + 何时用 + 何时不用 + 输出什么。
- 触发词覆盖:中英文、口语、正式表述全覆盖。
- 必需输入:类型 + 示例值 + 缺失时的默认行为。
2. 架构与加载
skill-name/
├── SKILL.md # 元数据 + 路由 + 执行指引
├── scripts/ # 确定性脚本
├── references/ # 按需加载的参考文档
└── resources/ # 模板/数据
三层渐进加载: L1(启动时加载 name+description 做路由)→ L2(触发后加载 SKILL.md)→ L3(执行时按需加载 scripts/references)。SKILL.md 控制 500 行内,超过拆子文档。删掉不影响效果的话就删掉它。
3. SKILL.md 模板
---
name: skill-name
description: 做什么 + 何时用 + 何时不用 + 输出什么
---
## 路由契约(触发 AND / 排除 OR)
## 必需输入(字段: 类型 / 示例 / 缺失默认行为)
## 执行步骤(标注执行者:模型/脚本)
## 输出格式(固定模板或 JSON Schema)
## 失败处理(场景 / 检测 / 动作)
## 示例(正例 + 反例)
4. 设计决策
两种形态:
| 定时任务型 | 会话触发型 | |
|---|---|---|
| 核心矛盾 | 无人值守的可靠性 | 触发准确性和响应速度 |
| 设计重点 | 闭环、幂等、失败处理 | 路由精度、触发词、响应速度 |
自由度控制: 后果不可逆 → 低自由度(脚本锁死);后果可逆成本低 → 高自由度(交给模型)。确定性操作剥离给 scripts。
执行闭环四环: 数据获取(独立超时重试)→ 处理计算(确定性交脚本,不确定性交模型)→ 输出存储(唯一标识保证幂等)→ 通知反馈(成功和失败都推送)。
组合协作: 单一职责(拆分依据是"能否被单独复用");通用接口(Markdown/JSON);多源并行获取 + 权重去重 + 时间戳机制检查。
自动化保障: 把约束写成 lint 规则自动检查,通过 Rules 自动注入,不靠人的记忆。
Linter 把品味变成代码,Rules 把约束变成基础设施。
三、统一视角
Prompt 解决"怎么让 LLM 做对事",Skill 解决"怎么让做对的事稳定跑在生产环境"。
三条核心信念: 不信任 LLM 自觉性,用数据找漏洞、反例划边界、代码做兜底;先稳定再丰富;调优不是加更多要求,而是让模型更容易把最重要的事做好。
#agent开发##prompt工程#
查看1道真题和解析