
Few-shot Prompt 设计艺术:示例即编程
Few-shot 的本质:上下文学习 大语言模型具备一种独特能力——上下文学习(In-Context Learning, ICL)。模型不需要更新参数,仅通过 Prompt 中提供的少量示例就能学会新任务。Few-shot Prompt 就是利用这一能力的技术。 核心公式: 模型输出 = f(Prompt 中的示例分布 × 输入查询) 模型并非"理解"了任务规则,而是从示例中提取了统计模式(输入-输出的映射关系、格式规范、语言风格),并在推理时应用这些模式。这意味着:示例的选择、排列、格式直接决定了模型的表现。 示例选择策略 随机选择 从示例池中随机抽取 K 个样本。最简单但效果最不稳定。 import random examples = load_examples("data/training_set.jsonl") selected = random.sample(examples, k=4) 问题: 随机选取可能选到不代表任务分布的示例,导致模型行为偏移。 相似性选择 基于语义相似度,选取与当前输入最接近的示例。这是最常用的策略: from sentence_transformers import SentenceTransformer import numpy as np class SimilarExampleSelector: def __init__(self, examples, model_name="all-MiniLM-L6-v2"): self.encoder = SentenceTransformer(model_name) self.examples = examples self.embeddings = self.encoder.encode( [ex["input"] for ex in examples], normalize_embeddings=True ) def select(self, query, k=4): query_emb = self.encoder.encode([query], normalize_embeddings=True) # 余弦相似度 scores = self.embeddings @ query_emb.T top_k_idx = np.argsort(scores.flatten())[-k:][::-1] return [self.examples[i] for i in top_k_idx] 效果: 在分类任务上,相似性选择通常比随机选择提升 3-8% 准确率。 注意: 相似性度量很关键。文本嵌入的相似性不等于任务语义相似性。在情感分析中,与查询情感极性相同的示例可能比主题相同的示例更有用。 多样性选择 确保所选示例覆盖不同类别/模式,避免同质化: def diverse_select(query, examples, k=4, n_clusters=4): """先聚类,再从每个簇中选最相似的""" from sklearn.cluster import KMeans embeddings = encode_all(examples) kmeans = KMeans(n_clusters=n_clusters, random_state=42).fit(embeddings) selected = [] for cluster_id in range(n_clusters): cluster_indices = np.where(kmeans.labels_ == cluster_id)[0] cluster_examples = [examples[i] for i in cluster_indices] # 从该簇中选与 query 最相似的 best = select_most_similar(query, cluster_examples) selected.append(best) return selected[:k] 选择策略对比 策略 实现难度 计算成本 效果稳定性 最佳场景 随机 极低 O(1) 低 基线对比、快速原型 相似性 中 O(N) 检索 中-高 分类、抽取、QA 多样性 高 O(N) + 聚类 高 多类别任务、生成任务 混合 高 中-高 最高 生产环境 示例顺序的影响 一个被广泛验证的现象:示例顺序对模型输出有显著影响。 ...