概念定义
单样本学习(One-shot Learning)是一种机器学习范式,模型仅通过一个示例就能学习并推广到新任务。在大语言模型中,这意味着通过提供单个演示例子来指导模型理解任务格式和期望输出。详细解释
什么是单样本学习?
单样本学习是介于零样本学习和少样本学习之间的方法。它通过提供一个精心设计的示例来展示任务的模式、格式和期望行为,让模型能够快速理解并泛化到新的输入。 核心特征- 单一示例:仅提供一个完整的输入-输出对
- 模式识别:通过示例学习任务的结构和规律
- 快速适应:无需大量数据即可理解任务要求
- 平衡效率:在示例数量和性能之间取得平衡
- 零样本学习:无示例,纯指令驱动
- 单样本学习:一个示例,展示模式
- 少样本学习:多个示例,强化学习
形象比喻单样本学习像是给AI展示一个”样板间”:零样本:“请装修一个现代风格的房间”(只有描述)
单样本:“这是现代风格房间的样子[展示一个样板间],请按这个风格装修”
少样本:“这里有3-5个不同的现代风格样板间,请参考这些风格装修”通过一个完整的示例,AI能够理解”现代风格”的具体体现。
工作原理
单样本学习依赖于大语言模型强大的模式识别和泛化能力: 关键机制- 模式提取:从示例中识别输入输出映射关系
- 结构理解:学习输出的格式和组织方式
- 语义理解:把握任务的本质目标
- 泛化应用:将学到的模式应用到新输入
实际应用
文本分类任务
Copy
def one_shot_classification(model, new_text, categories):
"""单样本文本分类"""
prompt = f"""
任务:将文本分类到给定类别中
示例:
文本:这家餐厅的菜品非常美味,服务态度也很好
类别:[正面, 负面, 中性]
输出:正面
现在分类:
文本:{new_text}
类别:{categories}
输出:
"""
return model.generate(prompt, max_tokens=10)
# 使用示例
result = one_shot_classification(
model,
"产品质量一般,不是很满意",
"[正面, 负面, 中性]"
)
# 输出:负面
数据格式转换
Copy
def one_shot_format_conversion(model, input_data, target_format):
"""单样本数据格式转换"""
prompt = f"""
任务:将数据转换为指定格式
示例:
输入:姓名:张三,年龄:25,职业:工程师
目标格式:JSON
输出:{{"name": "张三", "age": 25, "profession": "工程师"}}
现在转换:
输入:{input_data}
目标格式:{target_format}
输出:
"""
return model.generate(prompt)
# 使用示例
result = one_shot_format_conversion(
model,
"姓名:李四,年龄:30,职业:医生",
"JSON"
)
创意写作
Copy
def one_shot_creative_writing(model, theme, style):
"""单样本创意写作"""
prompt = f"""
任务:根据主题和风格创作内容
示例:
主题:友谊
风格:诗歌
输出:
真正的友谊如金子般珍贵,
在岁月的洗礼中愈发闪亮,
无论风雨还是阳光,
都有彼此相伴的温暖。
现在创作:
主题:{theme}
风格:{style}
输出:
"""
return model.generate(prompt)
# 使用示例
result = one_shot_creative_writing(
model,
theme="春天",
style="散文"
)
代码生成
Copy
def one_shot_code_generation(model, function_description):
"""单样本代码生成"""
prompt = f"""
任务:根据功能描述生成Python函数
示例:
功能描述:计算两个数的最大公约数
输出:
def gcd(a, b):
\"\"\"计算两个数的最大公约数\"\"\"
while b:
a, b = b, a % b
return a
现在生成:
功能描述:{function_description}
输出:
"""
return model.generate(prompt)
# 使用示例
result = one_shot_code_generation(
model,
"实现冒泡排序算法"
)
2024年最新技术
自适应示例选择
Copy
class AdaptiveOneShot:
"""自适应单样本学习"""
def __init__(self, model, example_pool):
self.model = model
self.example_pool = example_pool
def select_best_example(self, query, task_type):
"""为查询选择最佳示例"""
similarities = []
for example in self.example_pool[task_type]:
# 计算查询与示例的相似度
similarity = self.calculate_similarity(query, example['input'])
similarities.append((example, similarity))
# 选择最相似的示例
best_example = max(similarities, key=lambda x: x[1])[0]
return best_example
def one_shot_predict(self, query, task_type):
"""基于最佳示例的单样本预测"""
example = self.select_best_example(query, task_type)
prompt = f"""
任务:{task_type}
示例:
输入:{example['input']}
输出:{example['output']}
现在处理:
输入:{query}
输出:
"""
return self.model.generate(prompt)
结构化单样本学习
Copy
def structured_one_shot(model, task_desc, example, new_input):
"""结构化单样本学习(2024年最佳实践)"""
prompt = f"""
<task>
{task_desc}
</task>
<example>
<input>{example['input']}</input>
<output>{example['output']}</output>
</example>
<new_task>
<input>{new_input}</input>
<output>
"""
return model.generate(prompt, stop=["</output>"])
多模态单样本学习
Copy
class MultimodalOneShot:
"""多模态单样本学习"""
def __init__(self, multimodal_model):
self.model = multimodal_model
def image_classification_one_shot(self, example_image, example_label,
new_image, categories):
"""图像分类的单样本学习"""
prompt = f"""
任务:图像分类
示例:
[展示图像:{example_image}]
类别:{categories}
标签:{example_label}
现在分类:
[展示图像:{new_image}]
类别:{categories}
标签:
"""
return self.model.generate_with_images(
[example_image, new_image],
prompt
)
def visual_question_answering_one_shot(self, example_img, example_q,
example_a, new_img, new_q):
"""视觉问答的单样本学习"""
prompt = f"""
任务:根据图像回答问题
示例:
图像:[{example_img}]
问题:{example_q}
答案:{example_a}
现在回答:
图像:[{new_img}]
问题:{new_q}
答案:
"""
return self.model.generate_with_images([example_img, new_img], prompt)
性能优化技巧
示例质量优化
Copy
class ExampleOptimizer:
"""示例质量优化器"""
def __init__(self, model):
self.model = model
def evaluate_example_quality(self, example, test_cases):
"""评估示例质量"""
scores = []
for test_input, expected_output in test_cases:
prompt = self.create_one_shot_prompt(example, test_input)
actual_output = self.model.generate(prompt)
# 计算输出质量分数
score = self.calculate_output_similarity(
expected_output, actual_output
)
scores.append(score)
return sum(scores) / len(scores)
def optimize_example(self, candidate_examples, test_cases):
"""从候选中选择最优示例"""
best_example = None
best_score = 0
for example in candidate_examples:
score = self.evaluate_example_quality(example, test_cases)
if score > best_score:
best_score = score
best_example = example
return best_example, best_score
提示词结构优化
Copy
def optimized_one_shot_prompt(task_desc, example, new_input,
output_constraints=None):
"""优化的单样本提示词结构"""
constraints_text = ""
if output_constraints:
constraints_text = f"\n\n<constraints>\n{output_constraints}\n</constraints>"
prompt = f"""
<instruction>
{task_desc}
{constraints_text}
</instruction>
<demonstration>
Input: {example['input']}
Output: {example['output']}
</demonstration>
<task>
Input: {new_input}
Output:
"""
return prompt
# 使用示例
prompt = optimized_one_shot_prompt(
task_desc="将非正式文本转换为正式文本",
example={
'input': "这个东西真的超级棒!",
'output': "这个产品确实表现优异。"
},
new_input="咋回事啊,怎么还没到?",
output_constraints="保持原意,使用正式用词,避免口语化表达"
)
单样本学习最佳实践
- 高质量示例:选择最能代表任务模式的典型示例
- 清晰结构:使用明确的输入输出分隔符
- 完整信息:示例应包含任务的所有关键要素
- 相关性原则:示例与实际任务在领域和复杂度上相匹配
- 格式一致:保持示例和新任务的格式完全一致
应用场景分析
适用场景
1. 快速原型开发Copy
def rapid_prototyping_one_shot(model, task_idea, single_example):
"""快速原型的单样本实现"""
prompt = f"""
新任务原型:{task_idea}
参考示例:
{single_example}
请按照示例模式处理新输入:
"""
return lambda new_input: model.generate(prompt + new_input)
Copy
def format_standardization_one_shot(model, source_format, target_format,
conversion_example):
"""格式标准化的单样本学习"""
prompt = f"""
任务:{source_format} → {target_format} 格式转换
转换示例:
{conversion_example}
请按相同模式转换:
"""
return prompt
Copy
def domain_adaptation_one_shot(model, general_example, domain_context):
"""领域适应的单样本学习"""
prompt = f"""
任务:在{domain_context}领域执行相同任务
通用示例:
{general_example}
请在指定领域执行相同类型任务:
"""
return prompt
不适用场景
单样本学习的局限性
- 高度复杂任务:需要多步推理的复杂任务
- 模式多样性:存在多种有效模式的任务
- 异常情况处理:需要处理边界条件的任务
- 上下文敏感:高度依赖上下文的任务
- 创造性要求:需要大量创新的开放式任务
评估与比较
性能指标
Copy
class OneShotEvaluator:
"""单样本学习评估器"""
def __init__(self, model):
self.model = model
def compare_shot_methods(self, task_data, evaluation_metric):
"""比较零样本、单样本、少样本性能"""
results = {}
# 零样本
zero_shot_scores = []
for item in task_data:
prompt = f"任务:{item['task_desc']}\n输入:{item['input']}\n输出:"
output = self.model.generate(prompt)
score = evaluation_metric(item['expected'], output)
zero_shot_scores.append(score)
# 单样本
one_shot_scores = []
example = task_data[0] # 使用第一个作为示例
for item in task_data[1:]:
prompt = f"""
任务:{item['task_desc']}
示例:
输入:{example['input']}
输出:{example['expected']}
现在处理:
输入:{item['input']}
输出:
"""
output = self.model.generate(prompt)
score = evaluation_metric(item['expected'], output)
one_shot_scores.append(score)
# 少样本(3个示例)
few_shot_scores = []
examples = task_data[:3]
for item in task_data[3:]:
prompt = f"任务:{item['task_desc']}\n\n"
for ex in examples:
prompt += f"输入:{ex['input']}\n输出:{ex['expected']}\n\n"
prompt += f"输入:{item['input']}\n输出:"
output = self.model.generate(prompt)
score = evaluation_metric(item['expected'], output)
few_shot_scores.append(score)
return {
'zero_shot': sum(zero_shot_scores) / len(zero_shot_scores),
'one_shot': sum(one_shot_scores) / len(one_shot_scores),
'few_shot': sum(few_shot_scores) / len(few_shot_scores)
}
2024年基准测试结果
典型任务性能对比任务类型 | 零样本 | 单样本 | 少样本(3) | 提升幅度 |
---|---|---|---|---|
文本分类 | 72.3% | 85.7% | 88.2% | +13.4% |
情感分析 | 78.1% | 89.3% | 91.5% | +11.2% |
格式转换 | 65.4% | 92.1% | 93.8% | +26.7% |
数据提取 | 69.8% | 87.4% | 89.6% | +17.6% |
创意写作 | 71.2% | 82.9% | 86.3% | +11.7% |
未来发展趋势
自动示例生成
Copy
class AutoExampleGenerator:
"""自动示例生成器"""
def __init__(self, model):
self.model = model
def generate_optimal_example(self, task_description, target_input_type):
"""为特定任务生成最优示例"""
prompt = f"""
任务:{task_description}
请生成一个高质量的示例,包含:
1. 典型的{target_input_type}输入
2. 正确且清晰的输出
3. 能够很好展示任务模式
示例格式:
输入:[示例输入]
输出:[示例输出]
"""
return self.model.generate(prompt)
动态示例调整
Copy
class DynamicExampleAdjuster:
"""动态示例调整器"""
def adjust_example_complexity(self, base_example, user_level):
"""根据用户水平调整示例复杂度"""
complexity_levels = {
'beginner': '简单直接的',
'intermediate': '适中复杂度的',
'advanced': '具有挑战性的'
}
prompt = f"""
请将以下示例调整为{complexity_levels[user_level]}版本:
原始示例:{base_example}
调整后的示例:
"""
return self.model.generate(prompt)
相关概念
延伸阅读
推荐资源
- Language Models are Few-Shot Learners - GPT-3论文,首次系统性研究少样本学习
- One-Shot Learning with Memory-Augmented Neural Networks - 经典单样本学习论文
- Making Pre-trained Language Models Better Few-shot Learners - 改进少样本学习的方法
- Prompt Engineering Guide - Few-Shot Prompting - 实用指南