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 → 重复惩罚
在源码中的实现
src/llama-sampler.cpp— 所有采样器的实现include/llama.h— 采样器 API 声明common/sampling.cpp— 高级采样配置封装
相关概念
- ggml — logits 是 GGML 张量
- quantization — 量化影响 logits 精度
- tokenization — 采样的 token 通过词表映射回文本