0Pricing
AI Prompt Engineering · 课时

零样本、单样本与少样本

选择示例的数量。

零样本、单样本与少样本 是 CoddyKit 上的免费 AI Prompt Engineering 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Prompt Engineering 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Prompt Engineering 课程共包含 4 节课。

示例数量的光谱

示例表示在当前查询之前放入提示词中的已标注演示数量。零样本完全依赖模型预训练得到的先验知识;少样本会在推理时让模型适应一个小型的特定任务分布,而不更新任何权重。

这就是上下文学习(ICL):变换器模型会将这些示例视为序列的一部分,并在其中隐式执行某种通过元学习得到的回归。k 的选择(示例数量)是需要通过经验调优的超参数,而不是固定不变的最佳实践。

from dataclasses import dataclass

@dataclass
class ICLConfig:
    k: int           # number of demonstrations
    selection: str   # 'static' | 'dynamic'
    order: str       # 'random' | 'similarity' | 'curriculum'

# Zero-shot is simply k=0
cfg = ICLConfig(k=0, selection='static', order='random')

零样本方法何时胜出

当任务已在预训练中得到充分表征(摘要、翻译、常见分类),且示例可能使输出格式产生偏差时,优先使用 零样本。对于经过指令调优的模型,简明指令加上输出模式,往往胜过会微妙锚定风格的示例。

零样本还可将令牌成本和延迟降至最低,并避免多数标签偏差:模型会过度预测示例中占主导地位的类别。

# Zero-shot with explicit schema beats vague few-shot
PROMPT = (
    'Classify sentiment as POSITIVE, NEGATIVE, or NEUTRAL.\n'
    'Respond with only the label.\n\n'
    'Text: ' + user_text + '\nLabel:'
)

单样本作为格式锚点

当任务在概念上很清晰,但输出格式不常见或要求严格时,单样本方法最为有效。单个示例对确切结构(JSON 键、分隔符、大小写)的说明,远比文字描述可靠。

当您希望约束结构,同时又不想消耗太多令牌或冒多示例引入标签分布偏斜的风险时,请使用单样本方法。

ONE_SHOT = (
    'Extract entities as JSON.\n\n'
    'Input: Apple released the iPhone in Cupertino.\n'
    'Output: {"org": ["Apple"], "product": ["iPhone"], "loc": ["Cupertino"]}\n\n'
    'Input: ' + query + '\nOutput:'
)

少样本与 k 曲线

性能相对于 k 的变化很少是单调的。随着示例挤占上下文、分散注意力,并使当前查询距离模型的近因关注点越来越远,性能通常会先上升、达到平台期,然后下降。

请在留出集上对 k 进行实际遍历,取值为 {1, 2, 4, 8, 16}。最优 k 取决于任务复杂度、示例长度以及模型的有效上下文利用率,而后者通常远低于其标称窗口。

def sweep_k(eval_set, candidates, ks=(1,2,4,8,16)):
    results = {}
    for k in ks:
        acc = evaluate(build_prompt(candidates[:k]), eval_set)
        results[k] = acc
    return max(results, key=results.get)

ICL 为何有效:隐式推断

研究将 ICL 描述为模型执行隐式贝叶斯推断:示例帮助模型定位其在预训练期间已经学到的潜在任务概念。示例充当证据,缩小任务后验分布的范围,而不是提供新知识。

这解释了一个反直觉的发现:即使示例中的错误标签,也可能保留大部分准确率,因为主导信号是格式和标签空间,而不是输入与标签之间的映射本身。

# Min, Lyu et al. (2022): label correctness matters less than
#   - the input distribution
#   - the label space (which classes exist)
#   - the format / structure
# Implication: invest in representative inputs + valid label set

令牌预算与成本权衡

每个样本都会消耗上下文容量和资金。示例很长时,四个示例占用的空间可能远超查询。请计算每个准确率百分点的成本:如果 k=8 相比 k=4 只提升 0.5%,令牌数量却翻倍,那么在生产环境中 k=4 更优。

对于高吞吐量流程,请优先缓存静态示例块,这样重复的示例只需计费和处理一次。

def cost_efficiency(acc_by_k, tokens_by_k, price_per_1k):
    return {
        k: acc_by_k[k] / (tokens_by_k[k] / 1000 * price_per_1k)
        for k in acc_by_k
    }
# Pick the k maximizing accuracy per dollar, not raw accuracy

多数标签偏差与位置偏差

少样本提示带有隐藏偏差。多数标签偏差会使模型偏向示例中出现频率最高的类别。近因偏差会使模型过度重视最后一个示例。常见令牌偏差则偏好经常出现的令牌。

