2. Agent异常类型与分类
2.1 边界定义
Agent系统运行中产生的异常可归为四类边界清晰的类型,每类异常的来源、传播路径和影响范围均有明确界定。
| 异常类型 | 定义边界 | 典型来源 |
|---|---|---|
| 外部依赖异常 | Agent调用外部服务、API、数据库、模型推理接口时,因外部系统不可用、返回错误或超时引发的异常 | 第三方API限流、LLM服务降级、数据库连接池耗尽 |
| 内部逻辑异常 | Agent内部状态机、规则引擎、决策逻辑、数据校验等自身代码错误或状态冲突导致的异常 | 状态转换不合法、分支条件遗漏、断言失败 |
| 资源异常 | Agent运行时所需的计算、内存、存储、网络带宽等系统资源不足或泄漏导致的异常 | 内存溢出、文件句柄泄漏、GPU显存不足 |
| 通信异常 | Agent内部模块之间或Agent与外部实体之间的消息传输、协议解析、连接中断等异常 | 网络丢包、消息序列化失败、心跳超时 |
2.2 分层职责
从Agent系统架构的分层视角来看,每类异常的主要职责归属对应层:
- 感知层:主要关注外部依赖异常(如传感器数据获取失败、LLM接口返回格式异常)和通信异常(与数据源之间的网络传输问题)。
- 决策层:主要关注内部逻辑异常(推理路径错误、规划超时)和资源异常(模型推理所需显存不足)。
- 执行层:主要关注外部依赖异常(调用下游服务失败)和资源异常(执行资源耗尽)。
- 支撑层(日志、监控、配置):关注所有四类异常的记录和告警,但资源异常和通信异常的根因定位最为典型。
2.3 数据流 / 控制流 / 信任链路
数据流视角下:
外部依赖异常一般在数据输入阶段被捕获(如API返回4xx/5xx);内部逻辑异常在数据处理阶段出现;通信异常发生在数据传输阶段;资源异常潜伏于数据缓存或内存分配环节。
控制流视角下:
Agent的主循环(感知→决策→执行)中,每类异常都可能导致降级、重试、熔断或终止控制路径的跳转。
信任链路视角下:
外部依赖异常直接破坏对第三方服务的信任假设;内部逻辑异常反映Agent自身可靠性不足;资源异常和通信异常则属于基础设施信任的缺失。分类后可在信任边界上设置不同的断路器和超时策略。
设计要点:四类异常在信任链路上具有传递性——外部依赖异常可能引发内部逻辑异常(例如因API返回空数据导致状态机进入未定义状态),分类时需区分根因与表现。
2.4 选型权衡
在Agent架构中,针对四类异常的异常处理策略存在以下取舍:
| 异常类型 | 推荐策略 | 成本权衡 |
|---|---|---|
| 外部依赖异常 | 指数退避重试 + 熔断 + 降级 | 重试增加延迟,降级降低功能完整性 |
| 内部逻辑异常 | 运行时状态回滚 + 日志记录 + 补偿事务 | 状态回滚开销大,需额外存储快照 |
| 资源异常 | 限流 + 资源池监控 + 自动扩容 | 扩容成本高,限流可能丢弃任务 |
| 通信异常 | 消息队列 + 确认机制 + 幂等处理 | 引入消息队列增加架构复杂度 |
常见误区:将所有异常都归为“外部依赖异常”并用同一种重试逻辑处理,会导致内部逻辑异常被掩盖(例如状态机死循环被误判为API超时重试),资源异常被重试加剧(内存泄漏因反复重试更快耗尽堆内存)。必须按类型配置差异化的处理策略。
2.5 风险点
- 分类粒度过粗:将不同根源的异常混为一类,导致错误定位困难。
- 分类粒度过细:产生数十种原子异常类型,增加处理代码的维护成本。
- 异常传播链断裂:内部逻辑异常由外部依赖异常引发时,只记录子异常而丢失根因。
- 资源异常隐蔽:内存泄漏、句柄泄漏往往在累积到临界点才暴露,分类后未及时纳入健康检查。
2.6 落地步骤
- 定义异常枚举:基于Agent系统已有错误码和运行时日志,按四类边界分类归集。示例代码:
{
"exception_types": {
"EXTERNAL_DEPENDENCY": ["API_TIMEOUT", "API_5XX", "MODEL_RESPONSE_INVALID"],
"INTERNAL_LOGIC": ["INVALID_STATE_TRANSITION", "CONDITION_MISSING_BRANCH", "ASSERTION_ERROR"],
"RESOURCE": ["OUT_OF_MEMORY", "FILE_HANDLE_EXHAUSTED", "GPU_OOM"],
"COMMUNICATION": ["SERIALIZATION_FAILURE", "CONNECTION_RESET", "HEARTBEAT_MISSED"]
}
}
- 植入分类标签:在每个异常捕获点,显式添加异常类型枚举字段(如
error_type: "EXTERNAL_DEPENDENCY")。 - 建立分类映射表:将第三方SDK抛出的原始异常(如
requests.ConnectionError)映射至“外部依赖异常”或“通信异常”。 - 编写分类校验测试:通过注入异常数据,验证每个异常点是否被正确分类。
2.7 验收标准
- 所有已识别的异常来源都能在“外部依赖/内部逻辑/资源/通信”四类中找到归属,无无主异常。
- 相同根因的异常在多次触发时分类一致,无随机漂移。
- 异常分类信息可被监控系统自动聚合,并能生成按类别分布的告警面板。
- 当外部依赖异常引发内部逻辑异常时,异常链中两种类型并存,且根因标记正确。
实践建议:在Agent的异常基类中增加type属性,初始分类不必追求完美,可以先按最明显归属划分,运行一段时间后根据告警分布重新校准分类边界。