Chaos 测试给 Agent 用:主动制造工具故障来验证容错与回滚


一、引言 (Introduction)

1.1 钩子:当 AI 代理调用的“手”掉链子时,谁来救场?

场景1:深夜的客服 AI 救援

你是一家在线教育平台的架构师,周五晚上9点刚泡好牛奶准备陪孩子读睡前故事,手机突然弹出了SRE告警集群轰炸

平台自研的“学霸小助手”AI Agent(以下简称Agent X),故障响应率飙升至87.3%
知识库搜索接口(工具A)调用超时率:99.2%
错题数据库同步接口(工具B)连接超时率:98.7%
支付补录重试接口(工具C)返回500 Internal Server Error 占比:100%

赶紧打开监控后台,发现工具A/B/C所在的容器集群共享的Redis缓存节点雪崩了!(哦对,上周架构评审会上刚有人提过要做缓存节点的主从切换演练和Chaos注入,但因为赶双十二预热活动排期给压下去了……)
更糟的是,Agent X 完全懵了:

  • 调用超时后,它没有触发预设的分级重试机制(比如工具A超时1次用本地小缓存、3次用公开免费的通用教育API兜底),反而无限重试,把仅剩的几个备用Redis节点也给砸垮了;
  • 连接工具B失败后,它没有切换到本地临时错题文件队列(明明开发阶段在测试环境验证过这个功能!),直接告诉用户“系统维护中,请稍后重试”——导致平台这30分钟内的付费课程咨询转化率暴跌42%,客服工单量暴涨1200%
  • 工具C返回500后,它没有调用预定义的支付中心回滚钩子,反而继续给用户发“订单支付成功,请查收课程权限”的短信——事后审计发现有172笔重复支付订单,客服部门周末连续加班2天2夜才处理完退款和道歉,用户投诉率飙升至全年峰值的3.7倍

牛奶凉了,孩子睡着了,你坐在电脑前盯着告警历史,脑子里只有一个念头:

如果我们上线前,用Chaos测试的方式,故意把这些工具故障“演”给Agent X看100遍、1000遍,还会发生今天这场灾难吗?

场景2:自动驾驶卡车的刹车失灵模拟(更极端,但更直观)

假设现在有一款面向物流行业的Level 4级自动驾驶卡车AI Agent(以下简称Agent T),它依赖以下核心工具:

  • 激光雷达传感器数据处理接口(工具D)
  • 毫米波雷达传感器数据融合接口(工具E)
  • 车道线识别相机接口(工具F)
  • 紧急刹车系统(EBS)控制接口(工具G)

如果在高速公路上,工具D/E/F/G中的某一个或几个突然故障了:

  • 比如工具G的网络接口突然断开,Agent T 还能通过车载CAN总线直接触发机械备用刹车吗?
  • 比如工具D的传感器被大雪覆盖,返回的数据全是噪声,Agent T 还能通过工具E和工具F的降级融合算法安全地把车开到最近的服务区吗?
  • 比如所有通信工具都故障了,Agent T 还能通过预设的本地安全规则库(比如“检测到前方障碍物距离<100米且速度差>20km/h,直接减速到0并开启双闪”)保证人员和货物的安全吗?

我们不可能真的在高速公路上拿人的生命和货物的安全来测试这些场景——但我们可以在仿真环境、在封闭测试场、甚至在上线前的灰度环境中,用Chaos测试的方式,主动、可控、可复现地制造这些工具故障,来验证Agent T的容错能力、回滚机制和本地安全兜底逻辑!


1.2 定义问题/阐述背景:为什么传统软件的Chaos测试不能直接套给Agent用?

1.2.1 什么是Agent?

在展开之前,我们必须先给“本文讨论的Agent”下一个严格、清晰、符合技术博客读者(应该是软件工程师、AI应用开发者、SRE、QA测试工程师)认知的定义——避免和社会学、心理学里的“Agent”概念混淆。

根据OpenAI的官方文档[1]、LangChain的官方文档[2]和当前AI应用开发的主流实践,本文讨论的Agent是指:

一种具备感知能力(Perception)、推理能力(Reasoning)、行动能力(Action)的自主运行的软件实体,它通常通过大语言模型(LLM)作为“大脑”,通过工具调用(Tool Calling)接口与外部世界(比如数据库、API、传感器、硬件设备等)交互,来完成用户交给的复杂任务。

用更通俗的话来说,Agent就像一个**“有脑子、有眼睛、有手”的数字员工**:

  • 有脑子:就是LLM,负责理解用户的意图、规划任务的步骤、处理执行过程中遇到的异常;
  • 有眼睛:就是各种感知接口,比如文本输入接口、图像识别接口、语音识别接口等;
  • 有手:就是各种工具调用接口——这是本文要重点讨论的核心!Agent如果没有“手”(工具),就只能是一个“只会聊天的空壳子”,无法完成任何实际的任务(比如查天气、订机票、写代码并运行测试、控制自动驾驶卡车等)。
