Few-shot Prompting 2026

Few-shot Prompting 2026:示例选择与排列优化

Few-shot Prompting的2026年新认知 Few-shot Prompting——通过在Prompt中提供少量示例来引导模型行为——是最古老也最有效的Prompt工程技巧之一。2026年,随着上下文窗口从8K扩展到1M+ tokens,Few-shot的可能性大幅扩展,但"更多不等于更好"。 2026年核心发现: 示例质量比数量更重要(5个精选示例 > 50个随机示例) 示例顺序对结果影响可达15-20% 示例与查询的语义相似度是选择的关键指标 负面示例(错误案例+修正)比单纯正面示例更有效 示例选择算法 1. 随机选择(基线) import random def random_selection(examples: list[dict], k: int = 4) -> list[dict]: """随机选择k个示例""" return random.sample(examples, k) 2. KNN-based选择(2026年主流) import numpy as np from sklearn.neighbors import NearestNeighbors class KNNExampleSelector: """ 基于KNN的示例选择 选择与当前查询语义最相似的示例 """ def __init__(self, examples: list[dict], embed_model): self.examples = examples self.embed_model = embed_model # 预计算示例的embedding self.example_embeddings = np.array([ embed_model.encode(ex["input"]) for ex in examples ]) # 构建KNN索引 self.knn = NearestNeighbors( n_neighbors=min(20, len(examples)), metric='cosine' ) self.knn.fit(self.example_embeddings) def select(self, query: str, k: int = 4) -> list[dict]: """选择与query最相似的k个示例""" query_embed = self.embed_model.encode(query).reshape(1, -1) # KNN搜索 distances, indices = self.knn.kneighbors(query_embed) # 取top-k selected = [self.examples[i] for i in indices[0][:k]] return selected 3. 多样性感知选择 class DiversityAwareSelector: """ 多样性感知的示例选择 平衡相似性和多样性 """ def __init__(self, examples, embed_model): self.examples = examples self.embed_model = embed_model self.embeddings = np.array([ embed_model.encode(ex["input"]) for ex in examples ]) def select(self, query: str, k: int = 4, alpha: float = 0.5) -> list[dict]: """ alpha: 相似性权重 (0-1) 1-alpha: 多样性权重 """ query_embed = self.embed_model.encode(query) # 计算与查询的相似度 similarities = cosine_similarity( query_embed.reshape(1, -1), self.embeddings )[0] selected = [] selected_indices = [] for _ in range(k): scores = [] for i in range(len(self.examples)): if i in selected_indices: scores.append(-float('inf')) continue # 相似性分数 sim_score = similarities[i] # 多样性分数(与已选示例的最大距离) if selected_indices: max_sim_to_selected = max( cosine_similarity( self.embeddings[i].reshape(1, -1), self.embeddings[j].reshape(1, -1) )[0][0] for j in selected_indices ) div_score = 1 - max_sim_to_selected else: div_score = 1.0 # 综合分数 combined = alpha * sim_score + (1 - alpha) * div_score scores.append(combined) best_idx = np.argmax(scores) selected.append(self.examples[best_idx]) selected_indices.append(best_idx) return selected 4. 基于强化学习的选择 class RLExampleSelector: """ 基于强化学习的示例选择 通过历史反馈学习最优选择策略 """ def __init__(self, examples, embed_model): self.examples = examples self.embed_model = embed_model self.q_table = {} # state -> action values self.learning_rate = 0.1 self.epsilon = 0.1 def select(self, query: str, k: int = 4) -> list[dict]: query_embed = self.embed_model.encode(query) state = self._discretize_state(query_embed) if random.random() < self.epsilon: # 探索:随机选择 return random.sample(self.examples, k) else: # 利用:选择Q值最高的示例 selected = [] remaining = list(range(len(self.examples))) for _ in range(k): # 选择Q值最高的 q_values = [ self.q_table.get((state, i), 0.0) for i in remaining ] best = remaining[np.argmax(q_values)] selected.append(self.examples[best]) remaining.remove(best) return selected def update(self, query: str, selected_indices: list[int], reward: float): """根据反馈更新Q值""" query_embed = self.embed_model.encode(query) state = self._discretize_state(query_embed) for idx in selected_indices: key = (state, idx) old_q = self.q_table.get(key, 0.0) self.q_table[key] = old_q + self.learning_rate * ( reward - old_q ) 示例排列优化 排列效应分析 class ExampleOrderOptimizer: """ 示例排列优化器 研究:相同示例不同排列,准确率差异可达15-20% """ def __init__(self, model): self.model = model def evaluate_ordering(self, examples: list[dict], eval_set: list[dict]) -> float: """评估特定排列的准确率""" correct = 0 for eval_item in eval_set: prompt = self._build_prompt(examples, eval_item["input"]) response = self.model.generate(prompt) if self._check_answer(response, eval_item["output"]): correct += 1 return correct / len(eval_set) def find_optimal_order(self, examples: list[dict], eval_set: list[dict]) -> list[dict]: """寻找最优排列(贪心搜索)""" from itertools import permutations best_acc = 0 best_order = examples # 对于少量示例,可以穷举 if len(examples) <= 5: for perm in permutations(examples): acc = self.evaluate_ordering(list(perm), eval_set) if acc > best_acc: best_acc = acc best_order = list(perm) else: # 贪心搜索 best_order = self._greedy_search(examples, eval_set) return best_order 2026年排列最佳实践 ORDERING_GUIDELINES = """ === Few-shot 示例排列最佳实践 === 1. 最近效应(Recency Effect) - 模型更容易受最后一个示例的影响 - 将最相关的示例放在最后 2. 难度递进 - 从简单到复杂排列 - 帮助模型逐步理解任务 3. 正负交替 - 正例-反例-正例-反例 - 比连续正例更有效 4. 避免偏见 - 不要将所有同一类别的示例放在一起 - 打乱类别顺序减少偏见 5. 答案分布平衡 - 如果是分类任务,确保各类别示例数量均衡 - 避免模型偏向多数类 """ 负面示例技术 class NegativeExamplePrompting: """ 负面示例Prompting 展示错误案例及其修正,比纯正面示例更有效 """ @staticmethod def build_prompt(positive_examples: list[dict], negative_examples: list[dict], query: str) -> str: """ 构建包含正负示例的Prompt """ prompt = "请根据以下示例完成任务。\n\n" # 正面示例 prompt += "✅ 正确示例:\n" for ex in positive_examples: prompt += f"输入:{ex['input']}\n" prompt += f"输出:{ex['output']}\n" prompt += f"说明:{ex.get('explanation', '')}\n\n" # 负面示例 if negative_examples: prompt += "❌ 错误示例(请避免以下错误):\n" for ex in negative_examples: prompt += f"输入:{ex['input']}\n" prompt += f"❌ 错误输出:{ex['wrong_output']}\n" prompt += f"✅ 正确输出:{ex['correct_output']}\n" prompt += f"错误原因:{ex['error_reason']}\n\n" # 查询 prompt += f"现在请处理:\n输入:{query}\n输出:" return prompt 效果对比 方法 准确率 错误减少 适用场景 仅正面示例 82% - 简单任务 仅负面示例 75% - 错误模式明确 正面+负面 89% -39% 复杂任务 正面+负面+解释 93% -61% 高精度需求 跨语言Few-shot class CrossLingualFewShot: """ 跨语言Few-shot Prompting 用英语示例指导中文任务(或反向) """ def __init__(self, model): self.model = model def cross_lingual_prompt(self, source_examples: list[dict], target_query: str, source_lang: str = "en", target_lang: str = "zh") -> str: """ 构建跨语言Few-shot Prompt """ prompt = f"""以下是用{source_lang}语言展示的任务示例。 请理解示例中的任务模式,并用{target_lang}语言完成下面的查询。 示例: """ for ex in source_examples: prompt += f"Input: {ex['input']}\n" prompt += f"Output: {ex['output']}\n\n" prompt += f"现在请用{target_lang}回答:\n" prompt += f"Input: {target_query}\n" prompt += f"Output: " return prompt def translated_examples_prompt(self, examples: list[dict], query: str, target_lang: str = "zh") -> str: """ 翻译示例到目标语言后再使用 """ translated = [] for ex in examples: translated_input = self.model.translate( ex['input'], target_lang=target_lang ) translated_output = self.model.translate( ex['output'], target_lang=target_lang ) translated.append({ 'input': translated_input, 'output': translated_output }) return self._build_standard_prompt(translated, query) 动态Few-shot class DynamicFewShotSystem: """ 动态Few-shot系统 每次查询动态选择最相关的示例 """ def __init__(self, example_pool: list[dict], embed_model, llm): self.example_pool = example_pool self.embed_model = embed_model self.llm = llm self.selector = DiversityAwareSelector(example_pool, embed_model) self.feedback_store = [] async def answer(self, query: str, k: int = 4) -> dict: """动态选择示例并回答""" # 1. 选择示例 examples = self.selector.select(query, k=k) # 2. 构建Prompt prompt = self._build_prompt(examples, query) # 3. 生成回答 response = await self.llm.generate(prompt) # 4. 记录用于后续优化 self.feedback_store.append({ "query": query, "selected_examples": examples, "response": response, "timestamp": datetime.now() }) return { "answer": response, "examples_used": examples, "prompt": prompt } def optimize_pool(self): """基于历史反馈优化示例池""" # 分析哪些示例被高频选中且效果好 example_stats = {} for record in self.feedback_store: for ex in record["selected_examples"]: ex_id = ex["id"] if ex_id not in example_stats: example_stats[ex_id] = { "count": 0, "success": 0 } example_stats[ex_id]["count"] += 1 # 保留高频且高效的示例,淘汰低效的 # ... 评估与调试 class FewShotEvaluator: """Few-shot Prompting评估工具""" def __init__(self, model, eval_dataset): self.model = model self.eval_set = eval_dataset async def evaluate_configuration(self, selector_class, k: int, ordering: str = "similarity_desc", use_negative: bool = False) -> dict: """评估特定Few-shot配置""" selector = selector_class(self.eval_set, self.model) results = [] for item in self.eval_set: # 选择示例 examples = selector.select(item["input"], k=k) # 排列 if ordering == "similarity_desc": examples = sorted(examples, key=lambda x: x["similarity"]) elif ordering == "difficulty_asc": examples = sorted(examples, key=lambda x: x["difficulty"]) # 构建Prompt prompt = self._build_prompt(examples, item["input"]) # 生成 response = await self.model.generate(prompt) # 评估 correct = self._check(response, item["output"]) results.append({ "correct": correct, "response": response, "expected": item["output"] }) accuracy = sum(r["correct"] for r in results) / len(results) return { "accuracy": accuracy, "k": k, "selector": selector_class.__name__, "ordering": ordering, "use_negative": use_negative, "detailed_results": results } 2026年黄金法则 FEW_SHOT_GOLDEN_RULES_2026 = """ === Few-shot Prompting 黄金法则 === 1. 质量 > 数量 - 3-5个精选示例优于20个随机示例 - 每个示例都应展示不同的模式 2. 相似性选择 - 使用KNN或语义搜索选择与查询最相关的示例 - 但保持一定多样性 3. 排列有讲究 - 最相关的示例放最后(近因效应) - 简单到复杂排列帮助理解 4. 包含负面示例 - 展示"不该怎么做"比只展示"该怎么做"更有效 - 附带错误原因说明 5. 答案平衡 - 分类任务中各类别示例数量均等 - 避免模型产生频率偏见 6. 动态选择 - 不同查询用不同示例 - 建立示例池,按需选择 7. 持续优化 - 记录每次查询的示例选择和效果 - 定期评估和更新示例池 """ 结语 Few-shot Prompting看似简单——“给几个例子嘛”——但做到极致需要深入理解模型行为和任务特性。2026年的核心认知是:Few-shot不是静态的模板填充,而是一个动态的、数据驱动的系统。 ...

