跳转至

上下文学习

⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。

上下文学习图

📖 章节导读

上下文学习(In-Context Learning, ICL)是大模型的一种重要能力,它允许模型通过上下文中的示例来学习新任务,而无需更新模型参数。本章将深入探讨上下文学习的原理、方法和应用。

🎯 学习目标

  • 理解上下文学习的核心原理
  • 掌握 Few-shot 和 Zero-shot Learning
  • 学会设计有效的上下文示例
  • 了解上下文学习的应用场景
  • 掌握大厂面试中的相关问题

3.1 上下文学习原理

3.1.1 什么是上下文学习

定义:上下文学习是指大模型通过在输入中提供示例(上下文)来学习新任务的能力,而无需对模型进行微调或参数更新。

核心特点:

  1. 无需训练:不需要梯度下降和参数更新
  2. 即时学习:通过上下文示例立即学习新任务
  3. 泛化能力强:能够泛化到未见过的输入
  4. 灵活高效:可以快速适应不同任务

与传统学习的对比:

特性 传统学习 上下文学习
参数更新 需要 不需要
训练数据 大量标注数据 少量示例
学习时间
适应性
泛化能力 依赖训练数据

3.1.2 上下文学习的机制

理论解释:

  1. 元学习视角:
  2. 大模型在预训练阶段学习到了元学习能力
  3. 能够快速适应新任务
  4. 类似于"学习如何学习"

  5. 贝叶斯推理视角:

  6. 模型通过上下文示例推断任务分布
  7. 基于推断的分布生成输出
  8. 类似于贝叶斯推理

  9. 模式匹配视角:

  10. 模型识别输入与示例的模式关系
  11. 应用相同的模式到新输入
  12. 类似于类比推理

数学表示:

给定输入 x 和上下文示例 C = {(x₁, y₁), (x₂, y₂), ..., (xₖ, yₖ)},模型预测:

Text Only
P(y | x, C) = ∫ P(y | x, θ) P(θ | C) dθ

其中: - θ是模型参数(在上下文学习中固定) - P(θ | C)是基于上下文的后验分布 - 模型通过上下文推断任务分布

3.1.3 影响上下文学习的因素

关键因素:

  1. 示例数量:
  2. 太少:模型无法充分理解任务
  3. 太多:超出上下文窗口,增加成本
  4. 最佳范围:通常 3-10 个示例

  5. 示例质量:

  6. 准确性:示例必须准确无误
  7. 代表性:示例要覆盖不同情况
  8. 多样性:示例要多样化

  9. 示例顺序:

  10. 顺序会影响模型的理解
  11. 通常相似示例放在一起
  12. 困难示例可以放在后面

  13. 上下文格式:

  14. 格式要一致
  15. 标签要清晰
  16. 分隔符要明确

3.2 Few-shot Learning

3.2.1 Few-shot Learning 概述

定义:Few-shot Learning 是指在上下文中提供少量示例(通常 3-10 个)来帮助模型学习新任务。

优势:

  1. 快速适应:只需少量示例即可适应新任务
  2. 降低成本:不需要大量标注数据和训练
  3. 灵活性高:可以快速切换不同任务
  4. 易于实现:只需设计好示例和 Prompt

应用场景:

  • 文本分类
  • 命名实体识别
  • 情感分析
  • 问答系统
  • 代码生成

3.2.2 Few-shot Learning 设计

设计原则:

  1. 示例选择:
  2. 选择有代表性的示例
  3. 覆盖不同类别和情况
  4. 避免示例之间的冲突

  5. 示例组织:

  6. 相似示例分组
  7. 按难度排序
  8. 使用清晰的分隔符

  9. Prompt 设计:

  10. 明确任务描述
  11. 提供清晰的示例
  12. 指定输出格式

实现示例:

Python
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 优化

优化策略:

  1. 动态示例选择:
  2. 根据输入动态选择最相关的示例
  3. 使用相似度计算选择示例
  4. 提高示例的相关性

  5. 示例加权:

  6. 给不同示例分配不同权重
  7. 根据相似度调整权重
  8. 强调更相关的示例

  9. 多轮 Few-shot:

  10. 分阶段提供示例
  11. 逐步增加示例数量
  12. 动态调整示例

实现示例:动态示例选择