1.2.2 什么是Chaos测试?

同样,我们也必须给“Chaos测试”下一个符合当前SRE/DevOps实践的定义——避免和早期的“故障注入测试(Fault Injection Testing, FIT)”、“压力测试(Stress Testing)”混淆。

根据Netflix的Chaos Monkey官方文档[3]、CNCF的Chaos Engineering Definition[4],Chaos Engineering(混沌工程,本文有时简称为Chaos测试)是指:

一种主动、可控、可复现、面向生产环境的(或尽可能接近生产环境的)实验方法,它通过故意向系统中注入故障(比如服务崩溃、网络延迟、数据库连接超时、磁盘IO过高、CPU利用率过高、内存溢出等),来验证系统的弹性(Resilience)——也就是系统在遇到故障时,能够继续为用户提供“可接受的服务质量”(比如降级服务、延迟服务但不崩溃、自动回滚到上一个稳定状态等)的能力。

混沌工程的核心原则是CNCF定义的5条黄金法则[4]:

  1. 建立一个稳定状态的假设(Steady-State Hypothesis):首先,你必须明确系统在正常运行时的“稳定状态”是什么——也就是哪些指标(比如请求成功率、响应时间、错误率、资源利用率等)可以用来衡量系统是否“健康”,以及这些指标的“正常范围”是多少。
  2. 多样化真实世界的故障(Vary Real-World Events):注入的故障必须是“真实世界中可能发生的”——而不是“人为编造的、永远不会出现的”。
  3. 在生产环境中运行实验(Run Experiments in Production):因为“生产环境是唯一的真实环境”——测试环境、仿真环境无论怎么模拟,都不可能完全复制生产环境的复杂性(比如流量的随机性、硬件的老化程度、第三方服务的不稳定性等)。当然,如果你刚接触混沌工程,或者你的系统非常重要、不能容忍任何实验风险,你可以先在灰度环境、封闭测试场、仿真环境中运行实验。
  4. 自动化实验以持续运行(Automate Experiments to Run Continuously):手动运行混沌工程实验是不可持续的——你必须把实验自动化,并把它集成到你的CI/CD流水线中,让它在每次代码部署后自动运行,或者每周/每月定期自动运行。
  5. 最小化爆炸半径(Minimize Blast Radius):在生产环境中运行混沌工程实验时,你必须严格控制“爆炸半径”——也就是实验可能影响的用户数量、服务范围、数据量等。你可以通过灰度发布(比如只把1%的用户流量导入到实验组)、流量隔离(比如专门为实验创建一个独立的测试命名空间)等方式来最小化爆炸半径。
1.2.3 为什么传统软件的Chaos测试不能直接套给Agent用?

很多软件工程师、SRE、QA测试工程师可能会问:

“传统的单体应用、微服务架构的Chaos测试我们已经做过很多次了——比如用Chaos Monkey杀掉某个微服务的容器,用Chaos Mesh注入网络延迟/丢包/分区,用Gremlin注入CPU/内存/磁盘IO故障,来验证系统的弹性。那这些工具和方法,不能直接套给Agent用吗?”

答案是:不能!完全不能! 因为Agent和传统软件有着本质的区别——我们可以从以下5个核心维度来对比:

