为什么需要Agent,而不是一次对话
2026年5月,一辆从纽约开往夏洛特的巴士在弗吉尼亚施工区未能及时减速,撞上前方车流,5人死亡、40余人受伤。事故核心在于人类驾驶员在边缘场景(施工区突然出现)中执行失败。
传统驾驶辅助系统(ADAS)依赖固定规则:检测到障碍物就报警或刹车。但规则无法覆盖所有变数——施工区何时出现、前车刹车力度、路面积水、司机疲劳程度。一个问题需要多步骤、动态调整、失败恢复的能力,这正是Agent系统的强项。
读者收获:你将学到如何把一次决策(踩刹车)拆成“感知→规划→执行→重试”的Agent循环,并能直接将其应用到任何需要实时响应的产品(如客服机器人、生产线控制)。
Agent架构拆解:驾驶决策的四个模块
一个能处理边缘场景的Agent通常包含以下部分:
- 规划器(Planner):根据当前状态(车速、与前车距离、施工区位置)生成行动序列。例如“如果距离<50米且速度>40km/h,先发警告,0.5秒后再评估”。
- 工具(Tools):调用外部传感器(摄像头、雷达、GPS)获取数据。在Agent中,每个传感器是一个封装好的函数。
- 记忆(Memory):短期记忆保存最近10秒的车辆状态(速度、加速度、方向盘角度);长期记忆保存施工区位置历史,用于预测重复出现。
- 执行器(Executor):发送刹车信号、仪表盘警告、甚至控制方向盘。执行后必须等待反馈。
这种架构的关键优势是失败重试(Retry)——如果首次警告无效,规划器可以升级为自动刹车,而不是永远等待人类反应。
核心流程图:感知−规划−执行−反馈循环
下面用伪代码展示一个简化版驾驶Agent在一个时间步内的行为:
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每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如何应对施工区风险。读者可复制运行,观察不同条件下的输出。
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)
输出示例:
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如何结合规则与时间限制做出渐进式决策。实际生产环境需要更复杂的传感器融合和失败处理,但核心思想一致。
对开发者的直接建议
- 如果你在构建任何需要实时决策的产品(客服机器人、监控系统、工业控制器),先把任务拆成“感知-规划-执行-反馈”四个明确模块,不要所有逻辑揉在一个函数里。
- 给每个模块设定超时和降级方案,例如规划器若50ms没返回结果,直接执行默认安全动作。
- 日志是救命稻草。Agent决策过程必须被完整记录,才能在事后分析为什么系统没有阻止事故。
从这次巴士事故中,最大教训不是技术不够先进,而是我们信任了一个没有“失败重试”机制的人类。用Agent架构武装你的系统,至少能在人犯错时多一次挽回机会。