Python
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 是指在没有提供任何示例的情况下,仅通过任务描述让模型完成任务。

优势:

  1. 无需示例:不需要准备示例数据
  2. 灵活性极高:可以快速尝试新任务
  3. 成本低:不需要示例标注
  4. 通用性强:适用于各种任务

局限性:

  1. 性能不稳定:效果依赖于模型能力
  2. 理解偏差:可能对任务理解有偏差
  3. 格式问题:输出格式可能不符合预期

3.3.2 Zero-shot Learning 设计

设计原则:

  1. 清晰的任务描述:
  2. 明确说明任务目标
  3. 详细描述输出要求
  4. 提供必要的背景信息

  5. 明确的输出格式:

  6. 指定输出格式
  7. 提供输出示例
  8. 说明约束条件

  9. 角色设定:

  10. 给模型设定合适的角色
  11. 说明角色的专业知识
  12. 指定语言风格

实现示例:

Python
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 优化

优化策略:

  1. 思维链(Chain-of-Thought):
  2. 引导模型逐步推理
  3. 展示思考过程
  4. 提高推理准确性

  5. 角色增强:

  6. 详细描述角色背景
  7. 说明角色的专业知识
  8. 提供角色的工作方式

  9. 任务分解:

  10. 将复杂任务分解为子任务
  11. 逐步完成每个子任务
  12. 提高任务完成质量

实现示例:思维链 Zero-shot

Python
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 实现:

Python
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 实现:

Python
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 实现:

Python
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 实现:

Python
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 评估指标

常用指标:

  1. 准确率(Accuracy):
  2. 正确预测的比例
  3. 适用于分类任务

  4. 精确率(Precision):

  5. 预测为正例中实际为正例的比例
  6. 关注预测的准确性

  7. 召回率(Recall):

  8. 实际为正例中被正确预测的比例
  9. 关注覆盖的完整性

  10. F1分数:

  11. 精确率和召回率的调和平均
  12. 综合评估指标

  13. BLEU/ROUGE:

  14. 文本生成质量
  15. 适用于翻译、摘要等任务

实现示例:

Python
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 评估方法

常用方法:

  1. 留出法(Hold-out):
  2. 将数据分为训练集和测试集
  3. 简单但可能不稳定

  4. 交叉验证(Cross-validation):

  5. 将数据分为k个子集
  6. 每次用一个子集作为测试集
  7. 更稳定的评估

  8. 自助法(Bootstrap):

  9. 有放回地抽样
  10. 适用于小数据集

实现示例:交叉验证

Python
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,用于判断文本是否包含技术术语。

参考答案:

Python
few_shot_technical_term_prompt = """
你是一个技术术语识别专家。请判断文本是否包含技术术语。

示例:

示例 1:
输入: Python 是一种编程语言。
包含技术术语: 是
技术术语: Python, 编程语言

示例 2:
输入: 今天天气不错。
包含技术术语: 否

示例 3:
输入: 深度学习使用神经网络。
包含技术术语: 是
技术术语: 深度学习, 神经网络

示例 4:
输入: 我喜欢吃苹果。
包含技术术语: 否

现在请判断以下文本:
输入: {text}

包含技术术语: [是/否]
技术术语: [如果有,列出技术术语]
"""

练习题2:Zero-shot Learning

题目:设计一个Zero-shot Prompt,用于生成文本摘要。

参考答案:

Python
zero_shot_summary_prompt = """
你是一个文本摘要专家。请为以下文本生成摘要。

摘要要求:
1. 准确概括原文主要内容
2. 保持原文的核心观点
3. 使用简洁明了的语言
4. 摘要长度控制在原文的 20%-30%
5. 保持客观中立的语气

原文:
{text}

请生成摘要:
"""

练习题3:动态示例选择

题目:实现一个动态示例选择器,根据输入文本选择最相关的Few-shot示例。

参考答案:

Python
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 大厂面试题

字节跳动面试题:

  1. 问题:什么是上下文学习?它与传统学习有什么区别?

参考答案: - 上下文学习是通过在输入中提供示例来学习新任务的能力 - 区别: * 传统学习需要参数更新,上下文学习不需要 * 传统学习需要大量标注数据,上下文学习只需要少量示例 * 传统学习训练时间长,上下文学习即时学习 * 上下文学习灵活性更高,可以快速适应不同任务

  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成本更低

