Appearance
采样器链 (Sampler Chain) 是 llama.cpp 的可组合采样管道,将多个采样器串联处理 logits 输出最终 token。
为什么需要 sampler-chain
LLM 生成的原始 logits 需要经过多步处理才能得到高质量的 token 选择。采样器链允许灵活组合不同的采样策略(温度、top-k、top-p、grammar 等),并支持动态调整。
核心原理
c
// 创建采样器链
struct llama_sampler * chain = llama_sampler_chain_init(params);
// 按顺序添加采样器(顺序影响结果)
llama_sampler_chain_add(chain, llama_sampler_init_temp(0.8));
llama_sampler_chain_add(chain, llama_sampler_init_top_k(40));
llama_sampler_chain_add(chain, llama_sampler_init_top_p(0.95, 1));
llama_sampler_chain_add(chain, llama_sampler_init_dist(seed));
// 采样
llama_token token = llama_sampler_sample(chain, ctx, -1);每个采样器实现统一接口:
name()— 采样器名称apply()— 处理 logits 或直接采样accept()— 通知采样器已接受的 tokenreset()— 重置状态
常见采样器:Temperature → Top-K → Top-P → Min-P → Typical → Mirostat → Grammar → 重复惩罚
近期调整:
- top-n-sigma 精简 — 移除该采样器内部多余的 softmax + sort(对其而言是冗余步骤)
- 后端采样 — MTP / EAGLE3 推测解码时 Top-K 可在设备端执行,避免全量 logits 回传 CPU
- 推测解码家族扩展 — 新增 DFlash(块扩散,
--spec-type draft-dflash,一次前向产出整块 draft),与 MTP / EAGLE3 / ngram 并列 - 多输出后端采样(
dd1ea5243) — 采样器链可逐序列挂到 context(llama_set_sampler),在解码图内于 GPU 执行,一次 decode 每序列产出多个 token(n_outputs_max_per_seq),经llama_get_sampled_token_ith()按行读取;状态在 accept 时推进,被拒推测不消耗 RNG - suppress_tokens 并入 logit-bias —
llama_vocab_get_suppress_tokens()暴露模型级屏蔽 token,采样器初始化时并入 logit-bias
在源码中的实现
src/llama-sampler.cpp— 所有采样器的实现include/llama.h— 采样器 API 声明common/sampling.cpp— 高级采样配置封装
相关概念
- ggml — logits 是 GGML 张量
- quantization — 量化影响 logits 精度
- tokenization — 采样的 token 通过词表映射回文本