对比维度 传统软件(单体/微服务) AI Agent(LLM驱动+工具调用)
控制流的确定性 完全确定!给定相同的输入,传统软件一定会产生相同的输出(除非有随机数生成器,但随机数种子也是可控的)。 完全不确定! 因为LLM的输出是概率性的(Probabilistic)——即使给定完全相同的输入、完全相同的工具调用结果、完全相同的上下文,LLM每次的输出也可能不一样(除非你把temperature参数设置为0,但即使是temperature=0,某些LLM(比如GPT-4 Turbo)也可能因为内部优化或负载均衡的原因,产生轻微不同的输出)。
异常处理的方式 显式、硬编码、可枚举的! 传统软件的异常处理逻辑是开发者提前写好的——比如用try-except(Python)、try-catch(Java)块捕获异常,用if-else语句判断返回值,用switch-case语句处理不同的错误码。开发者可以提前枚举所有可能的异常情况(或者至少是大部分常见的异常情况)。 隐式、LLM推理驱动、不可枚举的! Agent的异常处理逻辑主要由LLM的推理能力决定——虽然开发者可以用LangChain、LlamaIndex等框架的ToolErrorHandler类硬编码一些常见的异常处理规则(比如超时重试3次、404错误切换工具、500错误直接返回“系统维护中”),但对于不可枚举的、非常见的工具故障(比如工具返回的JSON格式完全错误、工具返回的数据包含恶意代码、工具返回的数据是完全不相关的内容),开发者不可能提前写好所有的异常处理规则——只能依赖LLM的推理能力来“随机应变”。
任务执行的流程 线性、结构化、可预测的! 传统软件的任务执行流程是开发者提前设计好的——比如用流程图、状态机、工作流引擎(比如Airflow、Temporal)来定义任务的步骤、顺序、依赖关系。 非线性、非结构化、不可预测的! Agent的任务执行流程主要由LLM的规划能力决定——虽然开发者可以用LangChain的AgentExecutorPlan-and-Execute Agent类定义一些基本的规划规则(比如先规划步骤再执行、执行完一个步骤再规划下一个步骤),但对于复杂的、多步骤的、有动态依赖关系的任务(比如“帮我订一张明天从北京到上海的最便宜的机票,同时订一个离浦东机场最近的、评分在4.5分以上的、可以免费取消的酒店,还要查一下明天上海的天气,如果下雨的话,帮我买一把伞”),Agent的执行流程可能每次都不一样——比如它可能先查机票,再查酒店,再查天气,再买伞;也可能先查天气,再查机票,再查酒店,再买伞;甚至可能因为查不到最便宜的机票,直接取消整个任务,或者推荐用户换一个日期。
工具依赖的关系 显式、可枚举、静态的! 传统软件的工具依赖关系是开发者提前定义好的——比如用requirements.txt(Python)、pom.xml(Java)、package.json(JavaScript)文件列出所有的依赖库,用服务发现(比如Consul、Eureka)、API网关(比如Kong、Nginx Plus)定义所有的外部API依赖。这些依赖关系通常是静态的——除非开发者手动修改代码或配置文件,否则不会改变。 隐式、不可枚举、动态的! Agent的工具依赖关系主要由LLM的规划能力和工具选择能力决定——虽然开发者可以用LangChain、LlamaIndex等框架的Tool类显式地给Agent提供一些工具,但对于某些复杂的Agent(比如可以自动搜索GitHub、自动安装依赖库、自动调用第三方API的Agent),它的工具依赖关系可能是动态的——也就是它可以在执行任务的过程中,自动添加新的工具。而且,LLM在选择工具时,可能会选择开发者没有预想到的工具组合(比如用公开免费的天气API + 公开免费的电商API + 开发者提供的支付API,来完成“查天气→买伞→支付”的任务)。

正是因为这5个本质的区别,传统软件的Chaos测试工具和方法,完全不能直接套给Agent用——我们需要一套专门针对AI Agent(尤其是LLM驱动+工具调用的Agent)的Chaos测试框架、工具和方法


1.3 亮明观点/文章目标:本文将带你从零开始,构建一套专门给Agent用的Chaos测试系统

本文的核心观点
  1. AI Agent的“手”(工具调用接口)是其最大的单点故障源(Single Point of Failure, SPOF)——因为Agent如果没有工具,就无法完成任何实际的任务;而且,Agent对工具的依赖是隐式、不可枚举、动态的,这使得工具故障的风险大大增加。
  2. 传统软件的Chaos测试不能直接套给Agent用——因为Agent的控制流是概率性的、异常处理是LLM推理驱动的、任务执行流程是非结构化的、工具依赖关系是动态的。
  3. 给Agent做Chaos测试,必须重点关注以下3个核心问题
    • 问题1:如何主动、可控、可复现地向Agent调用的工具中注入故障?(工具故障注入层)
    • 问题2:如何验证Agent在遇到工具故障时的容错能力、回滚机制和本地安全兜底逻辑?(Agent行为验证层)
    • 问题3:如何自动化整个Chaos测试流程,并把它集成到CI/CD流水线中?(自动化与CI/CD集成层)
  4. 给Agent做Chaos测试,必须遵循一套专门的“黄金法则”——我们可以在CNCF定义的传统混沌工程5条黄金法则的基础上,结合Agent的特点,扩展出一套针对AI Agent的混沌工程8条黄金法则(本文第三章会详细介绍)。
本文的目标读者

本文的目标读者是:

  1. AI应用开发者:尤其是那些正在开发或已经上线了LLM驱动+工具调用的Agent的开发者——你需要用Chaos测试来验证你的Agent的容错能力和回滚机制。
  2. 软件工程师/架构师:尤其是那些正在设计或已经设计了AI Agent架构的软件工程师/架构师——你需要用Chaos测试来发现你架构中的单点故障源,并优化你的架构。
  3. SRE/DevOps工程师:尤其是那些负责AI Agent的部署、运维、监控的SRE/DevOps工程师——你需要用Chaos测试来验证你的AI Agent系统的弹性,并把它集成到CI/CD流水线中。
  4. QA测试工程师:尤其是那些负责AI Agent的测试的QA测试工程师——你需要用Chaos测试来补充你的传统测试方法(比如单元测试、集成测试、端到端测试),发现传统测试方法无法发现的故障。
