为什么需要Agent,而不是一次对话

2026年5月,一辆从纽约开往夏洛特的巴士在弗吉尼亚施工区未能及时减速,撞上前方车流,5人死亡、40余人受伤。事故核心在于人类驾驶员在边缘场景(施工区突然出现)中执行失败。

传统驾驶辅助系统(ADAS)依赖固定规则:检测到障碍物就报警或刹车。但规则无法覆盖所有变数——施工区何时出现、前车刹车力度、路面积水、司机疲劳程度。一个问题需要多步骤、动态调整、失败恢复的能力,这正是Agent系统的强项。

读者收获:你将学到如何把一次决策(踩刹车)拆成“感知→规划→执行→重试”的Agent循环,并能直接将其应用到任何需要实时响应的产品(如客服机器人、生产线控制)。

Agent架构拆解:驾驶决策的四个模块

一个能处理边缘场景的Agent通常包含以下部分:

  1. 规划器(Planner):根据当前状态(车速、与前车距离、施工区位置)生成行动序列。例如“如果距离<50米且速度>40km/h,先发警告,0.5秒后再评估”。
  2. 工具(Tools):调用外部传感器(摄像头、雷达、GPS)获取数据。在Agent中,每个传感器是一个封装好的函数。
  3. 记忆(Memory):短期记忆保存最近10秒的车辆状态(速度、加速度、方向盘角度);长期记忆保存施工区位置历史,用于预测重复出现。
  4. 执行器(Executor):发送刹车信号、仪表盘警告、甚至控制方向盘。执行后必须等待反馈。

这种架构的关键优势是失败重试(Retry)——如果首次警告无效,规划器可以升级为自动刹车,而不是永远等待人类反应。

核心流程图:感知−规划−执行−反馈循环

下面用伪代码展示一个简化版驾驶Agent在一个时间步内的行为:

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
class DrivingAgent:
    def __init__(self):
        self.memory = ShortTermMemory(capacity=50)
        self.planner = RuleBasedPlanner()  # 也可以换成LLM

    def step(self, sensors: dict):
        # 1. 工具调用:读取传感器
        speed = sensors['speed']          # km/h
        dist = sensors['obstacle_distance']  # 米
        zone = sensors['work_zone_flag']   # True/False

        # 2. 记忆更新
        self.memory.push({'speed': speed, 'dist': dist})

        # 3. 规划:生成动作
        action = self.planner.decide(
            speed=speed,
            dist=dist,
            zone=zone,
            history=self.memory.recent(5)
        )

        # 4. 执行,并获取结果
        result = self.execute(action)

        # 5. 反馈:如果执行失败(例如车辆未减速),重新规划
        if not result['success']:
            fallback = self.planner.fallback(action, result)
            self.execute(fallback)
            # 写入日志用于事后分析
            log_error(f"Fallback activated: {fallback}")

        return result

agent decision loop diagram driving
图:Agent每50ms循环一次,保证实时性

关键实现细节与踩坑记录

1. 实时性冲突

Agent的推理时间必须小于100ms,否则制动指令滞后。LLM(如GPT-4)延迟超过1秒,不能直接用于毫秒级决策

  • 可行方案:用小型规则引擎作为主规划器(延迟<1ms),LLM仅用于异常情况回顾或离线调参。
  • 我的观点:纯LLM的Agent不适合线控实时系统,但可以作为“反思层”在事故前几秒给出建议。

2. 传感器信任度

摄像头可能在夜间失效,超声波在泥泞中误差增大。Agent需要给每个工具设置“置信度”。

  • 实操:融合多个传感器(雷达+摄像头),用卡尔曼滤波生成统一距离值。如果置信度低于阈值,降级为“警告但不自动刹车”。

3. 记忆污染

短期记忆必须定期清理,否则旧状态会误导规划器。例如5秒前的急刹车不应影响当前轻刹车决策。

  • 踩坑:初版忘记清零,导致Agent以为前方一直有障碍物,连续误刹车。修复:每次检测到明显状态跳变(如速度变化>30km/h)时重置记忆。

4. 失败重试的副作用

如果Agent在1秒内连续两次执行自动刹车,可能引起后车追尾。重试策略需要加入“冷却期”。

  • 实践:每次自动刹车后至少等待2秒才能再次自动刹车,期间只发送警告。

简化版动手实现:30行模拟施工区决策

以下Python代码模拟Agent如何应对施工区风险。读者可复制运行,观察不同条件下的输出。

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
import time

class SimpleAgent:
    def __init__(self):
        self.last_brake_time = 0

    def decide(self, speed, dist_to_workzone):
        # 假设施工区距离50米
        if dist_to_workzone < 50 and speed > 30:
            # 第一次:警告
            print("Warning: Work zone ahead, reduce speed!")
            time.sleep(0.2)  # 模拟警告时间
            # 第二次检查(我们假设没有反馈,直接判断)
            # 实际中应该等新传感器数据
            if time.time() - self.last_brake_time > 2:
                print("*** Engaging auto-brake ***")
                self.last_brake_time = time.time()
                return "AutoBrake"
            else:
                return "WarningOnly"
        else:
            return "NoAction"

# 模拟一帧数据
agent = SimpleAgent()
for i in range(5):
    # 模拟:第3帧出现施工区
    dist = 60 - i*10 if i < 3 else 40
    speed = 60 - i*5
    action = agent.decide(speed, dist)
    print(f"Frame {i}: speed={speed:.0f}, dist={dist:.0f} => {action}")
    time.sleep(0.1)

输出示例:

text
1 2 3 4 5 6
Warning: Work zone ahead, reduce speed!
Frame 0: speed=60, dist=60 => NoAction
Frame 1: speed=55, dist=50 => NoAction
Frame 2: speed=50, dist=40 => Warning: Work zone ahead, reduce speed!
*** Engaging auto-brake ***
Frame 2: ...

这段代码展示了Agent如何结合规则与时间限制做出渐进式决策。实际生产环境需要更复杂的传感器融合和失败处理,但核心思想一致。

对开发者的直接建议

  1. 如果你在构建任何需要实时决策的产品(客服机器人、监控系统、工业控制器),先把任务拆成“感知-规划-执行-反馈”四个明确模块,不要所有逻辑揉在一个函数里。
  2. 给每个模块设定超时和降级方案,例如规划器若50ms没返回结果,直接执行默认安全动作。
  3. 日志是救命稻草。Agent决策过程必须被完整记录,才能在事后分析为什么系统没有阻止事故。

从这次巴士事故中,最大教训不是技术不够先进,而是我们信任了一个没有“失败重试”机制的人类。用Agent架构武装你的系统,至少能在人犯错时多一次挽回机会。