Skip to content

10.2.3 如何平衡效果、延迟和成本? ​

先给结论:效果、延迟和成本在 RAG 里通常不可能同时无限优化。更现实的目标不是把三者都拉满,而是根据系统阶段、流量规模和业务风险,明确当前最值得优先保护哪一侧。

这是 RAG 从 Demo 走向真实系统后,几乎一定会遇到的问题。

你会发现很多动作都不是免费的:

  • 更复杂的召回链路会增加延迟
  • 更长的上下文会增加 token 成本
  • 更强的模型和 Reranker 会增加调用成本
  • 更多保护逻辑会增加系统复杂度

所以一旦系统开始面向真实流量,你就不能只问:

  • 效果能不能再高一点

还要一起问:

  • 这样做值不值
  • 用户能不能接受
  • 流量放大后扛不扛得住

为什么这三个目标经常互相拉扯 ​

最常见的冲突通常来自下面几类动作:

  • 放大候选池,提高 recall,但检索和选择成本变高
  • 增加 Rerank,提高最终结果质量,但延迟增加
  • 拉长上下文,提高信息覆盖,但 token 成本和长上下文噪声一起上升
  • 换更强模型,提高回答质量,但单次调用成本更高

也就是说,很多“效果优化”,本质上都是在消耗:

  • 时间预算
  • 计算预算
  • token 预算

一个很实用的起点:先明确系统当前处在哪个阶段 ​

不同阶段,三者优先级通常不同。

早期验证阶段 ​

更关注:

  • 能不能先证明链路有效

这时通常可以适度放宽成本和延迟要求,先把:

  • 基本效果
  • 错误归因
  • 关键链路问题

看清楚。

小规模上线阶段 ​

更关注:

  • 效果稳定性
  • 用户基本可接受的响应时间

这时你不能再只追求实验室里的最好效果,而要开始看:

  • 成本是否可持续
  • 延迟是否影响真实使用

大规模生产阶段 ​

更关注:

  • 单次成本
  • P95 / P99 延迟
  • 高峰流量下的稳定性

这时很多“效果再好一点”的动作,如果成本和延迟代价太高,未必值得。

更稳的平衡方法:先定预算,再调系统 ​

很多团队是先一路叠能力,最后才发现:

  • 成本太高
  • 延迟太慢

更稳的做法通常是反过来:

  1. 先定可接受的延迟范围
  2. 先定可接受的单次成本或整体预算
  3. 在这个预算里找最优效果组合

这样调优更接近真实生产目标。

什么情况下应该优先保效果 ​

当你的系统处于这些场景时,通常更应该优先保效果:

  • 高风险知识问答
  • 错误代价明显高于延迟代价
  • 还在建立系统可用性信心
  • 当前主要问题仍是明显答错或漏答

这时如果为了省一点成本而让系统频繁失真,往往得不偿失。

什么情况下应该更重视延迟 ​

当你的系统处于这些场景时,延迟优先级通常会显著上升:

  • 高频交互场景
  • 用户预期接近实时响应
  • 多轮对话连续追问较多
  • 前台入口面向大规模用户

这时即使效果略好一点,如果延迟明显拖慢体验,也可能整体价值下降。

什么情况下应该更重视成本 ​

当你的系统进入这些阶段时,成本会变得更关键:

  • 调用量显著放大
  • 每次请求都走完整长链路
  • 需要为多个租户或团队提供服务
  • 当前效果已经接近可接受水平,继续提升的边际收益变小

这时更重要的是:

  • 找到“足够好”的方案,而不是“理论最强”的方案

常见的平衡动作有哪些 ​

对效果有帮助,但可能增加延迟和成本的动作 ​

  • 增加 TopK
  • 增加 Rerank
  • 使用更强模型
  • 拉长上下文
  • 增加多路召回

对延迟和成本有帮助,但可能伤害效果的动作 ​

  • 缩小候选池
  • 去掉 Rerank
  • 收紧上下文长度
  • 使用更轻量模型
  • 减少多阶段处理

真正的优化,往往不是简单选择其中一边,而是:

  • 找到对当前系统最值得保留的那几步

一个现实可行的判断框架 ​

如果你不知道某个优化动作值不值得做,可以先问四个问题:

  1. 它主要改善的是哪一类问题
  2. 这类问题当前是否真的是主矛盾
  3. 它带来的延迟和成本增加是否可接受
  4. 这个收益能否被更便宜的方式替代

只要这四个问题答不清,就不要轻易把复杂链路永久加到生产里。

一个最小预算思路示意 ​

python
system_budget = {
    "max_latency_ms": 3500,
    "max_cost_per_request": 0.03,
    "must_protect": ["groundedness", "version_correctness"]
}

candidate_plan = {
    "multi_retrieval": True,
    "rerank": True,
    "context_tokens": 12000,
    "model_tier": "medium"
}

这个示意的重点不是数字本身,而是:

  • 先有预算意识
  • 再决定链路配置

最后要避免一个误区 ​

不要把“平衡效果、延迟和成本”理解成单纯的妥协。更准确的理解是:

  • 这是把系统从实验思维带到工程思维

真正成熟的系统,不是每一步都最强,而是:

  • 在可承受的预算里,把最关键的质量风险压下去

一句话总结 ​

平衡效果、延迟和成本的关键,不是三者都追到最高,而是先明确当前系统最该保护什么,再在预算内做有方向的取舍。