本文的主要内容预告

本文将按照以下结构展开:

  1. 第二章:基础知识/背景铺垫:我们将详细介绍Agent容错与回滚的核心概念、工具故障的常见类型、传统混沌工程工具的局限性、以及当前市面上针对AI Agent的Chaos测试工具的现状。
  2. 第三章:针对AI Agent的混沌工程8条黄金法则:我们将在CNCF定义的传统混沌工程5条黄金法则的基础上,结合Agent的特点,扩展出一套专门针对AI Agent的混沌工程8条黄金法则。
  3. 第四章:专门给Agent用的Chaos测试系统的设计与实现:这是本文的核心章节——我们将从零开始,设计并实现一套完整的、专门给Agent用的Chaos测试系统,包括:
    • 系统架构设计:分为工具故障注入层、Agent行为验证层、自动化与CI/CD集成层3个核心层次。
    • 系统功能设计:包括故障注入配置管理、故障注入执行、Agent行为监控、Agent行为验证、测试报告生成5个核心功能模块。
    • 系统接口设计:包括REST API接口、Webhook接口、CLI接口3种接口类型。
    • 系统核心实现源代码:我们将用Python语言实现所有核心功能模块,并配上详细的代码注释和解释。
  4. 第五章:实战演练:用我们的Chaos测试系统验证“学霸小助手”Agent X的容错与回滚:我们将用第四章实现的Chaos测试系统,对引言中提到的“学霸小助手”Agent X进行实战演练,包括:
    • 环境准备:搭建Agent X的测试环境(包括LLM接口、工具接口、监控系统等)。
    • 稳定状态假设建立:明确Agent X在正常运行时的稳定状态指标和正常范围。
    • 故障注入实验设计:设计5个典型的工具故障注入实验(包括超时、连接失败、返回500、返回404、返回格式错误的JSON)。
    • 故障注入实验执行:执行这5个实验,并记录Agent X的行为。
    • 实验结果分析与优化:分析实验结果,发现Agent X的问题,并优化Agent X的容错与回滚机制。
  5. 第六章:进阶探讨/最佳实践:我们将探讨一些更有价值的深度内容,包括:
    • 常见陷阱与避坑指南:指出新手在给Agent做Chaos测试时容易犯的错误以及如何避免。
    • 性能优化/成本考量:探讨如何让Chaos测试系统更高效、更经济。
    • 最佳实践总结:提供一些专家级的建议和原则。
  6. 第七章:行业发展与未来趋势:我们将探讨AI Agent Chaos测试的问题演变发展历史、当前现状、以及未来发展趋势。
  7. 第八章:结论:我们将总结本文最重要的观点和步骤,展望未来,并给读者留下一个行动号召。

二、基础知识/背景铺垫 (Foundational Concepts)

2.1 核心概念定义

在展开本文的核心内容之前,我们必须先明确以下10个核心概念的定义——这些概念是理解本文所有内容的基础。


2.1.1 AI Agent的核心组件

根据LangChain的官方文档[2],一个典型的LLM驱动+工具调用的Agent通常由以下6个核心组件组成:

核心组件名称 英文名称 核心功能
用户输入接口 User Input Interface 接收用户的输入(比如文本、图像、语音、文件等),并把它转换为LLM可以理解的格式。
大语言模型(大脑) Large Language Model (LLM) 理解用户的意图、规划任务的步骤、选择合适的工具、处理工具调用的结果、生成最终的输出。
工具库 Tool Library 存储Agent可以调用的所有工具——每个工具通常包含工具名称、工具描述、工具参数、工具返回值格式等信息。
工具调用接口 Tool Calling Interface 负责调用工具库中的工具——包括发送工具调用请求、接收工具调用结果、处理工具调用的异常(如果有硬编码的异常处理规则的话)。
上下文管理模块 Context Management Module 负责管理Agent的对话历史、任务执行历史、工具调用历史等上下文信息——这些上下文信息会被传递给LLM,帮助LLM更好地理解用户的意图和任务的执行进度。
最终输出接口 Final Output Interface 把LLM生成的最终输出转换为用户可以理解的格式(比如文本、图像、语音、文件等),并返回给用户。

我们可以用以下Mermaid ER实体关系图来表示这些核心组件之间的关系:

输入

存储输入

传递上下文

查询工具信息

发起工具调用请求

调用外部工具

返回工具调用结果

存储工具调用结果

生成最终输出

返回输出

USER

USER_INPUT_INTERFACE

CONTEXT_MANAGEMENT_MODULE

LLM

TOOL_LIBRARY

