第十三篇:《AI Agent 可观测性与评估:追踪、调试与质量衡量》

发布时间:2026/10/22 23:02:09

第十三篇:《AI Agent 可观测性与评估:追踪、调试与质量衡量》 在上一篇文章中我们为 Agent 装上了安全护栏——输入净化、身份隔离、工具权限和输出过滤。但安全护栏只能“拦住”已知的威胁真正要回答“Agent 为什么失败”以及“它到底变好了还是变坏了”需要的是可观测性与评估。传统 APM 追踪的是确定性代码路径——同样的输入可靠地产生同样的输出。但 LLM 系统打破了这一假设同样的提示词产生不同的输出你无法在没有捕获精确输入、模型参数和温度的情况下复现问题延迟和成本与 Token 数量相关而非请求数量一个“慢”请求可能消耗 10 倍的预算一个 Agent 处理一次用户请求可能发出 5 次 LLM 调用、3 次工具调用和 2 次向量数据库查询每一个都是潜在的故障点而单一的错误指标无法告诉你哪一步失败了。 本文从传统 APM 的局限讲起深入讲解 OpenTelemetry GenAI 语义约定、Agent 评估的四支柱框架以及 LangSmith Engine 如何把“追踪→诊断→修复”的循环自动化。一、传统 APM 为什么不够用传统 APM 的信号与 LLM/Agent 系统的信号存在结构性差异数据来源Uptrace2026核心差异传统 APM 告诉你“请求失败了”Agent 可观测性需要告诉你“推理链的哪一步、因为什么原因、导致了什么结果”。一个真实的 Agent 栈中单次用户请求现在会产生 10 到 50 个 span跨越 LLM 调用、检索查询、工具调用、护栏检查和子 Agent 分发。二、OpenTelemetry GenAI 语义约定让 Agent 用“同一种语言”说话OpenTelemetry 的 GenAI 语义约定为 LLM 和 Agent 定义了标准化的 gen_ai.* 属性。对于 Agent每一次工具调用、LLM 调用和检索步骤都成为一个子 span产生推理链的完整追踪。2.1 三个起步必备属性Agent Timeline 将多个 trace、多个 Agent 归并到一个对话视图中。要让这一点工作执行链中的每一个 span 都必须携带三个属性一个容易被忽视的关键点“GenAI span”不只是一次 LLM 调用。它是 Agent 触发的执行链上的任何 span包括下游数据库查询、第三方 API 调用、或因为 Agent 决定调用工具而运行的后台任务。如果一个 span 因为 Agent 做了某件事而存在它就应该携带 conversation.id。这就是 Timeline 能端到端工作的原因。2.2 Span 设计每个有意义的操作一个 span最佳实践一个 span 对应一个有意义的操作。一个真实的 Agent 栈中单次请求产生 10-50 个 span 是正常的但如果没有父子结构追踪就是一堆扁平、不可搜索的 span。工具调用的 span 设计工具调用是大多数 Agent 故障的高发区withtracer.start_as_current_span(fexecute_tool{tool_name})asspan:span.set_attribute(gen_ai.conversation.id,conversation_id)span.set_attribute(gen_ai.agent.name,support_agent)span.set_attribute(gen_ai.operation.name,execute_tool)span.set_attribute(gen_ai.tool.name,tool_name)span.set_attribute(gen_ai.tool.call.id,tool_call_id)span.set_attribute(gen_ai.tool.call.arguments,json.dumps(args))try:resultexecute(tool_name,args)span.set_attribute(gen_ai.tool.call.result,json.dumps(result))span.set_attribute(gen_ai.response.finish_reasons,json.dumps([stop]))returnresultexceptExceptionase:span.set_attribute(error.type,type(e).__name__)span.set_status(Status(StatusCode.ERROR,str(e)))raise关键细节工具失败时设置 error.type 并把错误状态传播到父 span。Timeline 的“只看失败”模式和对话级失败计数都依赖于此。2.3 LLM 调用的 Span 设计withtracer.start_as_current_span(chat gpt-4o)asspan:span.set_attribute(gen_ai.conversation.id,conversation_id)span.set_attribute(gen_ai.agent.name,support_agent)span.set_attribute(gen_ai.operation.name,chat)span.set_attribute(gen_ai.request.model,gpt-4o)resultllm.invoke(...)span.set_attribute(gen_ai.response.model,result.model)# 实际使用的版本span.set_attribute(gen_ai.usage.input_tokens,result.usage.input_tokens)span.set_attribute(gen_ai.usage.output_tokens,result.usage.output_tokens)# 缓存 token 也必须记录否则成本仪表盘会低估span.set_attribute(gen_ai.usage.cache_read.input_tokens,result.usage.cache_read)为什么 request.model 和 response.model 都要记录 你请求的是 gpt-4o实际得到的可能是 gpt-4o-2024-08-06 这样的带日期版本。捕获两者才能在提供商静默升级模型后调试行为变化。三、Agent 评估超越“任务完成率”任务完成率是二元的——完成或未完成。但 Agent 的非确定性引入了执行过程中的行为不确定性这是二元指标无法捕获的。一项 2026 年的研究提出了一个端到端的 Agent 评估框架包含四个评估支柱LLM、Memory、Tools、Environment。3.1 四支柱与关键指标数据来源Akshathala et al.ACM 2026这个框架的价值它把评估从“只看结果”推进到“看过程”。一个 Agent 可能“完成了任务”但它在过程中选错了工具、参数传错了、或者在错误发生后没有正确恢复——这些偏差在纯任务完成率指标下是隐形的。3.2 评估的三种模式该框架整合了静态、动态和 Judge 评估三种模式以捕获超越任务成功率的行为失败静态评估检查输出是否符合预定义的 Schema、格式、安全策略。动态评估在执行过程中监控行为工具选择、参数映射、错误恢复。Judge 评估用 LLM-as-Judge 对开放式输出进行质量评分。四、LangSmith Engine把“追踪→诊断→修复”自动化可观测性让你看到问题评估让你衡量问题但传统流程中“读 trace → 找模式 → 写评估 → 创建修复”仍然是一个手工循环。LangSmith Engine2026 年 5 月进入公开测试的目标是自动化这个循环。4.1 Engine 的自动化闭环Engine 是一个运行在 LangSmith 内部的 Agent它执行以下循环监视生产 trace持续分析你的生产追踪数据。将失败聚类为命名问题不是给你一堆散落的错误而是把相似失败归并为“命名 Issue”。针对代码库诊断根因读取你的源代码定位问题发生在哪一行、哪个工具描述、哪段提示词。提出修复 PR生成针对性的代码或提示词修复。创建在线评估器为这个具体问题生成一个自定义的在线评估器让复发问题自动重新浮出水面。将失败 trace 加入离线评估集作为 ground truth 示例防止回归。你只需要 review 和 merge而不是自己 hunting for problems。4.2 Engine 背后的基础设施SmithDBAgent trace 的体量和形态——深度嵌套的 span、长时间运行的操作、分片到达的事件——对传统数据库是严峻挑战。LangSmith 构建了 SmithDB一个专为 Agent 可观测性设计的数据库基于 Rust、Apache DataFusion 和 Vortex使用对象存储作为持久化层。关键性能数据核心 LangSmith 体验最高快 15 倍P50 trace 树加载 92msP50 单次运行加载 71ms。它是无状态的、对象存储后端的因此自托管和多云部署比传统数据库集群容易得多。五、实战为 LangGraph Agent 接入 OTel GenAI 追踪与评估以下代码展示如何在 LangGraph 节点中注入标准化的 GenAI span 属性并将评估分数附加到 span 上。fromopentelemetryimporttracefromopentelemetry.traceimportStatus,StatusCode tracertrace.get_tracer(customer-agent)definstrumented_agent_node(state:dict)-dict:conversation_idstate[conversation_id]withtracer.start_as_current_span(invoke_agent customer_service)asspan:span.set_attribute(gen_ai.conversation.id,conversation_id)span.set_attribute(gen_ai.agent.name,customer_service)span.set_attribute(gen_ai.operation.name,invoke_agent)# 路由决策对应 LLM 支柱的“指令遵循”评估categoryclassify_query(state[query])span.set_attribute(agent.routing.category,category)# 工具调用对应 Tools 支柱ifcategoryorder:withtracer.start_as_current_span(execute_tool check_order)astool_span:tool_span.set_attribute(gen_ai.conversation.id,conversation_id)tool_span.set_attribute(gen_ai.agent.name,customer_service)tool_span.set_attribute(gen_ai.operation.name,execute_tool)tool_span.set_attribute(gen_ai.tool.name,check_order)try:resultcheck_order(state[order_id])tool_span.set_attribute(gen_ai.tool.call.result,str(result))exceptExceptionase:tool_span.set_attribute(error.type,type(e).__name__)tool_span.set_status(Status(StatusCode.ERROR,str(e)))raise# 评估分数附加到 span让漂移检测运行在分数流上eval_scorerun_evaluator(state[query],category)# 0.0-1.0span.set_attribute(agent.eval.routing_accuracy,eval_score)return{response:...,category:category}关键设计conversation.id 在所有 span 中传递形成完整的对话视图。工具失败时设置 error.type 和错误状态让失败可被聚合分析。评估分数直接附加到 span 上——这是让“漂移检测”能够运行在分数流上的关键。没有 span 附着的评估分数只是孤立的数字。六、可观测性与评估的最佳实践清单数据来源FutureAGI2026如果只看一条在每个 LLM span 上标记提示词版本。 没有它生产调试循环在最常见的入口处就是断的。七、小结传统 APM 的局限Agent 是非确定性的、多步骤的、不透明的。传统 APM 追踪确定性代码路径无法回答“推理链的哪一步失败了”。OTel GenAI 语义约定用 gen_ai.* 属性标准化 Agent 追踪。三个起步属性conversation.id、agent.name、operation.name。一个用户请求产生 10-50 个 span。评估四支柱LLM指令遵循、安全、Memory存储、检索、Tools选择、参数、顺序、错误恢复、Environment护栏、授权。LangSmith Engine自动化“监视 trace → 聚类失败 → 诊断根因 → 提出修复 PR → 创建在线评估器”的闭环。SmithDB 为 Agent trace 提供 15 倍加速和 92ms P50 树加载。关键实践工具失败必须设置 error.type评估分数必须附着到 span提示词版本必须标记在每个 LLM span 上。
延伸阅读

