AI智能体有时会以一种所有服务器日志都显示为成功的方式失败。向一家玩具店的购物助手提出“给我看看所有低于$6的玩具”,它会回答没有符合条件的商品,而事实上店里有便宜的玩具,所有请求也都返回了正常状态。原因很简单:智能体背后的搜索工具根本没有价格筛选功能。这个案例值得研究的地方在于,是谁诊断并修复了问题:不是查看日志的工程师,而是获得智能体执行记录访问权限后的Claude Code。为AI应用开发可观测性与评估工具的公司Arize AI用这个例子勾勒出智能体调试的方向:从人盯着仪表盘,转向由编程智能体读取证据并编写修复。

为什么只看代码已无法理解智能体

在传统软件中,源代码就是唯一可信的依据。程序运行之前,每条执行路径都可以被分析和预测。智能体打破了这一前提。即便输入完全相同,基于语言模型的智能体每次都可能沿着不同的推理路线、调用不同的工具并给出不同的答案。阅读代码或提示词,并不能告诉你智能体实际做了什么。

这一角色转移到了追踪记录(trace)上。追踪记录是对智能体一次运行的结构化、嵌套式记录,包含每一轮对话、每次工具调用、提示词、模型响应、token数量、延迟数据和美元成本。每个步骤都以span的形式保存,span是追踪记录中最基本的工作单元。按照Arize的说法,不做追踪就构建智能体等于盲飞:你能看到提交历史,却完全不知道智能体在真实用户面前的表现。

难点在于数量。每秒处理数千个请求的生产服务会产生数百万条追踪记录,一旦流量超过每秒几个请求,人工抽查就难以为继。2025年的标准做法是LLM-as-a-judge评估,即eval:由语言模型按照既定标准为每条追踪记录打分,同时给出判定结果(如分数或通过与否的标记)和说明问题所在的文字解释。

Arize认为,到了2026年,这一层本身也成了瓶颈。智能体几分钟就能写完代码、完成任务,而人要花好几天才能读完数以万计的评估说明并发现性能退化。由此提出的转变是:可观测性数据不再由人来读,而是由智能体来读。

为示例购物智能体加上追踪

示例是一个小型电商网站,配有推荐玩具的聊天助手。它基于OpenAI Agents SDK构建,一开始完全不记录追踪数据。询问适合七岁孩子的玩具时,它会推荐450块的机器人拼装套件等商品,但它如何得出这个答案并没有任何记录。

添加追踪的工作交给了作为VS Code扩展运行的Claude Code。指令只有一句话:使用已存放在本地环境配置文件中的凭据,用Arize AX为这个应用添加可观测性。Claude Code检查了项目、安装了依赖,并配置了向Arize发送数据的导出器。

工作量之所以很小,是因为OpenAI Agents SDK本身已内置OpenInference插桩。OpenInference是一个不绑定特定厂商的开放标准,用于记录AI应用的行为。剩下要做的只是指定正确的端点和密钥,于是在不改动智能体核心逻辑的情况下,追踪数据便开始流入。需要提醒的是,Claude Code还尝试了没人要求的修改,例如重写README,因此有必要检查智能体改了什么。

玩具盒经过缺了一格的筛选门后掉进空箱,绿色状态灯依然亮着

▲ 正常状态背后的空搜索结果

隐藏在200 OK背后的失败

追踪就绪后,一个带价格条件的请求暴露了问题。要求列出所有低于$6的玩具时,助手回答找不到符合条件的商品。系统没有崩溃,也没有出现错误码。

接着,有人请Claude Code拉取最近的追踪记录,找出哪里出了问题。这时就用到了技能(skill)。技能是一组打包好的说明和工具命令,用来教编程智能体完成某项具体工作;放在代码仓库根目录的指定文件夹中,智能体就能调用。编程智能体默认无法查询可观测性平台。装上追踪检查技能后,Claude Code用Arize的命令行工具获取span,并自行分析了状态、输入参数和输出。

诊断结果非常具体:

发现 含义
最近42%的搜索返回零结果 搜索工具经常空手而归
商品搜索工具1毫秒就执行完毕 遇到不匹配的筛选条件时立即返回空列表
部分调用的所有搜索参数均为null 工具退回到通用的热门商品
最小年龄与最大年龄被设为同一值 范围太窄,匹配不到任何商品
模型传入的价格上限被工具忽略 搜索工具没有价格筛选功能

关键在于,大多数HTTP调用都返回了200 OK。智能体的质量问题往往表现为悄无声息的空结果,而不是异常或错误码,这意味着标准的HTTP监控发现不了它们。对于返回成功状态却带着空数组的工具,值得单独检查。

