一个 AI 功能再聪明,如果用户每次都要盯着加载动画等上十几秒,体验也会大打折扣。大模型应用的延迟由多个环节叠加而成,优化时需要先测量各环节的耗时,找到真正的瓶颈,再对症下药。 很多时候,不需要更换硬件或模型,仅靠架构和交互设计的调整,就能让用户感受到的速度明显提升。

延迟的构成

一次典型的 AI 请求,延迟可以分解为:

  1. 网络往返:客户端到服务器、服务器到模型 API 的网络传输;
  2. 前置处理:鉴权、检索知识库、调用其他服务获取上下文;
  3. 预填充(Prefill):模型处理全部输入 Token,决定了首个 Token 出现前的等待时间;
  4. 解码(Decode):逐个生成输出 Token,总耗时取决于输出长度和每 Token 生成速度;
  5. 后处理:格式校验、安全过滤、写入数据库等。

两个关键指标:**首 Token 时间(TTFT)**决定用户多久能看到响应开始;总耗时决定完整结果何时可用。

优化清单

1. 流式输出

这是提升感知速度最有效的方法。生成一个 Token 就推送一个,用户在一两秒内就能看到内容开始出现,而不必等待整个回答完成。即使总耗时不变,体验也会好很多。

2. 精简输入

输入越长,预填充时间越长。

  • 删除系统提示中冗余重复的说明;
  • 只检索真正相关的少量文档片段;
  • 压缩多轮对话的历史;
  • 移除工具返回结果中不必要的字段。

3. 控制输出长度

解码时间与输出长度成正比。在提示中明确要求简洁回答,设置合理的最大输出长度。对于结构化输出,精简字段名和格式。

4. 选择合适的模型

简单任务使用更小、更快的模型。在一个应用中按任务难度路由到不同模型,既能降低延迟,也能降低成本,参见大模型 API 成本优化。推理模型的思考过程会显著增加延迟,只在必要时使用,参见推理模型是怎么“想”的。

5. 利用前缀缓存

把系统提示词、固定的参考资料等不变内容放在请求的开头,便于服务端复用缓存,减少预填充时间。

6. 并行化

  • 检索、查询用户信息等相互独立的前置步骤并行执行;
  • 需要多次调用模型且彼此无依赖时,并行发起请求;
  • 在用户输入的同时预先加载可能需要的上下文。

7. 结果缓存

对于高频重复的问题,缓存完整的回答。语义缓存可以匹配意思相近的问题,但要注意时效性和个性化内容不能错误复用。

8. 减少串行的模型调用

Agent 和复杂工作流中,多次串行调用模型会让延迟成倍增加。审视流程,合并可以合并的步骤,能用规则和代码完成的不交给模型。

9. 优化检索链路

向量检索、重排序都会增加延迟。控制候选数量,必要时为重排序设置时间预算。

10. 自建推理的专项优化

如果自建推理服务,可以通过推理引擎调优、量化、投机解码等手段进一步降低延迟,参见投机解码和 vLLM 推理服务入门。

交互设计层面的优化

  • 即时反馈:用户提交后立即显示“正在查找资料”“正在分析”等进度提示,让等待变得可理解;
  • 分步展示:先展示检索到的来源,再展示生成的回答;
  • 异步处理:对于耗时较长的任务,如生成报告,改为后台处理,完成后通知用户;
  • 乐观更新:对于可撤销的操作,先在界面上显示结果,再在后台确认。

建立延迟监控

在每个环节埋点记录耗时,持续监控首 Token 时间和总耗时的分布,特别关注慢请求的比例,而不只是平均值。一次模型升级或提示词修改可能悄悄让延迟变差,相关监控方法见大模型应用上线后的监控。

小结

降低大模型应用延迟,先要拆解和测量各环节耗时。流式输出提升感知速度,精简输入输出、选择合适模型、利用缓存和并行化降低实际耗时,交互设计让等待更容易接受。持续监控延迟分布,才能在功能迭代中守住用户体验。