TOOL_CALLING_INTERFACE

EXTERNAL_TOOL

FINAL_OUTPUT_INTERFACE

我们还可以用以下Mermaid交互关系图来表示Agent的典型执行流程:

Final Output Interface External Tool Tool Calling Interface Tool Library LLM Context Management Module User Input Interface User Final Output Interface External Tool Tool Calling Interface Tool Library LLM Context Management Module User Input Interface User 发送输入(比如“帮我查今天北京的天气”) 存储用户输入到上下文 传递完整上下文(包括用户输入、对话历史等) 查询可用的天气查询工具 返回天气查询工具的信息(名称、描述、参数、返回值格式等) 发起天气查询工具调用请求(参数:城市=北京) 调用外部天气查询API 返回天气查询结果(比如“北京今天晴,气温15-25℃”) 存储工具调用结果到上下文 传递更新后的完整上下文 生成最终输出(比如“北京今天晴,气温15-25℃,适合外出游玩!”) 返回最终输出

2.1.2 工具故障(Tool Failure)

工具故障是指:Agent调用的外部工具(或内部工具)无法按照预期的方式工作——也就是工具无法返回“正确的、符合格式要求的、在合理时间内的”结果。

根据故障的表现形式,我们可以把工具故障分为以下8种常见类型(这8种类型也是本文第四章实现的Chaos测试系统支持注入的故障类型):

工具故障类型 英文名称 故障描述 真实世界中的发生概率 对Agent的影响程度
调用超时 Timeout 工具调用请求发送后,在预设的超时时间内(比如5秒、10秒)没有收到工具的响应。 ⭐⭐⭐⭐⭐(非常高) ⭐⭐⭐⭐⭐(非常严重)
连接失败 Connection Failure Agent无法与工具建立连接——比如工具的IP地址错误、端口错误、网络分区(Network Partition)、防火墙拦截等。 ⭐⭐⭐⭐(高) ⭐⭐⭐⭐⭐(非常严重)
返回5xx错误码 5xx Error Code 工具返回了5xx系列的HTTP错误码——比如500 Internal Server Error(服务器内部错误)、502 Bad Gateway(网关错误)、503 Service Unavailable(服务不可用)、504 Gateway Timeout(网关超时)等。 ⭐⭐⭐⭐⭐(非常高) ⭐⭐⭐⭐(严重)
返回4xx错误码 4xx Error Code 工具返回了4xx系列的HTTP错误码——比如400 Bad Request(请求参数错误)、401 Unauthorized(未授权)、403 Forbidden(禁止访问)、404 Not Found(资源不存在)、429 Too Many Requests(请求过多/限流)等。 ⭐⭐⭐⭐(高) ⭐⭐⭐(中等)
返回格式错误的结果 Invalid Format Result 工具返回了结果,但结果的格式不符合预期——比如预期返回JSON格式,但实际返回了HTML格式、XML格式、纯文本格式,或者返回的JSON格式有语法错误(比如缺少逗号、引号不匹配、括号不匹配等)。 ⭐⭐⭐(中等) ⭐⭐⭐⭐(严重)
返回错误的结果 Incorrect Result 工具返回了结果,结果的格式也符合预期,但结果的内容是错误的——比如预期返回“北京今天晴,气温15-25℃”,但实际返回了“上海今天雨,气温5-10℃”。 ⭐⭐(低) ⭐⭐⭐⭐⭐(非常严重)
返回恶意的结果 Malicious Result 工具返回了结果,结果的格式也符合预期,但结果的内容包含恶意代码——比如SQL注入代码、XSS跨站脚本攻击代码、远程命令执行(RCE)代码等。 ⭐(极低) ⭐⭐⭐⭐⭐(非常严重)
返回空的结果 Empty Result 工具返回了空的结果——比如返回了空的JSON对象{}、空的JSON数组[]、空的字符串""等。 ⭐⭐⭐(中等) ⭐⭐⭐(中等)

2.1.3 Agent的容错能力(Agent Resilience)

Agent的容错能力是指:Agent在遇到工具故障(或其他类型的故障,比如LLM故障、上下文管理模块故障等)时,能够继续为用户提供“可接受的服务质量”的能力。

根据CNCF对“系统弹性”的定义[4],结合Agent的特点,我们可以从以下5个核心维度来衡量Agent的容错能力:

