LLMNotes

第 26 章:延迟优化

zjc 于 2026-01-26 发布

这是《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)

可并行:

  1. 向量与关键词检索;
  2. 多个子查询;
  3. 多个只读工具;
  4. 用户资料与历史读取;
  5. 安全预检;
  6. 日志异步写入。

不能随意并行:

  1. 有写副作用的工具;
  2. 依赖前一步结果的调用;
  3. 外部系统不支持并发;
  4. 需要审批的动作。

26.3 检索优化

问题 优化
候选过多 减少 recall K
过滤太慢 建标量索引
查询改写慢 只在多轮时启用
rerank 慢 减少候选、换轻量模型
多子查询慢 限制数量和并行
索引冷 预热
结果重复 去重前置

26.4 模型优化

  1. 选择合适模型;
  2. 缩短输入;
  3. 限制输出;
  4. 使用流式响应;
  5. 使用提示缓存或上下文缓存;
  6. 保持稳定连接;
  7. 就近部署;
  8. 避免无意义重试;
  9. 低峰批量处理离线任务。

输出 token 常是总延迟的主要部分,能用表格和要点就不要长篇叙述。

26.5 队列与并发

请求
  -> gateway rate limit
     -> priority queue
        |-- interactive worker
        +-- batch worker

策略:

  1. 在线请求优先;
  2. 文档索引任务隔离;
  3. 用户级并发限制;
  4. 租户级配额;
  5. 熔断降级;
  6. 队列长度告警;
  7. 弹性扩容。

26.6 预计算

可提前处理:

  1. 文档解析;
  2. 切块;
  3. embedding;
  4. 常见问题答案;
  5. 用户静态档案摘要;
  6. 报表固定部分;
  7. 工具结果快照。

不能预计算:

  1. 实时库存;
  2. 当前订单状态;
  3. 权限即将变化的个人数据;
  4. 依赖本次上传文件的内容。

26.7 超时预算

{
  "total_ms": 12000,
  "query_rewrite_ms": 800,
  "retrieval_ms": 500,
  "rerank_ms": 800,
  "llm_first_token_ms": 3000,
  "llm_total_ms": 9000
}

每个阶段设置超时并保留降级结果:

  1. rerank 超时用召回排序;
  2. 摘要超时用最近窗口;
  3. 模型超时用备用模型或模板;
  4. 工具超时说明稍后再试;
  5. 不能牺牲权限校验。

26.8 长尾排查

现象 常见原因
p99 高但 p50 正常 队列、限流、重试
首字慢 输入过长、模型负载
总耗时高 输出长
检索慢 过滤无索引
某租户慢 数据量异常
间歇超时 连接池耗尽
凌晨慢 索引任务抢占

26.9 SLO 设计

示例:

场景 指标
实时客服 TTFT p95 < 3s
知识问答 total p95 < 12s
文档摘要 异步 5 分钟内
Agent 任务 30 分钟内完成
流式输出 间隔 < 10s

SLO 要与错误率、质量指标和成本一起看,不能只压延迟。

本章小结

延迟优化先拆 trace,再针对输入长度、输出长度、检索、rerank、模型和排队处理。流式响应改善感知,并行化缩短等待,预计算减少重复工作。所有优化都要观察 p95/p99 和质量指标。

思考题

  1. TTFT 和 total latency 哪个更能代表体验?
  2. 哪些步骤适合并行?
  3. 为什么输出 token 对延迟影响大?
  4. 如何避免离线索引任务影响在线服务?
  5. 超时降级时哪些校验不能省略?