⭐ 这是栖木 Perch 的开源组件之一。 核心应用(macOS 本地优先 AI 工作台 · 0.08s 首字)在这里 → 🪵 栖木 Perch
⚡ perch-ultrafast
LLM 首字延迟 1 秒 → 80 毫秒。不换模型,不掉质量。
你写了个漂亮的 AI 应用,用户点发送,然后…… 盯着空屏幕等 1 秒。
抱歉,你的模型没错。是你的架构错了。
perch-ultrafast 是一个 600 行的 Rust 框架,解决这一个问题:
两条流同时开——本机小模型先出草稿(用户立刻有字读), 云端大模型第一个字一到,立刻接棒替换(质量升级)。
用户看到的首字 = 本机延迟(80ms) 最终答案的质量 = 云端质量
两头都占,一个子儿都不多花。
从 栖木 Perch 生产环境提取 · MIT · cargo test 全绿
📊 这不是理论,是实测
真实运行 cargo run --example hybrid_demo 的输出:
⏱ 开始(0ms)
[82ms] 首字可见 → 我是一个本机小模型,这是我的草稿答案。
[902ms] ⚡ 云端模型已接棒(清空草稿)
这是云端大模型的正式答案,质量更高、信息更全。
[1130ms] ✅ 完成
首字延迟: 82ms(纯云端需要 900ms)—— 快 11 倍
| 场景 | 首字延迟 | 用户感受 |
|---|---|---|
| 纯云端 | 0.88 ~ 1.39s | 😐 盯着空屏幕 |
| 纯本机 | 0.04 ~ 0.18s | 😀 快,但质量有限 |
| 本框架 | < 0.2s 首字 + 云端质量 | 🤩 立刻有字,随后升级 |
🚀 三行接入
use perch_ultrafast::{hybrid::{run_hybrid, HybridConfig}, types::*};
run_hybrid(
local_provider, // 你的本机小模型(预热过)
cloud_provider, // 你的云端大模型
fast_request, // 本机用:关思考 + 小 max_tokens
slow_request, // 云端用:原样
cancel_token,
HybridConfig::default(),
|chunk| match chunk {
StreamChunk::Delta { text } => print!("{text}"),
StreamChunk::Replaced { .. } => println!("\n[云端接棒]"),
_ => {}
},
).await;
只需实现一个 trait 就能接入任何后端:
pub trait Provider: Send + Sync {
fn chat_stream(&self, request: ChatRequest, cancel: CancellationToken)
-> BoxFuture<Result<ProviderStream, String>>;
}
Ollama / OpenAI 兼容 / 自建推理服务 —— 各几十行适配。
🧠 附带:Ultrafast 推理框架(三条加速法则)
混合流解决首字,Ultrafast 解决整体。
法则 1 · 关思考
推理模型的 thinking 链会拉高首 token 延迟。加速模式下发时强制 think: Off。
只改本次请求,不动用户存档。
法则 2 · 连接池复用
reqwest::Client 做成进程级单例。省掉每条请求的 TCP + TLS 握手。
再开 gzip/brotli —— 下行字节更少,正文更早到。
法则 3 · 回复预算
兜底 max_tokens(默认 2048),不让模型啰嗦。
用户显式设定优先,绝不覆盖。
法则 4 · 模型锁 🔒
加速开关无权更换模型。
速度不能靠"偷偷换成更快的模型"——那会改变答案质量,是欺骗。 用户选了 MiMo 就只用 MiMo。
🛡️ 四条设计红线(都有测试钉死)
| 红线 | 原因 |
|---|---|
| 加速不换模型 | 偷偷换模型 = 欺骗用户 |
| 只改下发值 | 不动持久化档位,关掉即恢复 |
| 云端失败保留草稿 | 不把用户答案变成错误页 |
| 本机失败静默降级 | 行为等同没用混合流,不打扰用户 |
🧩 生产环境的降级矩阵
| 情况 | 行为 |
|---|---|
| 本机预热完成 | 草稿 0.08s 出字,云端 ~0.9s 接棒 |
| 本机冷启动 | 超时 50ms → 纯云端(用户无感) |
| 本机不可用 | 门控跳过 → 纯云端 |
| 云端建流失败 | 本机草稿继续跑完(不丢答案) |
| 云端中途出错 | 保留草稿按完成收尾 |
| 用户取消 | 两条流同时取消 |
🏗️ 架构(就这么点)
src/
├── types.rs Provider trait / StreamChunk / ChatRequest
├── hybrid.rs 混合流 mux(本机草稿 → 云端接棒 + 双向降级)
├── ultrafast.rs 加速规则(关思考 / 预算 / 简洁提示 / 模型锁)
└── pool.rs 连接池单例
examples/
└── hybrid_demo.rs 可运行 demo(真实时序)
600 行 Rust,零业务耦合,直接嵌进你的项目。
🔬 验证
cargo test # 5 个单元测试 + 1 个文档测试
cargo run --example hybrid_demo # 看真实时序
🔗 相关项目
| 项目 | 说明 | 链接 |
|---|---|---|
| 栖木 Perch(应用) | macOS 本地优先 AI 工作台:0.08s 首字、真智能体、隐私优先 | https://huggingface.co/datasets/hongcoding/perch |
| perch-ultrafast(开源框架) | 就是你正在看的这个 | https://huggingface.co/hongcoding/perch-ultrafast |
| HF Collection | 上面两个项目归在一起 | https://huggingface.co/collections/hongcoding/perch-ai-workbench-and-ultrafast-framework |
📖 来源
栖木 Perch v5.2.1 的 commands.rs + providers/cloud.rs 中混合流/加速逻辑的独立提取版,
去掉了 Tauri/数据库/UI 业务耦合,保留可复用的核心。
📜 许可
MIT —— 随便用,注明出处即可。
⚡ 别让用户等云端。让本机先开口。