Skip to content

采样器链 (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() — 通知采样器已接受的 token
  • reset() — 重置状态

常见采样器:Temperature → Top-K → Top-P → Min-P → Typical → Mirostat → Grammar → 重复惩罚

在源码中的实现

  • src/llama-sampler.cpp — 所有采样器的实现
  • include/llama.h — 采样器 API 声明
  • common/sampling.cpp — 高级采样配置封装

相关概念