衡量维度 英文名称 衡量标准
可用性(Availability) Availability Agent在遇到故障时,仍然能够为用户提供服务的时间占总时间的比例——比如99.9%的可用性意味着Agent每年的 downtime 不超过8小时46分钟。
可靠性(Reliability) Reliability Agent在遇到故障时,能够正确地处理故障、不产生错误结果的概率——比如99.99%的可靠性意味着Agent每处理10000个请求,只有1个请求会产生错误结果。
降级能力(Degradation) Graceful Degradation Agent在遇到故障时,能够自动降级到“较低的但仍然可接受的服务质量”的能力——比如知识库搜索接口超时后,Agent能够自动切换到本地小缓存、或者公开免费的通用教育API兜底。
恢复能力(Recovery) Self-Healing / Recovery Agent在遇到故障后,能够自动恢复到“正常的服务质量”的能力——比如知识库搜索接口恢复正常后,Agent能够自动停止使用兜底工具,切换回原来的工具。
无数据丢失(No Data Loss) No Data Loss Agent在遇到故障时,不会丢失任何用户数据、任务执行数据、工具调用数据的能力——比如错题数据库同步接口连接失败后,Agent能够自动把用户的错题数据保存到本地临时文件队列中,等接口恢复正常后,再自动同步到错题数据库中。

2.1.4 Agent的回滚机制(Agent Rollback Mechanism)

Agent的回滚机制是指:Agent在遇到“无法恢复的、严重的”工具故障(或其他类型的故障)时,能够自动回滚到“上一个稳定的状态”的能力——也就是撤销所有已经执行的、可能产生错误结果的操作,恢复到故障发生之前的状态。

根据回滚的触发条件,我们可以把Agent的回滚机制分为以下3种常见类型

回滚机制类型 英文名称 触发条件 示例
显式回滚 Explicit Rollback 开发者硬编码的回滚触发条件——比如某个工具调用返回了500 Internal Server Error,或者某个工具调用的结果内容是错误的。 支付补录重试接口返回了500 Internal Server Error,Agent自动调用预定义的支付中心回滚钩子,撤销用户的支付操作。
隐式回滚 Implicit Rollback LLM推理驱动的回滚触发条件——比如LLM根据上下文信息,判断当前的任务执行流程已经无法继续,或者继续执行会产生更严重的错误,于是主动发起回滚。 订机票接口返回了“机票已售罄”,订酒店接口已经成功预订了酒店,LLM根据上下文信息,判断继续执行任务已经没有意义,于是主动发起回滚,撤销酒店的预订操作。
手动回滚 Manual Rollback 用户或管理员手动发起的回滚触发条件——比如用户发现Agent的操作产生了错误结果,于是主动要求Agent回滚;或者管理员发现Agent的系统出现了严重故障,于是手动触发回滚。 用户发现Agent重复支付了订单,于是主动要求Agent回滚,撤销重复的支付操作。

2.1.5 本地安全兜底逻辑(Local Safety Fallback Logic)

本地安全兜底逻辑是指:Agent在遇到“所有外部工具都故障了、所有通信都中断了、LLM也无法正常工作了”的极端情况时,仍然能够通过预定义的、硬编码的、不需要依赖任何外部资源的本地规则库,保证“人员和货物的安全、系统的安全、数据的安全”的能力。

本地安全兜底逻辑通常用于高风险、高可靠性要求的Agent——比如自动驾驶卡车Agent、医疗诊断Agent、金融交易Agent等。

以下是一些本地安全兜底逻辑的示例

  1. 自动驾驶卡车Agent:如果所有传感器、所有通信工具、所有LLM都故障了,Agent自动通过车载CAN总线直接触发机械备用刹车,减速到0并开启双闪,同时通过车载喇叭发出警报声。
  2. 医疗诊断Agent:如果所有医疗设备接口、所有通信工具、所有LLM都故障了,Agent自动显示预定义的“紧急求助信息”——比如“请立即联系医生!”,同时保存所有已经收集的用户医疗数据到本地加密文件中。
  3. 金融交易Agent:如果所有证券交易所接口、所有通信工具、所有LLM都故障了,Agent自动停止所有交易操作,同时保存所有已经执行的交易数据到本地加密文件中,等系统恢复正常后,再自动同步到证券交易所。

2.1.6 稳定状态假设(Steady-State Hypothesis)

稳定状态假设是CNCF定义的传统混沌工程5条黄金法则的第一条[4]——它是指:在进行混沌工程实验之前,你必须明确系统在正常运行时的“稳定状态”是什么——也就是哪些指标可以用来衡量系统是否“健康”,以及这些指标的“正常范围”是多少。

对于传统软件,稳定状态指标通常包括:

  • 请求成功率:比如HTTP请求的2xx/3xx响应码占总请求数的比例。
  • 响应时间:比如HTTP请求的平均响应时间、P50响应时间、P95响应时间、P99响应时间。
  • 错误率:比如HTTP请求的4xx/5xx响应码占总请求数的比例。
  • 资源利用率:比如CPU利用率、内存利用率、磁盘IO利用率、网络带宽利用率。
  • 吞吐量:比如每秒处理的请求数(QPS)、每秒处理的事务数(TPS)。

