Playwright + AI 智能体混合架构(三):AI 也失败时——降级、灰度与回滚

AI 智能体也不是万能的。当 AI 无法完成任务时,系统应该怎么做?降级检测指标、灰度切换、操作可逆性——兜底策略不必复杂但必须提前设计。

亿牛云技术团队2026年4月18日3 分钟阅读

AI 会失败

AI 智能体不是万能的。在我们的生产经验中,AI 失败的主要模式包括:

  1. 超时失败:智能体在复杂页面上花了超过 15 分钟,仍然无法完成操作
  2. 循环失败:智能体进入循环——"点击 → 检查 → 不对 → 重新点击 → 仍然不对",无法脱离
  3. 幻觉失败:智能体报告操作成功,但实际没有(Nanobrowser Validator 的典型问题)
  4. 成本失控:智能体在单次任务上消耗了预期的 3 倍以上的 Token

AI 失败不是会不会发生的问题,是何时发生的问题。兜底策略必须在设计时准备,而不是在事故时临时想。

降级检测指标

在触发任何兜底动作之前,需要客观的指标来判断 AI 是否真的"失败了"。

class AIDegradationDetector:
    def __init__(self):
        self.max_steps = 30           # 最大操作步数
        self.max_time_seconds = 600   # 最大处理时间(10 分钟)
        self.max_tokens = 50000       # 最大 Token 消耗
        self.max_retries = 5          # 同一操作的最大重试次数
 
    def check_health(self, agent_state):
        alerts = []
 
        if agent_state["step_count"] > self.max_steps:
            alerts.append("step_limit_exceeded")
 
        if agent_state["elapsed_seconds"] > self.max_time_seconds:
            alerts.append("time_limit_exceeded")
 
        if agent_state["token_consumed"] > self.max_tokens:
            alerts.append("token_budget_exceeded")
 
        if agent_state["consecutive_retries"] > self.max_retries:
            alerts.append("retry_loop_detected")
 
        return alerts

这些指标不需要很精确——它们的作用是在情况明显异常时触发干预,而不是在边缘情况下误判。

降级策略层次

当检测到 AI 失败时,按顺序尝试以下降级策略:

第 1 级:重试(带变化)
  用不同的提示词重试、增加截图为视觉输入、简化任务描述
 
第 2 级:简化任务
  将当前步骤拆分为更小的子步骤,逐个子任务执行
 
第 3 级:切换模型
  从快速/廉价模型切换到更强模型(Gemini Flash → Claude Sonnet)
 
第 4 级:人工上报
  将任务标记为"需人工处理",进入等待队列
 
第 5 级:跳过 / 默认值
  如果操作是可选的非关键路径,使用默认值跳过

在代码中表达为:

class DegradationManager:
    async def execute_with_degradation(self, task, page):
        for level in [Level1_RETRY, Level2_SIMPLIFY, Level3_MODEL_SWITCH]:
            result = await level.execute(task, page)
            if result.success:
                return result
        # 所有自动降级都失败
        if task.critical:
            return await self.escalate_to_human(task)
        else:
            return await self.skip_with_default(task)

操作可逆性

AI 操作的降级最难处理的不是"操作失败了",而是"操作执行了一半且不可逆"。

示例场景:智能体已经提交了支付表单,然后才发现地址填错了。

不可逆操作的处理方式不是在降级时补救,而是在执行前确认:

class IrreversibleOperationGuard:
    """不可逆操作的防护门"""
    async def execute(self, operation, confirm_fn):
        # 执行前验证
        if not await confirm_fn():
            raise PreconditionError("Pre-execution check failed")
 
        # 捕获操作前的状态,用于可能的回滚
        before_state = await self.capture_system_state()
 
        try:
            result = await operation.execute()
        except Exception as e:
            # 尝试回滚
            await self.attempt_rollback(before_state)
            raise
 
        # 执行后验证
        if not await self.verify_operation(result):
            await self.attempt_rollback(before_state)
            raise VerificationError("Post-execution verification failed")
 
        return result

在 AI 浏览器自动化场景中,不可逆的操作包括:

操作类型回滚可能性防护措施
表单提交取决于目标网站执行前截图确认、先模拟提交
删除操作难回滚要求人工二次确认
支付不可回滚必须有外部确认步骤
数据导出可回滚(可删)记录操作日志用于审计
配置修改可回滚(有备份)修改前备份原值

灰度切换

当你更新了脚本或者 AI 策略后,不要全量上线。使用灰度发布:

class GradualRollout:
    """灰度切流"""
    def __init__(self, traffic_split=0.1, metric_threshold=0.95):
        self.script_engine = ScriptEngine()
        self.ai_agent = AIAgent()
        self.traffic_split = traffic_split  # 10% AI, 90% 脚本
        self.metric_threshold = metric_threshold
 
    async def route(self, task):
        # 对比模式:同时用脚本和 AI 运行
        if random.random() < self.traffic_split:
            script_result = await self.script_engine.run(task)
            ai_result = await self.ai_agent.run(task)
 
            # 记录对比结果
            await self.record_comparison(task, script_result, ai_result)
 
            # 返回脚本结果(默认使用稳定的版本)
            return script_result
 
        return await self.script_engine.run(task)
 
    async def should_increase_traffic(self):
        """根据指标决定是否提高 AI 流量比例"""
        metrics = await self.get_comparison_metrics()
        # 如果 AI 成功率 >= 95%,提高流量比例
        if metrics["ai_success_rate"] >= self.metric_threshold:
            self.traffic_split = min(1.0, self.traffic_split * 2)

回滚触发条件

灰度过程中需要自动回滚的条件:

  1. 成功率下降超过 5%——AI 版本导致任务成功率显著低于脚本版本
  2. 平均耗时增加 2 倍以上——AI 处理时间超出预期
  3. 成本超过替代方案——AI 版本的 Token 消耗折算后比脚本版本更贵
  4. 错误率上升——新的错误类型出现(通常是页面结构变化没覆盖到)

回滚应该是自动的:

class AutoRollback:
    async def monitor_and_rollback(self):
        metrics = await self.get_recent_metrics()
 
        if metrics["success_rate"] < self.baseline_success_rate - 0.05:
            await self.rollback("success_rate_dropped")
        elif metrics["avg_duration_ms"] > self.baseline_duration_ms * 2:
            await self.rollback("duration_exceeded")
 
    async def rollback(self, reason):
        logger.warning(f"Rolling back: {reason}")
        self.current_strategy = "script_only"
        # 通知
        await self.notify_team(f"AI strategy rolled back due to {reason}")

总结

AI 浏览器自动化的降级设计遵循三个原则:

  1. 检测先行——定义客观的失败指标(步数、时间、Token、重试次数)
  2. 分级降级——从重试到简化到切换模型到人工上报,逐级尝试
  3. 操作可逆——不可逆操作在执行前做二次确认,可逆操作保留回滚路径

混合架构(D 系列三篇)的核心思想是:不要把所有鸡蛋放在一个篮子里。 脚本和 AI 各有优势和劣势,通过桥接层和降级机制把它们组合起来,系统的整体可靠性会远高于单独使用其中任何一种方案。

需要企业代理方案?

我们可根据目标站点、并发规模与稳定性目标提供定制方案。