诸如上下文校准这样的校准技术,会估计模型在无内容输入(例如令牌 N/A)上的先验,并将其除去,从而显著稳定少样本分类器。

# Contextual calibration (Zhao et al. 2021)
p_cf = model_probs(prompt_with_input('N/A'))  # content-free prior
W = 1.0 / p_cf                                  # diagonal correction
def calibrated(probs):
    return normalize(W * probs)

平衡示例集

为抵消多数标签偏差,请在示例中平衡各个类别,并改变示例顺序。对于 k=4 的二元分类,请使用 2 个正类和 2 个负类并随机打乱,而不是采用 3:1 的比例。

对于生成任务,请沿着重要维度(长度、语气、难度)进行平衡,避免模型收缩到它最常见的单一模式。

import random

def balanced_demos(pool, k, label_fn):
    by_label = {}
    for ex in pool:
        by_label.setdefault(label_fn(ex), []).append(ex)
    per = k // len(by_label)
    picks = [e for lst in by_label.values() for e in random.sample(lst, per)]
    random.shuffle(picks)
    return picks

少样本与微调

当任务经常变化、数据稀缺,或您无法托管调优后的模型时,少样本方法是合适的工具。当您拥有数千个示例、需要最低的单次调用延迟,或希望将格式固化以缩短提示时,微调更胜一筹。

一种常见的生产流程是:先用少样本方法进行原型验证,收集成功的轨迹,再将其蒸馏到微调模型中,从而完全去掉示例令牌。

# Decision heuristic
if num_labeled < 500 or task_volatility == 'high':
    strategy = 'few-shot ICL'
elif latency_budget_ms < 200 or prompt_token_cost_dominant:
    strategy = 'fine-tune + zero-shot'
else:
    strategy = 'few-shot now, distill later'

推理任务需要的不只是样本

对于多步推理,直接使用少样本答案对可能会造成伤害:模型会学会直接跳到无法论证的答案。请将少样本方法与展示推理轨迹、而不只是最终标签的思维链示例结合起来。

样本数量会与推理深度相互作用;在算术和逻辑基准测试中,通常 k=2 个高质量思维链示例胜过 k=8 个仅包含答案的示例。

COT_SHOT = (
    'Q: A shop had 23 apples, used 20, bought 6 more. How many now?\n'
    'A: Start 23, minus 20 leaves 3, plus 6 is 9. Answer: 9\n\n'
    'Q: ' + question + '\nA:'
)

用于 k 的评估 harness

请将样本选择视为由 harness 支持的实证搜索。留出一个验证集,使用多个随机种子控制示例顺序,并报告均值和方差,因为少样本准确率可能仅因顺序不同就波动几个百分点。

记录每个 k 的令牌数量和延迟,使最终选择优化完整目标,而不仅仅是准确率。

def harness(pool, val, ks, seeds=5):
    report = {}
    for k in ks:
        accs = []
        for s in range(seeds):
            demos = balanced_demos(pool, k, label_fn)
            accs.append(evaluate(build_prompt(demos), val))
        report[k] = (mean(accs), stdev(accs))
    return report

快速检查

测试您对样本数量选择和 ICL 偏差的理解。

回顾

关键要点:

  • k 是可调超参数;请遍历它,并观察上升—平台—下降曲线。
  • 零样本适合广为人知的任务;单样本可锚定严格格式;少样本方法则依据任务分布对模型进行条件化。
  • ICL 通过定位预训练任务而发挥作用,因此格式和标签空间比标签正确性更重要。
  • 通过平衡、随机打乱和上下文校准,抵消多数标签偏差、近因偏差和常见令牌偏差。
  • 优化每美元的准确率,将推理任务与思维链示例结合,并将稳定的少样本提示蒸馏为微调模型。

常见问题解答

「零样本、单样本与少样本」课时是免费的吗?

是的 — 「零样本、单样本与少样本」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Prompt Engineering 课程的其余内容,请升级到 CoddyKit PRO。 AI Prompt Engineering 课程共包含 4 节课。

「零样本、单样本与少样本」这节课中我会学到什么?

选择示例的数量。 你通过在浏览器中直接运行的动手代码来练习 AI Prompt Engineering,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AI Prompt Engineering 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AI Prompt Engineering 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「零样本、单样本与少样本」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AI Prompt Engineering 课中编写并运行代码吗?

能。每节 AI Prompt Engineering 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 零样本、单样本与少样本
  2. 设计有效示例
  3. 示例顺序与时效性
  4. 动态少样本选择
← 返回 AI Prompt Engineering