对于AI Agent,除了上述传统软件的稳定状态指标之外,我们还需要增加一些专门针对AI Agent的稳定状态指标——我们将在本文第三章详细介绍这些指标。


2.1.7 爆炸半径(Blast Radius)

爆炸半径是CNCF定义的传统混沌工程5条黄金法则的第五条[4]——它是指:混沌工程实验可能影响的用户数量、服务范围、数据量等。

生产环境中进行混沌工程实验时,你必须严格控制爆炸半径——因为如果爆炸半径太大,可能会导致严重的业务损失、用户投诉、甚至法律问题。

以下是一些控制爆炸半径的常用方法

  1. 灰度发布(Canary Release):只把一小部分用户流量(比如1%、5%、10%)导入到实验组——只有实验组的用户会受到混沌工程实验的影响,对照组的用户不会受到任何影响。
  2. 流量隔离(Traffic Isolation):专门为混沌工程实验创建一个独立的测试命名空间、测试集群、测试环境——实验组的流量只在这个独立的测试环境中流动,不会影响生产环境的流量。
  3. 时间窗口控制(Time Window Control):只在业务低峰期(比如凌晨2点到4点)进行混沌工程实验——这样即使实验失败,影响的用户数量也会非常少。
  4. 故障自动终止(Automatic Fault Termination):设置一个“故障终止阈值”——比如实验组的请求成功率下降到90%以下、或者错误率上升到10%以上,混沌工程实验自动终止,同时自动恢复所有注入的故障。

2.1.8 工具故障注入(Tool Fault Injection)

工具故障注入是指:主动、可控、可复现地向Agent调用的工具中注入故障的过程——这是给Agent做Chaos测试的核心环节。

根据故障注入的位置,我们可以把工具故障注入分为以下3种常见类型

故障注入类型 英文名称 故障注入位置 优点 缺点
客户端故障注入 Client-Side Fault Injection 在Agent的工具调用接口(客户端)中注入故障——比如用Python的unittest.mock库模拟工具的返回结果、用tenacity库的retry装饰器模拟超时、连接失败等。 1. 实现简单,不需要修改工具的代码或配置;
2. 控制粒度细,可以精确控制每个工具调用的故障类型、故障时间、故障概率等。
1. 只能模拟客户端侧的故障,无法模拟服务器侧的故障(比如工具的服务器内部错误、数据库连接超时等);
2. 如果用模拟的方式,无法完全复制真实世界中的故障场景。
代理层故障注入 Proxy-Side Fault Injection 在Agent和工具之间插入一个代理层(比如Nginx、Envoy、Chaos Mesh的HTTPChaos/TCPChaos),在代理层中注入故障。 1. 不需要修改Agent的代码或配置,也不需要修改工具的代码或配置;
2. 可以同时模拟客户端侧和服务器侧的故障;
3. 控制粒度细,可以精确控制每个请求的故障类型、故障时间、故障概率等。
1. 需要部署和维护一个额外的代理层,增加了系统的复杂性和运维成本;
2. 如果代理层本身故障了,可能会影响整个系统的正常运行。
服务器侧故障注入 Server-Side Fault Injection 在工具的服务器侧注入故障——比如用Chaos Monkey杀掉工具的容器、用Gremlin注入CPU/内存/磁盘IO故障、用数据库的故障注入工具(比如pgFaultInjector)注入数据库连接超时、SQL语法错误等。 1. 可以完全复制真实世界中的服务器侧故障场景;
2. 不需要修改Agent的代码或配置。
1. 需要修改工具的代码或配置,或者需要在工具的服务器侧部署额外的故障注入工具;
2. 控制粒度相对较粗,通常只能控制整个工具实例的故障类型、故障时间、故障概率等,无法精确控制每个请求的故障。

在实际应用中,我们通常会结合使用这3种故障注入类型——比如用代理层故障注入模拟网络延迟、丢包、分区等常见的网络故障,用服务器侧故障注入模拟工具的服务器内部错误、数据库连接超时等服务器侧故障,用客户端故障注入模拟工具返回格式错误的结果、返回错误的结果、返回恶意的结果等客户端侧可以模拟的故障。


2.1.9 Agent行为监控(Agent Behavior Monitoring)

Agent行为监控是指:在进行混沌工程实验的过程中,实时监控Agent的行为——也就是监控Agent的对话历史、任务执行历史、工具调用历史、LLM的输出、Agent的最终输出等信息。

Agent行为监控是验证Agent容错能力和回滚机制的前提——因为如果我们不监控Agent的行为,我们就无法知道Agent在遇到工具故障时做了什么、是否正确地处理了故障、是否触发了回滚机制、是否为用户提供了可接受的服务质量。

