Prompt工程03:示例驱动
从 Few-shot、反例、边界样例到格式锚定,理解如何用示例引导模型输出高质量结果。
示例驱动是 Prompt 工程中最有效的技巧之一。给模型提供好的示例,相当于告诉它”我想要的结果长这样”,比用文字描述更直接、更准确。
为什么示例如此重要
大模型擅长模式匹配,但不擅长理解抽象规则。示例就是把抽象规则变成具体模式,让模型更容易模仿。
文字描述 vs 示例
文字描述:
将中文句子翻译成英文,要保持语义准确,语气自然。
带示例:
将中文句子翻译成英文:
输入:今天天气真好。
输出:The weather is nice today.
输入:我喜欢编程。
输出:I love programming.
输入:人工智能正在改变世界。
输出:
| 维度 | 文字描述 | 示例驱动 |
|---|---|---|
| 理解难度 | 高 | 低 |
| 输出一致性 | 差 | 好 |
| 格式准确度 | 低 | 高 |
| 学习成本 | 高 | 低 |
Few-shot 学习
Few-shot 学习是给模型提供少量示例,让它从示例中学习任务模式。
什么是 Few-shot
Few-shot = 少量示例 + 任务说明 + 测试输入
任务:将产品名称转换为描述性标题
示例1:
输入:无线耳机
输出:高保真音质 | 主动降噪 | 无线蓝牙耳机
示例2:
输入:机械键盘
输出:RGB背光 | 青轴手感 | 全尺寸机械键盘
示例3:
输入:智能手表
输出:健康监测 | 运动追踪 | 智能穿戴手表
测试:
输入:便携音箱
输出:
示例数量的影响
| 示例数量 | 效果 | 适用场景 |
|---|---|---|
| 0-shot | 无示例,直接让模型做 | 简单任务 |
| 1-shot | 1个示例 | 简单任务,格式明确 |
| 3-5 shot | 3-5个示例 | 大多数任务 |
| 10+ shot | 10个以上示例 | 复杂任务,多格式 |
经验法则:从3个示例开始,根据效果增加或减少。
Few-shot 的技巧
- 示例多样性:覆盖不同情况,避免模型过度拟合示例
- 示例质量:示例本身要高质量,错误示例会误导模型
- 示例顺序:先给简单示例,再给复杂示例
- 格式一致性:所有示例格式保持一致
反例的作用
反例告诉模型”我不想要什么”,有时比正例更重要。
何时需要反例
| 场景 | 反例作用 |
|---|---|
| 容易产生特定错误 | 展示错误形式,避免重复 |
| 输出需要精确格式 | 展示错误格式,强调正确格式 |
| 需要排除某些内容 | 展示要排除的情况 |
反例示例
任务:提取文章中的技术术语
正例:
输入:Java 虚拟机使用垃圾回收机制管理内存。
输出:Java 虚拟机, 垃圾回收
反例:
输入:这篇文章介绍了如何使用 Java 编程。
输出:(空,因为"Java"在这里是泛指,不是技术术语)
测试:
输入:Spring Boot 框架通过自动配置简化了应用开发。
输出:
反例的形式
| 形式 | 示例 | 适用场景 |
|---|---|---|
| 错误输出 | 展示错误结果 | 格式错误、内容错误 |
| 排除说明 | ”不要包含XXX” | 需要排除特定内容 |
| 边界说明 | ”当XXX时,输出空” | 边界条件处理 |
边界样例
边界样例是测试模型能力极限的示例,确保模型在边缘情况下也能正确处理。
常见边界情况
| 边界类型 | 示例 | 处理方式 |
|---|---|---|
| 空输入 | 输入为空字符串 | 返回默认值或提示 |
| 超长输入 | 输入超过 Token 限制 | 截断或提示 |
| 极端格式 | 非标准格式输入 | 容错处理或提示 |
| 歧义输入 | 有多种解释的输入 | 追问或默认处理 |
| 特殊字符 | 包含特殊符号的输入 | 转义或过滤 |
边界样例示例
任务:解析日期字符串
示例1(正常):
输入:2024-01-15
输出:{"year": 2024, "month": 1, "day": 15}
示例2(边界-空):
输入:
输出:{"error": "日期不能为空"}
示例3(边界-格式错误):
输入:2024/13/32
输出:{"error": "无效日期格式"}
示例4(边界-歧义):
输入:01-15
输出:{"year": null, "month": 1, "day": 15, "warning": "年份缺失"}
测试:
输入:2024-02-30
输出:
格式锚定
格式锚定是通过示例固定输出格式,确保模型输出符合预期。
为什么需要格式锚定
- 模型输出格式不稳定
- 需要后续程序解析输出
- 需要统一的输出结构
格式锚定技巧
| 技巧 | 示例 | 效果 |
|---|---|---|
| 明确分隔符 | ”用---分隔每个结果” | 避免结果混在一起 |
| 使用标签 | ”用 | 便于提取 |
| 固定字段 | ”输出必须包含name和value字段” | 确保完整性 |
| 禁用额外内容 | ”只输出JSON,不要解释” | 避免多余文字 |
格式锚定示例
任务:提取用户信息,输出JSON格式
示例:
输入:用户张三,年龄28,邮箱zhangsan@example.com
输出:{"name": "张三", "age": 28, "email": "zhangsan@example.com"}
注意:
- 只输出JSON字符串,不要包含其他文字
- 年龄必须是数字类型
- 邮箱必须是字符串类型
测试:
输入:用户李四,年龄30,邮箱lisi@company.cn
输出:
示例选择策略
选择好的示例是示例驱动的关键。
示例选择原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 代表性 | 覆盖常见情况 | 正常输入、边界输入、错误输入 |
| 多样性 | 包含不同类型 | 不同格式、不同长度、不同领域 |
| 准确性 | 示例本身正确 | 避免错误示例误导模型 |
| 简洁性 | 示例不要太长 | 聚焦核心模式 |
| 相关性 | 与测试输入相关 | 示例和测试在同一领域 |
示例组织方式
[任务说明]
[正例1]
输入:...
输出:...
[正例2]
输入:...
输出:...
[反例1]
输入:...
输出:(错误示范)
说明:为什么错误
[边界示例1]
输入:...(边界情况)
输出:...
[测试输入]
输入:...
输出:
常见问题与解决方案
问题1:示例太多导致 Token 浪费
表现:示例占用大量 Token,影响输入内容
解决方案:
- 精简示例,只保留必要信息
- 使用代表性示例,避免重复
- 考虑使用 Fine-tuning 替代 Few-shot
问题2:示例不够导致输出不稳定
表现:模型输出格式不一致
解决方案:
- 增加示例数量
- 添加反例和边界示例
- 使用格式锚定
问题3:示例偏差导致模型偏见
表现:模型输出偏向示例中的特定模式
解决方案:
- 增加示例多样性
- 确保示例覆盖不同情况
- 定期审查示例是否有偏见
问题4:示例过时导致输出错误
表现:示例中的信息已过期
解决方案:
- 定期更新示例
- 使用动态示例(从知识库获取)
- 在示例中注明时间范围
项目判断清单
- 输出格式不稳定 → 使用格式锚定示例
- 需要处理复杂逻辑 → 使用 Few-shot,增加示例数量
- 容易产生特定错误 → 添加反例
- 需要处理边缘情况 → 添加边界示例
- Token 预算有限 → 精简示例,使用代表性示例
- 输出需要程序解析 → 严格格式锚定
- 示例效果不好 → 检查示例质量和多样性