备用模型可能在延迟、上下文、工具调用、结构化输出和成本上与主模型不同,照搬原工作流容易造成二次失败。文章主张按任务所需能力定义降级策略,并同步缩减产品功能。
大多数多模型 fallback 逻辑看起来都是这样的:
if (primaryRouteFailed) {
return callModel(fallbackModel);
}
这总比直接返回错误要好。
但它并不是一套完整的可靠性策略。
fallback model 可能在延迟、上下文限制、工具调用行为、结构化输出可靠性、语言质量、安全行为或成本方面存在差异。
因此,当路由发生变化时,产品也可能需要随之调整。
假设有一个客服助手,通常会:
如果主要路由出现异常,fallback model 或许仍然能够回答一些简单问题。
但它能否可靠地:
如果答案是否定的,那么把完全相同的工作流交给 fallback,可能只会引发第二次失败。
路由已经变了。
产品也应该随之调整。
一套实用的 fallback 策略,应该先明确工作流需要哪些能力。
例如:
const workflowRequirements = {
needsStructuredOutput: true,
needsToolCalling: true,
needsCitations: true,
maxLatencyMs: 5000,
languages: ["en", "zh"],
};
然后定义每条获准使用的路由能够安全提供哪些能力:
const routes = {
primary: {
structuredOutput: true,
toolCalling: true,
citations: true,
maxLatencyMs: 5000,
},
fallback: {
structuredOutput: true,
toolCalling: false,
citations: true,
maxLatencyMs: 3500,
},
};
fallback 不只是一个备用模型名称。
它代表的是另一套能力配置。
当主要路由失败时,应用应该决定保留什么、移除什么。
对于面向客户的工作流,降级版本可以:
对于后台工作流,则可以:
目标不是让用户察觉不到 fallback。
目标是让体验依然有用且安全。
有些工作流应该直接停止,而不是简化执行。
例如:
不完整或未经验证的结果,可能比明确失败更加糟糕。
因此,每个工作流都需要为以下三种状态制定策略:
使用 fallback 时,记录的内容不能只有模型名称。
还应记录:
否则,团队可能会因为请求成功返回,就误以为 fallback 运行良好。
与此同时,用户得到的结果可能更慢、更不完整,也更不可靠。
fallback 同样需要执行时间。
如果主要路由在反复重试中耗尽了全部截止时间,fallback 实际上就没有成功的机会。
一个可行的执行顺序是:
fallback 应该成为工作流设计的一部分,而不是错误处理程序的最后一行代码。
多模型 AI 并不意味着每个模型都是彼此的复制品。
如需采取进一步措施,可以考虑屏蔽此人和/或举报滥用行为。