对于传统软件,我们通常用Prometheus + Grafana来监控系统的指标,用ELK Stack(Elasticsearch + Logstash + Kibana)或Loki Stack(Loki + Promtail + Grafana)来监控系统的日志。

对于AI Agent,除了上述传统软件的监控工具之外,我们还需要一些专门针对AI Agent的行为监控工具——比如LangSmith(OpenAI/LangChain官方推出的AI应用开发平台,包含Agent行为监控、调试、测试、评估等功能)、Weights & Biases(W&B,一个机器学习实验跟踪和模型评估平台,也支持AI Agent的行为监控和评估)、Helicone(一个专门针对LLM应用的监控和分析平台,也支持Agent的工具调用监控)等。


2.1.10 Agent行为验证(Agent Behavior Validation)

Agent行为验证是指:在进行混沌工程实验的过程中或之后,根据稳定状态假设和Agent的预期行为,验证Agent在遇到工具故障时的行为是否符合预期——也就是验证Agent是否正确地处理了故障、是否触发了回滚机制、是否为用户提供了可接受的服务质量、是否没有丢失任何数据、是否没有产生任何错误结果。

Agent行为验证是给Agent做Chaos测试的最终目的——因为如果我们不验证Agent的行为,我们就无法知道我们的Chaos测试是否有意义、是否发现了Agent的问题、是否需要优化Agent的容错与回滚机制。

根据验证的方式,我们可以把Agent行为验证分为以下3种常见类型

验证方式 英文名称 验证方法 优点 缺点
自动化验证 Automated Validation 用预定义的、硬编码的验证规则(比如“如果工具调用超时,Agent必须重试3次”、“如果工具调用返回500,Agent必须切换到兜底工具”、“如果工具调用返回格式错误的JSON,Agent必须向用户返回‘系统暂时无法处理您的请求,请稍后重试’”)自动验证Agent的行为。 1. 验证速度快,可以在短时间内验证大量的实验;
2. 验证结果客观,不受人为因素的影响;
3. 可以集成到CI/CD流水线中,实现持续验证。
1. 只能验证预定义的、可枚举的行为,无法验证不可枚举的、非常见的行为;
2. 验证规则的编写需要开发者对Agent的预期行为有非常清晰的认识;
3. 无法验证Agent的输出内容的“语义正确性”(比如Agent返回的天气信息是否正确、Agent返回的课程推荐是否符合用户的需求等)。
半自动化验证 Semi-Automated Validation 先用预定义的、硬编码的验证规则自动验证Agent的行为,然后再由人工验证自动化验证无法验证的行为(比如Agent的输出内容的语义正确性、Agent的LLM推理过程是否合理等)。 1. 结合了自动化验证和人工验证的优点;
2. 可以验证大部分常见的行为,也可以验证不可枚举的、非常见的行为;
3. 验证结果既客观又全面。
1. 验证速度相对较慢,需要人工参与;
2. 验证成本相对较高,需要投入一定的人力;
3. 验证结果可能会受到人为因素的影响。
人工验证 Manual Validation 完全由人工验证Agent的行为——也就是人工查看Agent的对话历史、任务执行历史、工具调用历史、LLM的输出、Agent的最终输出等信息,判断Agent的行为是否符合预期。 1. 可以验证任何行为,包括不可枚举的、非常见的行为;
2. 可以验证Agent的输出内容的语义正确性;
3. 可以发现自动化验证和半自动化验证无法发现的问题。
1. 验证速度非常慢,无法在短时间内验证大量的实验;
2. 验证成本非常高,需要投入大量的人力;
3. 验证结果非常主观,受人为因素的影响很大;
4. 无法集成到CI/CD流水线中,实现持续验证。

在实际应用中,我们通常会优先使用自动化验证,然后再用半自动化验证补充自动化验证无法验证的行为,最后再用人工验证验证半自动化验证无法验证的行为或者发现的严重问题。


2.2 相关工具/技术概览

2.2.1 传统混沌工程工具概览

当前市面上有很多成熟的、开源的或商业的传统混沌工程工具——我们可以用这些工具来注入网络故障、服务器侧故障等,但如本文1.2.3节所述,这些工具不能直接套给Agent用,只能作为给Agent做Chaos测试的“辅助工具”。

以下是一些最常用的传统混沌工程工具的对比

工具名称 开源/商业 开发语言 主要功能 适用场景 优点 缺点
Chaos Monkey 开源 Go 1. 随机杀掉AWS EC2实例、Kubernetes Pod等;
2. 支持自定义杀掉策略(比如只杀掉某个命名空间的Pod、只杀掉带有某个标签的Pod等)。
验证系统的“自我修复能力”——比如Kubernetes的Deployment控制器是否会自动重启被杀掉的Pod。 1. 开源免费,使用简单;
2. 是混沌工程的“鼻祖”,社区非常活跃;
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