腾讯面试题:

  1. 问题:如何设计一个高质量的Few-shot Prompt?

参考答案: - 选择有代表性的示例 - 确保示例准确无误 - 覆盖不同类别和情况 - 保持示例格式一致 - 合理组织示例顺序 - 提供清晰的任务描述 - 指定明确的输出格式

  1. 问题:上下文学习的局限性是什么?

参考答案: - 受到上下文窗口大小限制 - 示例质量影响性能 - 对于复杂任务可能不够 - 泛化能力有限 - 成本随示例数量增加

阿里巴巴面试题:

  1. 问题:在实际项目中,你是如何应用上下文学习的?

参考答案: - 任务分析:明确任务需求和目标 - 示例准备:选择高质量的示例 - Prompt设计:设计清晰的Prompt - 测试评估:测试和评估效果 - 优化改进:根据结果优化 - 部署监控:部署后持续监控

  1. 问题:如何评估上下文学习的效果?

参考答案: - 准确率:预测的准确性 - 一致性:多次运行的一致性 - 泛化能力:对未见数据的适应性 - 效率:Token使用和响应时间 - 鲁棒性:对不同输入的稳定性

3.7.2 面试技巧

技巧1:理论联系实际

回答问题时,结合实际项目经验,说明如何应用上下文学习解决实际问题。

技巧2:对比分析

对比Few-shot和Zero-shot的优缺点,说明在不同场景下的选择。

技巧3:展示思考过程

说明设计Prompt和选择示例的思考过程,展示你的分析能力。

技巧4:持续优化

说明如何通过迭代优化不断提升上下文学习的效果。

📝 本章小结

本章系统介绍了上下文学习的核心内容:

  1. ✅ 上下文学习原理:定义、机制、影响因素
  2. ✅ Few-shot Learning:概述、设计、优化
  3. ✅ Zero-shot Learning:概述、设计、优化
  4. ✅ 上下文学习应用:文本分类、命名实体识别、问答、代码生成
  5. ✅ 上下文学习评估:评估指标、评估方法
  6. ✅ 练习题:基础Few-shot、Zero-shot、动态示例选择
  7. ✅ 面试准备:大厂面试题和解答技巧

通过本章学习,你应该能够: - 理解上下文学习的核心原理 - 掌握Few-shot和Zero-shot Learning - 学会设计有效的上下文示例 - 了解上下文学习的应用场景 - 准备好应对大厂面试

🔗 下一步

下一章我们将深入学习思维链与推理,掌握如何引导大模型进行复杂推理。

继续学习: 04-思维链与推理.md

💡 思考题

  1. 上下文学习的核心机制是什么?

    LLM通过Attention机制动态关注Prompt中的示例和指令,在不更新参数的情况下"学习"任务模式。本质是模型在预训练时已学会了"从上下文中学习"的元能力(meta-learning)。

  2. Few-shot和Zero-shot Learning各有什么优缺点?

    Few-shot:准确率高、格式可控,但消耗更多Token、示例选择影响大。Zero-shot:Token省、无需准备示例,但准确率较低、格式不好控制。实践中先试Zero-shot,效果不够再加Few-shot。

  3. 如何设计高质量的Few-shot示例?

    ①覆盖多样性 ②与当前输入语义相关 ③格式一致(输入→输出结构统一) ④难度适中 ⑤数量3-5个最佳。可用Embedding检索动态选择最相关示例。

  4. 上下文学习有哪些局限性?

    ①上下文窗口有限 ②对示例顺序和格式敏感 ③不能学习全新知识(只能激活已有知识) ④性能不如微调(复杂特定任务) ⑤推理成本随示例数增加。

  5. 在实际项目中如何应用上下文学习?

    分层策略:简单任务→Zero-shot+指令;中等→Few-shot+动态示例检索;复杂→CoT+Few-shot。生产中推荐维护示例库(向量数据库存储),根据用户输入动态检索Top-K示例拼入Prompt。

📚 参考资料

  1. "Language Models are Few-Shot Learners" - Brown et al.
  2. "Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?" - Wei et al.
  3. "Large Language Models Are Zero-Shot Reasoners" - Kojima et al.
  4. OpenAI Documentation
  5. Hugging Face Documentation

最后更新日期:2026-02-12 适用版本:LLM应用指南 v2026