Agent降级链设计:构建弹性的多层防线
引言 在理想世界中,Agent的每个请求都能得到完美处理。但现实是,LLM API会限流、工具会超时、外部服务会宕机。当主路径不可用时,Agent需要有备选方案——这就是降级链(Fallback Chain)。 降级链的设计哲学是"逐步退化"——不是在失败时直接报错,而是尝试一系列替代方案,每一步都比上一步弱一些但仍然能提供价值。就像人类的处理方式:想不起来精确答案时,先给个近似答案;近似答案也没有时,至少给个方向。 一、降级链的核心原则 1.1 逐步退化 完美结果 → 良好结果 → 可用结果 → 基本结果 → 优雅失败 每一步降级都是可控的、有意的,而不是崩溃式的。 1.2 价值保留 每一步降级都应尽可能保留核心价值。用户问"帮我分析这份数据",如果AI分析不可用,至少展示原始数据;如果展示也不行,至少告知用户数据已收到、稍后处理。 1.3 透明告知 降级时应告知用户当前状态,而不是假装一切正常: "由于实时数据服务暂时不可用,以下分析基于最近缓存数据(更新于5分钟前)。" 1.4 可观测 每次降级都应该被记录和监控,用于发现系统性问题。 二、LLM降级链 2.1 模型降级链 GPT-4o / Claude Opus → GPT-4o-mini / Claude Sonnet → GPT-3.5 / Claude Haiku → 规则引擎 第一级:最强模型,提供最佳质量 第二级:中等模型,质量略降但更快更便宜 第三级:轻量模型,保证基本功能 第四级:规则引擎,不依赖LLM 2.2 降级触发条件 class LLMFallbackChain: def __init__(self): self.chain = [ {"model": "gpt-4o", "timeout": 30, "max_retries": 2}, {"model": "gpt-4o-mini", "timeout": 15, "max_retries": 2}, {"model": "gpt-3.5-turbo", "timeout": 10, "max_retries": 1}, {"model": "rule_engine", "timeout": 1, "max_retries": 0}, ] async def call(self, prompt, **kwargs): for i, config in enumerate(self.chain): try: if config["model"] == "rule_engine": return await self.rule_engine_fallback(prompt) result = await self.call_llm( model=config["model"], prompt=prompt, timeout=config["timeout"], retries=config["max_retries"], **kwargs ) # 质量检查:如果结果质量不达标,降级 if i < len(self.chain) - 1 and not self.quality_check(result): logger.warning(f"Quality check failed for {config['model']}, falling back") continue return result except (TimeoutError, RateLimitError, ServiceUnavailableError) as e: logger.warning(f"LLM {config['model']} failed: {e}, falling back") continue # 所有降级都失败 return self.graceful_failure(prompt) 2.3 质量降级 不只是模型级别的降级,还可以在功能级别降级: ...