← 返回项目技术总览
① 三秒速览 ② 架构全景 ③ 最终配置 ④ 踩坑时间线 ⑤ 十一条真因 ⑥ 深入阅读

① 三秒速览

整条链路只有四个角色,每个角色一个决定性事实。

硬件

RTX 5090 32GB

Blackwell 架构 · CUDA 13.4。整卡 32,607 MB,UE 编辑器同开时占约 7.5 GB 桌面+引擎基础,留给模型的预算 ~21 GB。

模型

Bonsai-2 27B PQ2_0

三值量化底座(1.71-bit),qwen35 混合注意力:65 层里只有 16 层参与 KV cache,其余是固定大小的线性注意力——这就是能开 26 万上下文的原因。

推理栈

llama.cpp b10754

自己 CMake 编译起家,现用上游预编译 prism-b10754。KV cache 双 q4_0 量化,Flash Attention 常开,参数全部集中在 start_local_llm.bat 一处。

客户端

ZCode 直连 :11435

openai-chat-completions 原生协议 + 原生 tool_calls,不经任何 proxy(少一层就少一类故障)。空闲 180 秒显存还给 UE,再用时 7.6 秒唤醒。

② 架构全景

一条主干、一条旁路。关键决定:ZCode 不经 proxy,直连 llama-server。

ZCode 桌面端 openai-chat-completions contextWindow 190000 llama-server 127.0.0.1:11435 -c 262144 · KV q4_0 · fa on RTX 5090 32GB Ternary-Bonsai-2-27B.gguf 权重 + KV ≈ 20.5 GiB 睡眠态 ~2.8 GB openai_proxy.py :11436 · 只为 CherryStudio CherryStudio(可选) Ollama 协议 /api/chat /v1/chat/completions GGUF · ngl 999 全量 offload 空闲 180s → sleep(显存 20.6 → 2.4 GB,端口保持监听)· 再来请求 7.6s 唤醒

最终系统结构:ZCode 直连 llama-server(OpenAI 兼容协议,tool_calls 原生);proxy 只为 CherryStudio 的 Ollama 协议存在,不占显存。

为什么不走代理:ZCode 用的就是 openai-chat-completions,llama-server 原生支持,工具调用也是原生的(实测 finish_reason: tool_calls + 原生 JSON arguments + 结果回灌第二轮)。proxy 存在的唯一理由是 CherryStudio 的 Ollama provider 走 /api/chat——少一层就少一类故障。

③ 关键数字(全部实测,不是估算)

六个数字撑起整套方案的判断依据。

262,144

服务端 ctx(-c)

190,000

ZCode contextWindow
≈ 服务端 ctx 的 72%

68–74

真实负载 decode 速度 t/s
(KV4 + 无 MTP)

7.6s

休眠 → 满血唤醒
(显存 2.4 → 20.6 GB)

−4.35 GB

KV4 量化显存收益
质量 7/7 零退化

99.7%

prompt cache 命中率
(18,385 / 18,445)

④ 最终配置快速参考

两处配置 + 一条配对公式,当前生效版本(2026-10-04)。

llama-server 启动参数(由 start_local_llm.bat 统一维护,参数只有这一处):

llama-server.exe -m Ternary-Bonsai-2-27B-PQ2_0.gguf ^
  --host 127.0.0.1 --port 11435 ^
  -c 262144 ^
  -ngl 999 -np 1 ^
  --no-webui ^
  -fa on ^
  -ctk q4_0 -ctv q4_0 ^
  -b 2048 -ub 512 ^
  --no-reasoning-preserve ^
  --reasoning-budget 1000 ^
  --mmproj Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf ^
  --sleep-idle-seconds 180 ^
  --chat-template-file D:\_Qwen3.8-27b\_zcode_setup\qwen35_chat_template.jinja ^
  -a "local,qwen3.8:27b,qwen3.8:27b-nvfp4,qwen3.8:27b-offload" ^
  --metrics --log-file D:\_Qwen3.8-27b\_zcode_setup\llama_server.log

ZCode provider 配置(.zcode\v2\provider_config.json,能力声明部分):