更多相关文章

2026/10/22 23:02:09

当 Agent 学会出价:市场机制 MPT 如何取代中央编排器

当 Agent 学会出价:市场机制 MPT 如何取代中央编排器 TL;DR 要点现有多智能体系统的编排器(LangGraph 的图、AutoGen 的对话轮转)都是人工设计的固定结构——个体能力训练和集体组织方式是两个割裂的问题。MPT(Market-based Post-…

2026/10/22 22:57:08

计网学习笔记-VLAN

摘要 本文系统介绍了 VLAN(虚拟局域网)的原理与配置方法。首先阐述了 VLAN 产生的背景,即交换机只能隔离冲突域而无法隔离广播域,导致广播流量泛滥的问题;随后详细讲解了 VLAN 的作用、好处、帧格式(802.1…

2026/10/22 22:57:08

微信客服机器人自动回复语录怎么归类?按场景分组的整理法

微信客服机器人自动回复语录怎么归类?按场景分组的整理法 接手过一个语料库:三百多条语录,看着很全,线上命中得一塌糊涂——同一个问题被三条规则抢,用户拿到一段和他订单无关的话术。后来发现问题不在话术写得够不够漂…

2026/10/23 0:02:26

Rust正成为AI基础设施的底层新标准

1. 项目概述:这不是技术风向标,而是基建层的静默迁移“3个信号:AI基建正在转向Rust”——这句话最近在多个技术社区高频出现,但很多人读完标题只留下模糊印象:哦,Rust又火了?AI圈开始用Rust了&a…

2026/10/23 0:02:26

Rust为何成为AI基础设施的确定性选择

1. 这不是技术风潮,是基建层的静默迁移最近在几个核心开源项目的更新日志里反复看到同一个现象:原本用Go写的CLI工具,新版本悄悄换成了Rust;某知名云原生中间件的v2.0架构图里,底层数据平面模块标注着“Rust重写中”&a…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/22 23:57:26

SQL注入原理与防御实战:从数据库安全到参数化查询的完整指南

1. SQL注入到底是什么:从一道“不该通过”的登录说起聊SQL注入之前,先讲一个我早年做项目时遇到的真实案例。某公司内部系统上线没多久,运维反馈后台登录接口响应偶尔很慢,偶尔又很快,而且数据库负载波动明显。一开始怀…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