本页面介绍了 llama.cpp 除了基本文本生成之外的高级功能,包括安全性考量、多模态支持、生成约束以及复杂的服务器功能。有关模型加载和推理的基础知识,请参阅 入门指南。
在生产环境中部署 llama.cpp 时,必须考虑几个安全方面,以防范恶意输入、不可信模型以及多租户风险。
不可信模型
输入过滤
多租户部署
服务器安全
来源
Llama.cpp 支持多模态模型,可以同时处理文本和视觉输入,从而实现视觉问答和图像理解等应用。
llama-server 通过与 OpenAI 兼容的 API 提供多模态支持,自动处理图像处理和嵌入生成。
服务器通过 OpenAI API 接受多种格式的图像
图片 URL 格式
音频输入格式
系统会自动
mtmd_default_marker)来源
语法约束生成通过对模型输出强制执行正式语法规则,能够通过服务器 API 实现 JSON、代码或特定领域格式的结构化生成。
服务器提供从 JSON schema 到语法约束的自动转换,简化了结构化输出生成。
系统支持通过触发机制进行条件语法应用,允许语法约束仅在特定模式出现时激活。
直接语法
JSON 模式
语法触发器
语法系统集成到采样链中
json_schema_to_grammar 将 JSON schema 转换为 BNF 语法server_grammar_trigger 监视输出以激活模式preserved_tokens 确保关键 token 不被过滤掉来源
Llama.cpp 提供了多种采样方法来控制文本生成,这些方法可以组合成采样链,从而对输出进行细粒度定制。
| 采样器 | 描述 | 参数 | 用途 |
|---|---|---|---|
| 温度 | 控制随机性。 | temp | 值越高,随机性越大 |
| Top-K | 仅保留前 K 个 token | top_k | llama_sampler_init_top_k(params.top_k) |
| Top-P | 保留概率累积到 P 的前 K 个 token | top_p | llama_sampler_init_top_p(params.top_p, min_keep) |
| Min-P | 保留概率大于等于 min_p * prob_max 的 token | min_p | llama_sampler_init_min_p(params.min_p, min_keep) |
| Typical | 保留具有典型概率的 token | typical_p | llama_sampler_init_typical(params.typ_p, min_keep) |
| XTC | 增强创造性采样的控制 | xtc_probability, xtc_threshold | llama_sampler_init_xtc(...) |
| Dry | 动态重复预防 | dry_multiplier, dry_base | llama_sampler_init_dry(...) |
| 惩罚 | 重复惩罚 | penalty_repeat, penalty_freq, penalty_present | llama_sampler_init_penalties(...) |
| Mirostat | 保持恒定的困惑度 | mirostat_tau, mirostat_eta | llama_sampler_init_mirostat(...) |
采样链通过 common_sampler 和 llama_sampler_chain 结构实现
示例初始化
common_sampler* smpl = common_sampler_init(model, params.sampling);
llama_sampler_chain_add(smpl->chain, llama_sampler_init_top_k(params.top_k));
llama_sampler_chain_add(smpl->chain, llama_sampler_init_top_p(params.top_p, params.min_keep));
llama_sampler_chain_add(smpl->chain, llama_sampler_init_temp(params.temp));
来源
批量处理允许 llama.cpp 一次性高效处理多个输入,显著提高了吞吐量和硬件利用率。
Llama.cpp 支持多种批处理方法
批量基准测试工具通过不同的配置帮助优化性能
| 参数 | 目的 | 影响 |
|---|---|---|
n_batch | 主批量大小 | 控制一次处理的 token 数量 |
n_ubatch | 微批量大小 | 对于 GPU 处理,较小的任务块 |
PP | Prompt 处理 token 数 | 从 prompt 中处理的初始 token 数 |
TG | Token 生成计数 | 要生成的 token 数量 |
PL | 并行序列计数 | 并行运行的序列数量 |
is_pp_shared | Prompt 处理共享 | 序列是否共享 prompt 上下文 |
来源
并行处理允许同时运行多个推理,模拟多个客户端或同时生成多个文本流。
并行处理依赖于
seq_id)并行示例模拟了多个客户端向服务器发送请求,每个客户端都有自己的序列和 prompt。
来源
文本填充能够生成内容来填补现有文本中的空白,而不仅仅是附加在 prompt 末尾。
填充过程工作方式是
系统使用特殊词汇 token 来定义区域
llama_vocab_fim_pre:标记前缀内容的开始llama_vocab_fim_suf:标记后缀内容的开始llama_vocab_fim_mid:可选标记,用于生成中间内容命令行示例
来源