Appearance
11.2.4 如何设计检索、重排、生成链路的降级策略?
先给结论:生产级 RAG 必须有可执行的降级链路。降级的核心不是“直接关掉生成”,而是按顺序减少成本和风险,同时尽量保留可用信息。
很多系统的降级策略只有一条:
- 出问题就关掉生成
这在紧急情况下可以救场,但更稳的策略应该是:
- 分层降级
让系统逐步退化,而不是一次崩塌
一、降级策略的目标是什么
真正好的降级策略要同时满足三件事:
- 让系统还能回答或提供证据
- 避免错误扩大
- 把成本和延迟控制住
所以降级不是简单“变差”,而是:
- 有序退化
二、一个常见的降级顺序
下面是一个更实用的降级顺序示例:
- 降低
TopK,减少候选池成本 - 跳过
Rerank,直接使用初排结果 - 收紧上下文长度,减少生成成本
- 切换到更轻量模型
- 只返回检索结果,不做生成
这个顺序的逻辑是:
- 先减少成本
- 再减少复杂度
- 最后才退回检索直出
三、不同链路的常见降级动作
检索链路的降级
- 降低
TopK - 简化过滤条件
- 切换到更轻量的索引或检索路径
重排链路的降级
- 直接跳过
Rerank - 只重排少量候选
- 使用更轻量的重排模型
生成链路的降级
- 缩短上下文长度
- 切换到轻量模型
- 返回证据片段而非完整回答
四、什么时候应该触发降级
触发降级通常不是靠主观感觉,而是通过指标阈值触发,例如:
- 延迟超过阈值
- 错误率上升
- 下游模型调用失败
- 并发队列积压
这意味着降级策略需要与:
- 监控指标
- 实时告警
绑定在一起,否则就只是“纸上降级”。
五、降级策略必须是可回退的
降级不是永久状态,而是:
- 暂时降低服务质量
所以你需要确保:
- 指标恢复后可以快速升回正常模式
- 不会因为降级导致系统长期停留在低质量状态
六、一个最小降级策略示意
python
def degrade(level):
if level == 1:
return "reduce_topk"
if level == 2:
return "skip_rerank"
if level == 3:
return "shorten_context"
if level == 4:
return "switch_to_light_model"
if level == 5:
return "retrieval_only"这个示意的重点是:
- 降级有顺序
- 每一步都有清晰动作
七、最常见的降级误区
误区一:降级只靠人工触发
高并发下问题往往发生得很快,如果完全靠人工处理,很容易来不及。
误区二:只设计“最低级”降级
如果降级只有“开”和“关”,就很难在保证可用的同时控制风险。
误区三:降级后没有回升机制
降级如果无法自动回升,就会变成:
- 长期低质量服务
一句话总结
检索、重排、生成链路的降级策略必须分层、有序、可回退。先降成本与复杂度,再降功能;这样系统才能在高并发或故障时仍然可用。