llama.cpp 里已处理文本缓存本质是 KV Cache:模型前置prompt、系统提示、长对话前缀计算后的Key/Value张量,缓存后重复请求无需重新全量预填充(prefill),速度提升数倍。分4种缓存方案,同时配套你之前写的Windows环境变量编辑器可一键配置。
一、4种缓存机制区分(按需选用)
1. 内存前缀自动复用缓存(默认开启,最常用)
作用:同模型多请求共享相同前缀(固定System提示词、通用模板),自动匹配复用KV,重启程序丢失缓存。
关键参数/环境变量(可在你的环境编辑器直接设置)
| 环境变量 | 对应启动参数 | 说明 |
|---|---|---|
LLAMA_ARG_CACHE_RAM |
--cache-ram N |
内存缓存最大容量 MiB,默认8192;0关闭,-1无上限 |
LLAMA_ARG_CACHE_REUSE |
--cache-reuse N |
可复用缓存块最小token长度,建议512/1024,开启前缀复用 |
LLAMA_ARG_KV_UNIFIED |
--kv-unified |
统一KV缓冲区,多会话共享缓存,默认开启 |
LLAMA_ARG_CACHE_IDLE_SLOTS |
--cache-idle-slots |
保留空闲会话缓存不立即释放 |
示例启动命令(main/llama-server通用)
# Windows cmd/PowerShell
set LLAMA_ARG_CACHE_RAM=16384
set LLAMA_ARG_CACHE_REUSE=512
llama-server -m qwen3-8b.gguf -c 8192 -ngl 35
2. 持久化Prompt缓存(单会话固定前缀,保存到磁盘文件)
作用:把固定系统提示词、超长前置文档一次性计算,保存.bin缓存文件,下次启动直接加载,跳过prefill。
参数
- 启动参数:
--prompt-cache cache_sys.bin - 无独立环境变量,只能命令行传入
流程
- 第一次运行带完整系统prompt,生成缓存文件
llama-cli -m model.gguf -c 8192 --prompt-cache sys_cache.bin -f system_prompt.txt
- 后续直接加载缓存,无需重复处理系统提示
llama-cli -m model.gguf -c 8192 --prompt-cache sys_cache.bin
3. Server多会话Slot持久化缓存(长对话断点续聊)
作用:llama-server HTTP服务每个对话独立slot,手动保存/加载单条对话完整KV缓存,重启服务仍可恢复聊天上下文。
核心参数/环境变量
| 环境变量 | 参数 | 功能 |
|---|---|---|
LLAMA_ARG_SLOT_SAVE_PATH |
--slot-save-path ./kv_slots |
指定缓存存放目录,启用slot读写API |
使用方式
- 启动服务开启slot持久化
$env:LLAMA_ARG_SLOT_SAVE_PATH="D:\llama_cache\slots"
llama-server -m model.gguf -c 16384 -ngl 40 --port 8080
- HTTP API 保存/恢复对话缓存
# 保存slot 1到文件chat1.bin
POST http://127.0.0.1:8080/slots/1?action=save
Content-Type: application/json
{"filename":"chat1.bin"}
# 重启服务后恢复对话
POST http://127.0.0.1:8080/slots/restore
{"slot_id":1,"filename":"chat1.bin"}
4. SSD磁盘KV Offload缓存(低显存/内存超长上下文)
作用:KV缓存放不下内存时,溢出到SSD磁盘,支持百万token超长上下文,需要编译时开启LLAMA_SSD=1。
环境变量/参数
LLAMA_SSD=1 # 编译时开启
LLAMA_ARG_SSD_CACHE=1
LLAMA_ARG_SSD_CACHE_PATH=D:\llama_cache\ssd_kv
启动示例:
$env:LLAMA_ARG_SSD_CACHE=1
$env:LLAMA_ARG_SSD_CACHE_PATH="D:\llama_cache\ssd_kv"
llama-server -m model.gguf -c 131072
二、KV缓存压缩(降低缓存内存占用,可配合所有缓存)
修改KV存储精度,大幅减少缓存体积,环境变量直接配置:
| 环境变量 | 参数 | 可选值 | 效果 |
|---|---|---|---|
LLAMA_ARG_CACHE_TYPE_K |
--cache-type-k |
f16/q8_0/q4_0 | K向量量化压缩 |
LLAMA_ARG_CACHE_TYPE_V |
--cache-type-v |
f16/q8_0/q4_0 | V向量量化压缩 |
推荐配置(平衡速度/显存):
LLAMA_ARG_CACHE_TYPE_K=q8_0
LLAMA_ARG_CACHE_TYPE_V=q8_0
三、完整推荐生产缓存配置(环境变量一键设置)
通用桌面GPU(8G显存,多请求共享System提示)
# 基础推理
LLAMA_NUM_THREADS=12
LLAMA_ARG_CTX_SIZE=8192
LLAMA_ARG_N_GPU_LAYERS=35
# 缓存核心配置
LLAMA_ARG_CACHE_RAM=16384
LLAMA_ARG_CACHE_REUSE=512
LLAMA_ARG_KV_UNIFIED=1
LLAMA_ARG_CACHE_IDLE_SLOTS=1
# KV量化省显存
LLAMA_ARG_CACHE_TYPE_K=q8_0
LLAMA_ARG_CACHE_TYPE_V=q8_0
# 对话持久化保存目录
LLAMA_ARG_SLOT_SAVE_PATH=D:\AI\llama_kv_slots
低内存CPU机器(无独立显卡,SSD溢出缓存)
LLAMA_ARG_CTX_SIZE=32768
LLAMA_ARG_SSD_CACHE=1
LLAMA_ARG_SSD_CACHE_PATH=D:\AI\llama_ssd_cache
LLAMA_ARG_CACHE_RAM=4096
LLAMA_ARG_CACHE_TYPE_K=q4_0
LLAMA_ARG_CACHE_TYPE_V=q4_0
四、常见问题
- 缓存不生效,每次都完整prefill
- 检查
LLAMA_ARG_CACHE_REUSE大于0,必须开启统一KV缓冲区--kv-unified - 前缀token长度必须≥
cache-reuse设定值才会复用
- 检查
- slot保存API找不到
- 必须配置
LLAMA_ARG_SLOT_SAVE_PATH目录,服务启动才加载slot接口
- 必须配置
- SSD缓存报错
- 源码编译时加
LLAMA_SSD=1,预编译二进制大多未开启SSD缓存
- 源码编译时加
- 内存占用持续上涨
- 调低
LLAMA_ARG_CACHE_RAM限制最大缓存,或开启cache-idle-slots自动清理闲置slot
- 调低
五、缓存生效验证
启动llama-server/llama-cli时,控制台输出prompt cache is enabled即代表自动前缀缓存正常工作;
复用缓存时prefill耗时会从几秒降到几十毫秒,日志可见cache hit命中标记。