Few-shot Examples
Few-shot Examples 是在 Prompt 中注入示例输入-输出对,让 LLM 学习期望的行为模式。它是 Prompt Engineering 中最有效的技术之一。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: Context Engineering MOC
- 相关: System Prompt, Prompt Template
Few-shot Examples
一句话定义
Few-shot Examples 是在 Prompt 中注入示例输入-输出对,让 LLM 学习期望的行为模式。“给模型看几个例子”比”写一堆规则”更有效。
核心原理
Zero-shot vs Few-shot
Zero-shot (无示例):
"请将以下文本分类为正面/负面/中性"
→ 模型可能理解不一致
One-shot (一个示例):
"示例: '很好吃' → 正面"
→ 模型理解了格式
Few-shot (多个示例):
"示例1: '很好吃' → 正面"
"示例2: '太难吃了' → 负面"
"示例3: '还行吧' → 中性"
→ 模型理解了分类标准
示例注入位置
messages = [
{"role": "system", "content": "你是一个情感分类器"},
# Few-shot 示例
{"role": "user", "content": "很好吃"},
{"role": "assistant", "content": '{"sentiment": "positive"}'},
{"role": "user", "content": "太难吃了"},
{"role": "assistant", "content": '{"sentiment": "negative"}'},
# 真实输入
{"role": "user", "content": "今天的天气怎么样"},
]
动态示例选择
class FewShotSelector:
def __init__(self, examples: list[dict]):
self.examples = examples
def select(self, input_text: str, k: int = 3) -> list[dict]:
"""选择与输入最相关的 k 个示例"""
# 方式 1: 随机选择
return random.sample(self.examples, min(k, len(self.examples)))
# 方式 2: 按相似度选择(需要 Embedding)
# input_embedding = embed(input_text)
# similarities = [cosine_sim(input_embedding, ex.embedding) for ex in self.examples]
# top_k = sorted(range(len(similarities)), key=lambda i: similarities[i])[-k:]
# return [self.examples[i] for i in top_k]
常见坑
- 示例太多: 占用太多上下文窗口
- 示例不典型: 选择的示例不能代表真实场景
- 示例有偏: 所有示例都是正面的,模型偏向正面
- 不做动态选择: 固定示例不适应不同输入