上下文学习¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
📖 章节导读¶
上下文学习(In-Context Learning, ICL)是大模型的一种重要能力,它允许模型通过上下文中的示例来学习新任务,而无需更新模型参数。本章将深入探讨上下文学习的原理、方法和应用。
🎯 学习目标¶
- 理解上下文学习的核心原理
- 掌握 Few-shot 和 Zero-shot Learning
- 学会设计有效的上下文示例
- 了解上下文学习的应用场景
- 掌握大厂面试中的相关问题
3.1 上下文学习原理¶
3.1.1 什么是上下文学习¶
定义:上下文学习是指大模型通过在输入中提供示例(上下文)来学习新任务的能力,而无需对模型进行微调或参数更新。
核心特点:
- 无需训练:不需要梯度下降和参数更新
- 即时学习:通过上下文示例立即学习新任务
- 泛化能力强:能够泛化到未见过的输入
- 灵活高效:可以快速适应不同任务
与传统学习的对比:
| 特性 | 传统学习 | 上下文学习 |
|---|---|---|
| 参数更新 | 需要 | 不需要 |
| 训练数据 | 大量标注数据 | 少量示例 |
| 学习时间 | 长 | 短 |
| 适应性 | 低 | 高 |
| 泛化能力 | 依赖训练数据 | 强 |
3.1.2 上下文学习的机制¶
理论解释:
- 元学习视角:
- 大模型在预训练阶段学习到了元学习能力
- 能够快速适应新任务
-
类似于"学习如何学习"
-
贝叶斯推理视角:
- 模型通过上下文示例推断任务分布
- 基于推断的分布生成输出
-
类似于贝叶斯推理
-
模式匹配视角:
- 模型识别输入与示例的模式关系
- 应用相同的模式到新输入
- 类似于类比推理
数学表示:
给定输入 x 和上下文示例 C = {(x₁, y₁), (x₂, y₂), ..., (xₖ, yₖ)},模型预测:
其中: - θ是模型参数(在上下文学习中固定) - P(θ | C)是基于上下文的后验分布 - 模型通过上下文推断任务分布
3.1.3 影响上下文学习的因素¶
关键因素:
- 示例数量:
- 太少:模型无法充分理解任务
- 太多:超出上下文窗口,增加成本
-
最佳范围:通常 3-10 个示例
-
示例质量:
- 准确性:示例必须准确无误
- 代表性:示例要覆盖不同情况
-
多样性:示例要多样化
-
示例顺序:
- 顺序会影响模型的理解
- 通常相似示例放在一起
-
困难示例可以放在后面
-
上下文格式:
- 格式要一致
- 标签要清晰
- 分隔符要明确
3.2 Few-shot Learning¶
3.2.1 Few-shot Learning 概述¶
定义:Few-shot Learning 是指在上下文中提供少量示例(通常 3-10 个)来帮助模型学习新任务。
优势:
- 快速适应:只需少量示例即可适应新任务
- 降低成本:不需要大量标注数据和训练
- 灵活性高:可以快速切换不同任务
- 易于实现:只需设计好示例和 Prompt
应用场景:
- 文本分类
- 命名实体识别
- 情感分析
- 问答系统
- 代码生成
3.2.2 Few-shot Learning 设计¶
设计原则:
- 示例选择:
- 选择有代表性的示例
- 覆盖不同类别和情况
-
避免示例之间的冲突
-
示例组织:
- 相似示例分组
- 按难度排序
-
使用清晰的分隔符
-
Prompt 设计:
- 明确任务描述
- 提供清晰的示例
- 指定输出格式
实现示例:
from openai import OpenAI
client = OpenAI(api_key="your-api-key")
def few_shot_sentiment_analysis(text):
"""Few-shot情感分析"""
prompt = """
你是一个情感分析专家。请判断以下文本的情感倾向(正面/负面/中性)。
示例:
示例1:
输入: 这个产品太棒了,我非常喜欢!
输出: 正面
示例2:
输入: 服务态度很差,不会再来了。
输出: 负面
示例3:
输入: 今天天气不错。
输出: 中性
示例4:
输入: 质量很好,性价比高。
输出: 正面
示例5:
输入: 功能不太好用。
输出: 负面
现在请分析以下文本:
输入: {text}
输出:
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个情感分析专家。"},
{"role": "user", "content": prompt.format(text=text)}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
test_texts = [
"这个功能设计得很好,用起来很方便。",
"客服响应太慢了,等了很久。",
"产品还可以,没有特别突出的地方。"
]
for text in test_texts:
result = few_shot_sentiment_analysis(text)
print(f"输入: {text}")
print(f"输出: {result}\n")
3.2.3 Few-shot Learning 优化¶
优化策略:
- 动态示例选择:
- 根据输入动态选择最相关的示例
- 使用相似度计算选择示例
-
提高示例的相关性
-
示例加权:
- 给不同示例分配不同权重
- 根据相似度调整权重
-
强调更相关的示例
-
多轮 Few-shot:
- 分阶段提供示例
- 逐步增加示例数量
- 动态调整示例
实现示例:动态示例选择
import numpy as np
from sentence_transformers import SentenceTransformer
class DynamicFewShotSelector:
"""动态Few-shot示例选择器"""
def __init__(self, examples, model_name='all-MiniLM-L6-v2'):
self.examples = examples
self.model = SentenceTransformer(model_name)
self.example_embeddings = self.model.encode(
[ex['input'] for ex in examples]
)
def select_examples(self, test_input, k=5):
"""选择最相似的k个示例"""
test_embedding = self.model.encode([test_input])
# 计算余弦相似度
similarities = np.dot(self.example_embeddings, test_embedding.T).flatten()
# 选择top-k
top_indices = np.argsort(similarities)[-k:][::-1]
return [self.examples[i] for i in top_indices]
def create_prompt(self, test_input, k=5):
"""创建动态Few-shot Prompt"""
selected_examples = self.select_examples(test_input, k)
prompt = "你是一个情感分析专家。请判断以下文本的情感倾向(正面/负面/中性)。\n\n"
prompt += "示例:\n\n"
for i, example in enumerate(selected_examples, 1): # enumerate同时获取索引和元素
prompt += f"示例{i}:\n"
prompt += f"输入: {example['input']}\n"
prompt += f"输出: {example['output']}\n\n"
prompt += f"现在请分析以下文本:\n"
prompt += f"输入: {test_input}\n"
prompt += f"输出:\n"
return prompt
# 使用示例
examples = [
{'input': '这个产品太棒了,我非常喜欢!', 'output': '正面'},
{'input': '服务态度很差,不会再来了。', 'output': '负面'},
{'input': '今天天气不错。', 'output': '中性'},
{'input': '质量很好,性价比高。', 'output': '正面'},
{'input': '功能不太好用。', 'output': '负面'},
{'input': '价格合理,值得购买。', 'output': '正面'},
{'input': '包装破损,不太满意。', 'output': '负面'},
{'input': '还可以,没有特别突出的地方。', 'output': '中性'},
{'input': '超出预期,非常满意。', 'output': '正面'},
{'input': '体验一般,有待改进。', 'output': '中性'},
]
selector = DynamicFewShotSelector(examples)
# 测试
test_input = "这个功能设计得很好,用起来很方便。"
prompt = selector.create_prompt(test_input, k=5)
print("动态选择的Few-shot Prompt:")
print(prompt)
3.3 Zero-shot Learning¶
3.3.1 Zero-shot Learning 概述¶
定义:Zero-shot Learning 是指在没有提供任何示例的情况下,仅通过任务描述让模型完成任务。
优势:
- 无需示例:不需要准备示例数据
- 灵活性极高:可以快速尝试新任务
- 成本低:不需要示例标注
- 通用性强:适用于各种任务
局限性:
- 性能不稳定:效果依赖于模型能力
- 理解偏差:可能对任务理解有偏差
- 格式问题:输出格式可能不符合预期
3.3.2 Zero-shot Learning 设计¶
设计原则:
- 清晰的任务描述:
- 明确说明任务目标
- 详细描述输出要求
-
提供必要的背景信息
-
明确的输出格式:
- 指定输出格式
- 提供输出示例
-
说明约束条件
-
角色设定:
- 给模型设定合适的角色
- 说明角色的专业知识
- 指定语言风格
实现示例:
def zero_shot_sentiment_analysis(text):
"""Zero-shot情感分析"""
prompt = """
你是一个情感分析专家。请判断以下文本的情感倾向。
任务要求:
1. 判断文本的情感倾向(正面/负面/中性)
2. 给出情感强度评分(1-10分)
3. 识别文本中的关键情感词
4. 简要说明判断理由
文本内容:
{text}
请按照以下格式输出:
情感倾向: [正面/负面/中性]
情感强度: [1-10分]
关键情感词: [关键词1, 关键词2, ...]
判断理由: [简要说明]
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个情感分析专家。"},
{"role": "user", "content": prompt.format(text=text)}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
test_text = "这个功能设计得很好,用起来很方便,大大提高了工作效率。"
result = zero_shot_sentiment_analysis(test_text)
print(result)
3.3.3 Zero-shot Learning 优化¶
优化策略:
- 思维链(Chain-of-Thought):
- 引导模型逐步推理
- 展示思考过程
-
提高推理准确性
-
角色增强:
- 详细描述角色背景
- 说明角色的专业知识
-
提供角色的工作方式
-
任务分解:
- 将复杂任务分解为子任务
- 逐步完成每个子任务
- 提高任务完成质量
实现示例:思维链 Zero-shot
def zero_shot_with_cot(text):
"""带思维链的Zero-shot学习"""
prompt = """
你是一个情感分析专家。请判断以下文本的情感倾向。
请按照以下步骤进行分析:
步骤1: 识别文本中的情感关键词
- 找出表达情感的词语
- 判断每个词的情感极性
步骤2: 分析文本的整体情感倾向
- 综合所有情感关键词
- 判断整体情感倾向
步骤3: 评估情感强度
- 根据情感词的数量和强度
- 给出情感强度评分(1-10分)
步骤4: 总结判断理由
- 说明判断的依据
- 给出简要理由
文本内容:
{text}
请按照以上步骤进行分析,并输出最终结果。
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个情感分析专家。"},
{"role": "user", "content": prompt.format(text=text)}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
test_text = "这个功能设计得很好,用起来很方便,大大提高了工作效率。"
result = zero_shot_with_cot(test_text)
print(result)
3.4 上下文学习应用¶
3.4.1 文本分类¶
应用场景:将文本分类到预定义的类别中。
Few-shot 实现:
def few_shot_text_classification(text, categories):
"""Few-shot文本分类"""
# 准备示例
examples = [
{'text': '这个产品太棒了!', 'category': '正面评价'},
{'text': '服务态度很差。', 'category': '负面评价'},
{'text': '今天天气不错。', 'category': '中性评价'},
{'text': '质量很好,性价比高。', 'category': '正面评价'},
{'text': '功能不太好用。', 'category': '负面评价'},
]
prompt = f"""
你是一个文本分类专家。请将文本分类到以下类别中:
类别:
{chr(10).join(f"- {cat}" for cat in categories)}
示例:
"""
for i, example in enumerate(examples, 1):
prompt += f"""
示例{i}:
文本: {example['text']}
类别: {example['category']}
"""
prompt += f"""
现在请分类以下文本:
文本: {text}
类别:
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个文本分类专家。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
categories = ['正面评价', '负面评价', '中性评价']
test_text = "这个功能设计得很好,用起来很方便。"
result = few_shot_text_classification(test_text, categories)
print(result)
3.4.2 命名实体识别¶
应用场景:识别文本中的命名实体(人名、地名、组织名等)。
Few-shot 实现:
def few_shot_ner(text):
"""Few-shot命名实体识别"""
examples = [
{
'text': '张三在北京的清华大学工作。',
'entities': '人名: 张三; 地名: 北京; 组织名: 清华大学'
},
{
'text': '李四去了上海,加入了阿里巴巴公司。',
'entities': '人名: 李四; 地名: 上海; 组织名: 阿里巴巴公司'
},
{
'text': '王五在深圳的腾讯公司工作。',
'entities': '人名: 王五; 地名: 深圳; 组织名: 腾讯公司'
},
]
prompt = """
你是一个命名实体识别专家。请识别文本中的命名实体(人名、地名、组织名)。
示例:
"""
for i, example in enumerate(examples, 1):
prompt += f"""
示例{i}:
文本: {example['text']}
实体: {example['entities']}
"""
prompt += f"""
现在请识别以下文本中的命名实体:
文本: {text}
实体:
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个命名实体识别专家。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
test_text = "赵六在杭州的网易公司担任软件工程师。"
result = few_shot_ner(test_text)
print(result)
3.4.3 问答系统¶
应用场景:基于给定文档回答问题。
Few-shot 实现:
def few_shot_qa(document, question):
"""Few-shot问答"""
examples = [
{
'document': 'Python是一种高级编程语言,由Guido van Rossum于1991年创建。',
'question': 'Python是什么时候创建的?',
'answer': 'Python于1991年创建。'
},
{
'document': '机器学习是人工智能的一个分支,它使计算机能够从数据中学习。',
'question': '机器学习是什么?',
'answer': '机器学习是人工智能的一个分支,它使计算机能够从数据中学习。'
},
{
'document': '深度学习是机器学习的一个子集,使用神经网络进行学习。',
'question': '深度学习使用什么进行学习?',
'answer': '深度学习使用神经网络进行学习。'
},
]
prompt = """
你是一个问答专家。请根据文档回答问题。
示例:
"""
for i, example in enumerate(examples, 1):
prompt += f"""
示例{i}:
文档: {example['document']}
问题: {example['question']}
答案: {example['answer']}
"""
prompt += f"""
现在请根据以下文档回答问题:
文档: {document}
问题: {question}
答案:
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个问答专家。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
document = "Transformer是一种深度学习模型架构,由Google在2017年提出,主要用于自然语言处理任务。"
question = "Transformer是什么时候提出的?"
result = few_shot_qa(document, question)
print(result)
3.4.4 代码生成¶
应用场景:根据自然语言描述生成代码。
Few-shot 实现:
def few_shot_code_generation(description, language='python'):
"""Few-shot代码生成"""
examples = [
{
'description': '计算列表中所有数字的平均值',
'code': '''def average(numbers):
return sum(numbers) / len(numbers)'''
},
{
'description': '检查一个数字是否为质数',
'code': '''def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True'''
},
{
'description': '反转字符串',
'code': '''def reverse_string(s):
return s[::-1]'''
},
]
prompt = f"""
你是一个代码生成专家。请根据描述生成{language}代码。
示例:
"""
for i, example in enumerate(examples, 1):
prompt += f"""
示例{i}:
描述: {example['description']}
代码:
```{language}
{example['code']}
```text
"""
prompt += f"""
现在请根据以下描述生成代码:
描述: {description}
代码:
```{language}
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个代码生成专家。"},
{"role": "user", "content": prompt}
],
temperature=0.3
)
return response.choices[0].message.content
# 测试
description = "计算斐波那契数列的第 n 项"
result = few_shot_code_generation(description, 'Python')
print(result)
3.5 上下文学习评估¶
3.5.1 评估指标¶
常用指标:
- 准确率(Accuracy):
- 正确预测的比例
-
适用于分类任务
-
精确率(Precision):
- 预测为正例中实际为正例的比例
-
关注预测的准确性
-
召回率(Recall):
- 实际为正例中被正确预测的比例
-
关注覆盖的完整性
-
F1分数:
- 精确率和召回率的调和平均
-
综合评估指标
-
BLEU/ROUGE:
- 文本生成质量
- 适用于翻译、摘要等任务
实现示例:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
def evaluate_predictions(y_true, y_pred, task_type='classification'):
"""评估预测结果"""
if task_type == 'classification':
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred, average='weighted')
recall = recall_score(y_true, y_pred, average='weighted')
f1 = f1_score(y_true, y_pred, average='weighted')
return {
'accuracy': accuracy,
'precision': precision,
'recall': recall,
'f1_score': f1
}
else:
# 其他任务的评估
pass
# 使用示例
y_true = ['正面', '负面', '中性', '正面', '负面']
y_pred = ['正面', '负面', '中性', '正面', '中性']
metrics = evaluate_predictions(y_true, y_pred)
print("评估指标:")
for metric, value in metrics.items():
print(f"{metric}: {value:.4f}")
3.5.2 评估方法¶
常用方法:
- 留出法(Hold-out):
- 将数据分为训练集和测试集
-
简单但可能不稳定
-
交叉验证(Cross-validation):
- 将数据分为k个子集
- 每次用一个子集作为测试集
-
更稳定的评估
-
自助法(Bootstrap):
- 有放回地抽样
- 适用于小数据集
实现示例:交叉验证
from sklearn.model_selection import KFold
import numpy as np
def cross_validate_icl(examples, k=5):
"""上下文学习的交叉验证"""
kf = KFold(n_splits=k, shuffle=True, random_state=42)
results = []
for fold, (train_idx, test_idx) in enumerate(kf.split(examples)):
print(f"Fold {fold + 1}/{k}")
# 分割数据
train_examples = [examples[i] for i in train_idx]
test_examples = [examples[i] for i in test_idx]
# 使用训练集作为 Few-shot 示例
# 这里简化处理,实际需要调用模型
fold_results = []
for test_ex in test_examples:
# 模拟预测
predicted = test_ex['output'] # 假设预测正确
fold_results.append({
'input': test_ex['input'],
'expected': test_ex['output'],
'predicted': predicted,
'correct': predicted == test_ex['output']
})
# 计算准确率
accuracy = sum(r['correct'] for r in fold_results) / len(fold_results)
results.append({
'fold': fold + 1,
'accuracy': accuracy,
'results': fold_results
})
print(f" Accuracy: {accuracy:.4f}")
# 计算平均准确率
avg_accuracy = np.mean([r['accuracy'] for r in results])
print(f"\nAverage Accuracy: {avg_accuracy:.4f}")
return results
# 使用示例
examples = [
{'input': '这个产品太棒了!', 'output': '正面'},
{'input': '服务态度很差。', 'output': '负面'},
{'input': '今天天气不错。', 'output': '中性'},
{'input': '质量很好,性价比高。', 'output': '正面'},
{'input': '功能不太好用。', 'output': '负面'},
{'input': '价格合理,值得购买。', 'output': '正面'},
{'input': '包装破损,不太满意。', 'output': '负面'},
{'input': '还可以,没有特别突出的地方。', 'output': '中性'},
]
results = cross_validate_icl(examples, k=4)
3.6 练习题¶
练习题1:基础Few-shot Learning¶
题目:设计一个Few-shot Prompt,用于判断文本是否包含技术术语。
参考答案:
few_shot_technical_term_prompt = """
你是一个技术术语识别专家。请判断文本是否包含技术术语。
示例:
示例 1:
输入: Python 是一种编程语言。
包含技术术语: 是
技术术语: Python, 编程语言
示例 2:
输入: 今天天气不错。
包含技术术语: 否
示例 3:
输入: 深度学习使用神经网络。
包含技术术语: 是
技术术语: 深度学习, 神经网络
示例 4:
输入: 我喜欢吃苹果。
包含技术术语: 否
现在请判断以下文本:
输入: {text}
包含技术术语: [是/否]
技术术语: [如果有,列出技术术语]
"""
练习题2:Zero-shot Learning¶
题目:设计一个Zero-shot Prompt,用于生成文本摘要。
参考答案:
zero_shot_summary_prompt = """
你是一个文本摘要专家。请为以下文本生成摘要。
摘要要求:
1. 准确概括原文主要内容
2. 保持原文的核心观点
3. 使用简洁明了的语言
4. 摘要长度控制在原文的 20%-30%
5. 保持客观中立的语气
原文:
{text}
请生成摘要:
"""
练习题3:动态示例选择¶
题目:实现一个动态示例选择器,根据输入文本选择最相关的Few-shot示例。
参考答案:
from sentence_transformers import SentenceTransformer
import numpy as np
class DynamicExampleSelector:
"""动态示例选择器"""
def __init__(self, examples, model_name='all-MiniLM-L6-v2'):
self.examples = examples
self.model = SentenceTransformer(model_name)
self.example_embeddings = self.model.encode(
[ex['input'] for ex in examples]
)
def select_examples(self, test_input, k=5):
"""选择最相似的 k 个示例"""
test_embedding = self.model.encode([test_input])
# 计算余弦相似度
similarities = np.dot(self.example_embeddings, test_embedding.T).flatten()
# 选择 top-k
top_indices = np.argsort(similarities)[-k:][::-1]
return [self.examples[i] for i in top_indices]
# 使用示例
examples = [
{'input': '这个产品太棒了!', 'output': '正面'},
{'input': '服务态度很差。', 'output': '负面'},
{'input': '今天天气不错。', 'output': '中性'},
]
selector = DynamicExampleSelector(examples)
selected = selector.select_examples('这个功能很好', k=2)
print(selected)
3.7 面试准备¶
3.7.1 大厂面试题¶
字节跳动面试题:
- 问题:什么是上下文学习?它与传统学习有什么区别?
参考答案: - 上下文学习是通过在输入中提供示例来学习新任务的能力 - 区别: * 传统学习需要参数更新,上下文学习不需要 * 传统学习需要大量标注数据,上下文学习只需要少量示例 * 传统学习训练时间长,上下文学习即时学习 * 上下文学习灵活性更高,可以快速适应不同任务
- 问题:Few-shot Learning和Zero-shot Learning有什么区别?
参考答案: - Few-shot Learning:在上下文中提供少量示例(3-10个) - Zero-shot Learning:不提供任何示例,仅通过任务描述 - 区别: * Few-shot需要示例,Zero-shot不需要 * Few-shot通常性能更好,Zero-shot更灵活 * Few-shot需要准备示例数据,Zero-shot不需要 * Few-shot成本略高,Zero-shot成本更低
腾讯面试题:
- 问题:如何设计一个高质量的Few-shot Prompt?
参考答案: - 选择有代表性的示例 - 确保示例准确无误 - 覆盖不同类别和情况 - 保持示例格式一致 - 合理组织示例顺序 - 提供清晰的任务描述 - 指定明确的输出格式
- 问题:上下文学习的局限性是什么?
参考答案: - 受到上下文窗口大小限制 - 示例质量影响性能 - 对于复杂任务可能不够 - 泛化能力有限 - 成本随示例数量增加
阿里巴巴面试题:
- 问题:在实际项目中,你是如何应用上下文学习的?
参考答案: - 任务分析:明确任务需求和目标 - 示例准备:选择高质量的示例 - Prompt设计:设计清晰的Prompt - 测试评估:测试和评估效果 - 优化改进:根据结果优化 - 部署监控:部署后持续监控
- 问题:如何评估上下文学习的效果?
参考答案: - 准确率:预测的准确性 - 一致性:多次运行的一致性 - 泛化能力:对未见数据的适应性 - 效率:Token使用和响应时间 - 鲁棒性:对不同输入的稳定性
3.7.2 面试技巧¶
技巧1:理论联系实际
回答问题时,结合实际项目经验,说明如何应用上下文学习解决实际问题。
技巧2:对比分析
对比Few-shot和Zero-shot的优缺点,说明在不同场景下的选择。
技巧3:展示思考过程
说明设计Prompt和选择示例的思考过程,展示你的分析能力。
技巧4:持续优化
说明如何通过迭代优化不断提升上下文学习的效果。
📝 本章小结¶
本章系统介绍了上下文学习的核心内容:
- ✅ 上下文学习原理:定义、机制、影响因素
- ✅ Few-shot Learning:概述、设计、优化
- ✅ Zero-shot Learning:概述、设计、优化
- ✅ 上下文学习应用:文本分类、命名实体识别、问答、代码生成
- ✅ 上下文学习评估:评估指标、评估方法
- ✅ 练习题:基础Few-shot、Zero-shot、动态示例选择
- ✅ 面试准备:大厂面试题和解答技巧
通过本章学习,你应该能够: - 理解上下文学习的核心原理 - 掌握Few-shot和Zero-shot Learning - 学会设计有效的上下文示例 - 了解上下文学习的应用场景 - 准备好应对大厂面试
🔗 下一步¶
下一章我们将深入学习思维链与推理,掌握如何引导大模型进行复杂推理。
继续学习: 04-思维链与推理.md
💡 思考题¶
-
上下文学习的核心机制是什么?
LLM通过Attention机制动态关注Prompt中的示例和指令,在不更新参数的情况下"学习"任务模式。本质是模型在预训练时已学会了"从上下文中学习"的元能力(meta-learning)。
-
Few-shot和Zero-shot Learning各有什么优缺点?
Few-shot:准确率高、格式可控,但消耗更多Token、示例选择影响大。Zero-shot:Token省、无需准备示例,但准确率较低、格式不好控制。实践中先试Zero-shot,效果不够再加Few-shot。
-
如何设计高质量的Few-shot示例?
①覆盖多样性 ②与当前输入语义相关 ③格式一致(输入→输出结构统一) ④难度适中 ⑤数量3-5个最佳。可用Embedding检索动态选择最相关示例。
-
上下文学习有哪些局限性?
①上下文窗口有限 ②对示例顺序和格式敏感 ③不能学习全新知识(只能激活已有知识) ④性能不如微调(复杂特定任务) ⑤推理成本随示例数增加。
-
在实际项目中如何应用上下文学习?
分层策略:简单任务→Zero-shot+指令;中等→Few-shot+动态示例检索;复杂→CoT+Few-shot。生产中推荐维护示例库(向量数据库存储),根据用户输入动态检索Top-K示例拼入Prompt。
📚 参考资料¶
- "Language Models are Few-Shot Learners" - Brown et al.
- "Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?" - Wei et al.
- "Large Language Models Are Zero-Shot Reasoners" - Kojima et al.
- OpenAI Documentation
- Hugging Face Documentation
最后更新日期:2026-02-12 适用版本:LLM应用指南 v2026