先这样答
系统延迟优化,先拆延迟构成,再用 profile 找出大头,分别优化首 token 和吐字速度,最后按模型、检索、链路逐项处理。不要一开始就盲目做整体改动。先确认用户感受到的慢来自哪里,再选对应手段。
模型侧先看是否能用更小模型,再利用 KV Cache 和投机解码减少生成等待。输出过程可以采用流式,让结果更早开始返回。这里要把首 token 和后续吐字速度分开测,否则容易把不同问题混在一起。
检索侧可以缓存热查询,并行执行召回,减少串行等待。rerank 阶段可以降低候选数量,控制检索耗时。链路侧可以做预取和流水线化,并给不同环节分配超时预算。每项改动都要回到 profile 结果上验证,优先处理占比最大的部分。
面试官会怎么追问
-
「为什么要把首 token 和吐字速度分开看?」 首 token 反映请求到第一次输出的等待,吐字速度反映开始输出后的生成过程。两者慢的环节可能不同。分开看,才能分别选择模型、缓存、流式等方法。
-
「你会先优化模型,还是先优化检索?」 我不会先入为主。先 profile,确认延迟大头在模型、检索还是链路,再处理对应部分。若检索占比高,先看热查询缓存、并行召回和 rerank 候选数量;若模型占比高,再看更小模型、KV Cache 和投机解码。
-
「链路侧除了调超时,还能做什么?」 可以做预取和流水线化,减少环节之间的等待。超时预算要按不同环节分配,避免某个环节占用过多时间。具体先看 profile,再决定改哪一段。
回答的坑
- 只盯着平均总延迟,忽略首 token 和吐字速度的差异,就难以定位该优化的环节。
- 没有先 profile 就同时修改模型、检索和链路,容易把时间花在延迟大头之外。
同系列的题
这家公司的面经实录
—— 本题完 ——