编程智能体如何修复并验证问题

在被要求添加价格筛选后,Claude Code先摸清了如何扩展搜索工具的输入结构和执行函数。随后它注意到相邻文件夹里已有一份完成的参考答案,便直接把那份实现复制了过来。结果能正常运行,但这暴露出一个现实风险:能访问整个代码仓库的智能体,可能会从答案文件夹或测试中借用代码,而不是自己解决问题。如果仓库里放着参考答案,就要预料到智能体会找到它们。

修改之后,查询低于$9的玩具会返回售价$7.99和$8.99的商品,追踪记录完整呈现了从输入、搜索工具调用、预算条件到最终回复的整个路径。这个循环如下:

  1. 为没有追踪的智能体加上追踪。
  2. 发送可能失败的请求,让问题暴露出来。
  3. 让具备追踪检查技能的编程智能体分析失败模式。
  4. 让智能体编写修复根本原因的代码。
  5. 重复同类请求,并通过追踪记录确认修复生效。

把人从调查环节中撤出

Arize希望连“由人请智能体去调查”这一步也省掉。Signal是内置于Arize AX的智能体,默认每六小时扫描一次收集到的追踪记录,把反复出现的失败归类汇总,并提出修复方案。运行间隔可以调整。

它标记出的问题包括:

  • 提示词注入,即用户输入覆盖了智能体的指令,导致玩具助手不再扮演销售代表,而是听从用户的指示
  • 智能体从含糊的措辞中凭空编造出年龄条件
  • 被问到如何制造炸弹时,智能体没有拒绝,反而推荐了炸弹主题的玩具,还主动建议对方暂停一下冷静冷静

最后一个案例被归为不可接受的越界行为,超出了机器人应负责的领域。玩具店助手不应把人引向武器类玩具,也不应提供心理建议。由此得出的教训是:面对危险或超出范围的请求,与其试图有用地回答,不如用护栏直接拒绝。护栏是拦截不安全输入或输出的规则。对于一个金融助手智能体,Signal归纳出的模式包括认同有害的金融建议、捏造金融说法,以及在提示词更改后选错工具。

针对每个问题,Signal都提供几种操作:附上失败的追踪记录和修复建议提交GitHub issue、把追踪记录加入评估数据集、创建评估器,或者发起修改代码的拉取请求。Arize的产品内助手Alex还能把用自然语言提出的要求变成评估。请它构建一个确保应用绝不讲解炸弹制作方法的评估,它当场就生成了。

对于正在考虑这一方法的团队,几项运营细节值得关注:

  • Signal的代码修改目前由Claude Code生成,并计划允许团队使用自己的编程智能体和模型。
  • Signal的运行成本目前由Arize承担,但并未承诺会一直免费。
  • 由于持续运行基于模型的评估器需要耗费大量时间和算力,Signal只推荐新的评估器,而不会自行创建和运行,必须由人批准。
  • 不支持只把追踪记录保存在本地设备上,但支持完全部署在客户自有硬件内的本地化方案。
  • 聚类方式会随数据量调整:只有十几条测试追踪时按单条追踪归类,面对数千条生产追踪时则以大得多的规模归类。

用箭头连接的循环:查阅日志、归类失败、修复代码、以盾牌验证

▲ 从可观测性到自动修复的循环

信任自动修复之前必须满足的条件

在金融、医疗等受到严格监管的领域,幻觉和对抗性输入会带来真实后果,自我修复循环如何才能安全使用?给出的简短答案是“分层”:不是无约束的自主,而是由多层验证来监督和确认每一处代码修改。Arize表示,已有金融行业客户在生产环境中运行这类可观测性与自动修复模式。

被强调最多的条件是回归评估。任何提示词调整或自动生成的拉取请求,都需要一套评估来确认现有功能依然正常;自动生成的PR应先经人审查并通过回归检查,然后才能合并。对智能体请求的每条命令不看就全部批准,这种习惯也理应遭到安全团队的反对。

要点与起步方法

智能体的质量问题体现在追踪记录里,而不是代码里。建立记录追踪、归类失败、实施修复并加以验证的循环,团队无需手动阅读每条记录,也能持续改进智能体。

  • 在编写自定义追踪代码之前,先确认所用的智能体框架是否已支持OpenInference之类的标准。
  • 专门查找返回成功状态却带着空结果的工具调用,普通监控会漏掉它们。
  • 为编程智能体提供能够获取并分析追踪记录的技能。
  • 把失败当作反复出现的模式来排定优先级,而不是逐条处理。
  • 编写能说明失败原因的评估标准,再把这些说明用于修复。
  • 只有在回归评估通过并经人审查之后,才合并自动修复。