{
  "api":     { "type": "openai-chat-completions",
               "baseUrl": "http://127.0.0.1:11435/v1" },
  "model":   { "properties": {
    "contextWindow": 190000,
    "supportsToolCall": true,
    "supportsMidConversationSystem": false,
    "inputFormat":  { "supportsText": true, "supportsImage": true },
    "outputFormat": { "supportsText": true }
  }}
}
配对规则:contextWindow × 1.26(最坏低估系数)+ 2,563(压缩指令) ≤ 服务端 -c
→ 190,000 × 1.26 + 2,563 ≈ 241,563 ≤ 262,144 ✓  改一边必须改另一边。

⑤ 踩坑时间线(23 天)

从编译到 1.71-bit 换底座:每个节点都是一次真实事故或一次实测定案,详情见各子页面。

09-12

VS2026 + CUDA 13.4 编译 llama.cpp

09-13

NVFP4 模型下载完,llama-server 首启,66 t/s

09-15

CherryStudio 踩坑链:ctx 爆了、双进程抢显存

09-16

ctx 65536 + cont-batching 稳定;prefill 快 70%

09-17

ZCode 直连 :11435;假 ctx / 256 夹子 / 双实例全修

09-20

LF 行尾事故:22 个脚本静默失效,全量转 CRLF

09-22

换模型 Ternary Bonsai 2(三值量化)直切 :11435

09-26

--reasoning-budget 1000:思考 −76%,正文 0 → 4,820 字

09-29

mmproj 视觉启用:真实截图逐字读出

10-02

27 t/s 之谜 = UE 视口抢 GPU(非模型退化)

10-04

KV4 采纳(−4.35 GB);MTP 实测负收益撤下

⑥ 十一条真因速览

排查结论一句话版——十一条里没有一条是"模型不行",全是"喂给它的东西 / 启动它的方式"不对。逐条展开见排障页。

#症状真因修法
1只有一句话就没下文proxy 注入 max_tokens=256删掉注入
2反复无效响应contextWindow: 1000000 是假数据改成真实值
3压缩失败 12 分钟38 万 token 云端老会话切过来用本地模型就开新会话
4重新连接 9/10reasoning_effort: high 模板拒绝补丁模板 / LLM_THINK=0
5开机后连不上开机脚本 -c 16384开机走统一启动脚本
6新会话也压缩失败contextWindow 余量只剩 1,100 token降到 49152 起步
7压缩 3 次后被放弃窗口太小 + 工具输出大(抓整页网页)开大窗口
8context_exceeded 400ZCode 估算低估 26%,冲过服务端上限服务端 ctx 做绝对缓冲
9每天首次开机连不上.bat 是 LF 行尾,cmd.exe 执行不了统一转 CRLF
10带截图的消息重连模型无视觉却声明 supportsImage: true改 false(后启用 mmproj 再改 true)
11图片去掉仍重连模板拒绝对话中间的 system 消息模板改为渲染成 system 回合

⑥→ 深入阅读(四个子页面)

按问题域拆分:栈怎么搭、客户端怎么接、坏了怎么修、快不快为什么。

LLAMA-SERVER 栈

模型与推理服务

硬件基线 · 量化选型 · 编译与启动参数逐项解释 · 显存标定公式 · ctx 调优历史(8192 → 262144)· 休眠机制

ZCODE 接入

客户端配置与开机链路

provider 配置 · 两个数字配对 · 压缩线 65% 的算术 · 修改清单 · 开机自启双路径 · 6 个 UE 子智能体

排障手册

速查表与十三个真因

"又不响应了"先跑什么 · 症状→根因→修法→验证 · 压缩失败三种形态 · 每条都可展开

性能与调优

实测数据与优化全程

速度-上下文曲线 · UE 抢 GPU 归因 · token 估算偏差 · reasoning-budget · KV4 与 MTP 的完整复盘

能力边界(先记住再上手):

  1. 啃大网页 / 大文档 → 用云端模型。实测总结一篇公众号文章(3.5 MB 页面),43 分钟任务里压缩 8 次占 17.6 分钟——是任务体量与窗口不匹配,不是配置问题。
  2. 看到"已自动压缩"就准备新开会话——压缩摘要在历史里累积(每压一次永久多 2~3.5K token),是唯一清不掉的固定成本。
  3. 旧云端会话不要切成本地模型——历史动辄几十万 token,必然触发压缩死锁。