这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 用户感知延迟由排队、检索、工具、模型首字和输出长度共同决定。优化要区分首字延迟、尾延迟和总完成时间,并用 trace 定位瓶颈。
26.1 延迟构成
总延迟
= 网络
+ 队列等待
+ 查询理解
+ embedding
+ 检索
+ rerank
+ 模型首 token
+ 输出生成
+ 安全校验
指标:
| 指标 | 说明 |
|---|---|
| TTFT | 首 token 时间 |
| total latency | 总耗时 |
| p95 / p99 | 长尾 |
| queue time | 排队 |
| retrieval latency | 检索 |
| tool latency | 工具 |
| output tokens | 影响生成时间 |
26.2 并行化
import asyncio
async def run_pipeline(query):
embedding_task = asyncio.create_task(embed(query))
keyword_task = asyncio.create_task(keyword_search(query))
dense, keyword = await asyncio.gather(embedding_task, keyword_task)
return merge(dense, keyword)
可并行:
- 向量与关键词检索;
- 多个子查询;
- 多个只读工具;
- 用户资料与历史读取;
- 安全预检;
- 日志异步写入。
不能随意并行:
- 有写副作用的工具;
- 依赖前一步结果的调用;
- 外部系统不支持并发;
- 需要审批的动作。
26.3 检索优化
| 问题 | 优化 |
|---|---|
| 候选过多 | 减少 recall K |
| 过滤太慢 | 建标量索引 |
| 查询改写慢 | 只在多轮时启用 |
| rerank 慢 | 减少候选、换轻量模型 |
| 多子查询慢 | 限制数量和并行 |
| 索引冷 | 预热 |
| 结果重复 | 去重前置 |
26.4 模型优化
- 选择合适模型;
- 缩短输入;
- 限制输出;
- 使用流式响应;
- 使用提示缓存或上下文缓存;
- 保持稳定连接;
- 就近部署;
- 避免无意义重试;
- 低峰批量处理离线任务。
输出 token 常是总延迟的主要部分,能用表格和要点就不要长篇叙述。
26.5 队列与并发
请求
-> gateway rate limit
-> priority queue
|-- interactive worker
+-- batch worker
策略:
- 在线请求优先;
- 文档索引任务隔离;
- 用户级并发限制;
- 租户级配额;
- 熔断降级;
- 队列长度告警;
- 弹性扩容。
26.6 预计算
可提前处理:
- 文档解析;
- 切块;
- embedding;
- 常见问题答案;
- 用户静态档案摘要;
- 报表固定部分;
- 工具结果快照。
不能预计算:
- 实时库存;
- 当前订单状态;
- 权限即将变化的个人数据;
- 依赖本次上传文件的内容。
26.7 超时预算
{
"total_ms": 12000,
"query_rewrite_ms": 800,
"retrieval_ms": 500,
"rerank_ms": 800,
"llm_first_token_ms": 3000,
"llm_total_ms": 9000
}
每个阶段设置超时并保留降级结果:
- rerank 超时用召回排序;
- 摘要超时用最近窗口;
- 模型超时用备用模型或模板;
- 工具超时说明稍后再试;
- 不能牺牲权限校验。
26.8 长尾排查
| 现象 | 常见原因 |
|---|---|
| p99 高但 p50 正常 | 队列、限流、重试 |
| 首字慢 | 输入过长、模型负载 |
| 总耗时高 | 输出长 |
| 检索慢 | 过滤无索引 |
| 某租户慢 | 数据量异常 |
| 间歇超时 | 连接池耗尽 |
| 凌晨慢 | 索引任务抢占 |
26.9 SLO 设计
示例:
| 场景 | 指标 |
|---|---|
| 实时客服 | TTFT p95 < 3s |
| 知识问答 | total p95 < 12s |
| 文档摘要 | 异步 5 分钟内 |
| Agent 任务 | 30 分钟内完成 |
| 流式输出 | 间隔 < 10s |
SLO 要与错误率、质量指标和成本一起看,不能只压延迟。
本章小结
延迟优化先拆 trace,再针对输入长度、输出长度、检索、rerank、模型和排队处理。流式响应改善感知,并行化缩短等待,预计算减少重复工作。所有优化都要观察 p95/p99 和质量指标。
思考题
- TTFT 和 total latency 哪个更能代表体验?
- 哪些步骤适合并行?
- 为什么输出 token 对延迟影响大?
- 如何避免离线索引任务影响在线服务?
- 超时降级时哪些校验不能省略?