2026-06-30 · 5 min · 1046 words · 硅基 AGI 探索者
few shot prompt engineering

Few-shot Prompt Engineering:示例驱动的高效 Prompt 设计

一、Few-shot 学习基础 Few-shot Prompt 是 In-Context Learning(上下文学习)的核心实现方式——在 Prompt 中提供少量输入-输出示例,让模型"学会"目标任务模式,无需更新模型参数即可完成新任务。 1.1 三种模式对比 模式 示例数 适用场景 优势 劣势 Zero-shot 0 通用任务、简单分类 最简洁、最少 token 消耗 复杂任务准确率低 Few-shot 1-5 格式约束、新概念、风格迁移 精准控制输出格式和风格 需要设计示例 Many-shot 10-100+ 复杂模式学习、规则归纳 接近微调效果 token 开销大 1.2 In-Context Learning 的工作原理 Few-shot 学习的本质是:模型在前向传播过程中,利用注意力机制从示例中提取出输入-输出的映射模式,并在推理时复用该模式。 # Few-shot 学习示意代码 def build_few_shot_prompt(examples: list, test_input: str) -> str: """ examples: [{"input": "...", "output": "..."}, ...] """ prompt_parts = [] for i, example in enumerate(examples): prompt_parts.append(f"输入 {i+1}: {example['input']}") prompt_parts.append(f"输出 {i+1}: {example['output']}") prompt_parts.append("") prompt_parts.append(f"输入 {len(examples)+1}: {test_input}") prompt_parts.append(f"输出 {len(examples)+1}: ") return "\n".join(prompt_parts) # 示例:情感分类 examples = [ {"input": "这部电影太精彩了!", "output": "正面"}, {"input": "质量很差,不推荐购买。", "output": "负面"}, {"input": "还可以吧,一般般。", "output": "中性"}, ] test_input = "服务态度非常好,下次还来!" prompt = build_few_shot_prompt(examples, test_input) print(prompt) 二、示例选择策略 2.1 代表性选择 示例要覆盖任务的典型模式,而非随机选取。 ...

2026-06-25 · 4 min · 767 words · 硅基 AGI 探索者
鲁ICP备2026018361号