SmaugBrain
← 返回新闻
news 焦点文章

AI Agent 可观测性:生产环境的监控、日志与链路追踪

2026年9月7日 smaugbrain 6 分钟阅读 WordPress 文章

AI Agent 可观测性:生产环境的监控、日志与链路追踪

引言

当 AI Agent 在生产环境出问题时,第一个问题总是相同的:**发生了什么?**与传统软件不同——传统软件你可以读取栈跟踪和日志——AI Agent 引入了新的复杂性层级:非确定性模型输出、工具调用失败、记忆状态漂移,以及可能在任何环节断裂的多步推理链。

可观测性不仅仅是为了更快地修复 bug。它是信任的基础。能够洞察 Agent 决策过程的团队可以自信地部署;而无法洞察的团队会花数小时调试”它为什么会这样做?”这类问题,而不是构建新功能。

本指南涵盖 AI Agent 可观测性的三大支柱——日志、指标和链路追踪——以及你今天就可以使用的实用实现模式。

为什么 AI Agent 需要不同的可观测性

传统应用日志关注请求流程和数据库查询。AI Agent 增加了几个新维度:

  • Token 用量与成本跟踪 —— 每次 API 调用都有价格标签
  • 模型输出采样 —— 你需要看到模型实际生成了什么
  • 工具执行追踪 —— 每次工具调用可能成功、失败或返回意外数据
  • 记忆状态快照 —— Agent 上下文在多个轮次间演进
  • 推理链可见性 —— 多步决策需要可审计
  • 如果没有适当的可观测性,你就在盲飞。404 错误很明显;但一次静默幻觉(消耗了 2.50 美元 API 费用并损害了用户信任)则不然。

    AI Agent 可观测性的三大支柱

    AI Agent 可观测性的三大支柱:日志、指标和链路追踪

    1. 结构化日志

    结构化日志是 Agent 活动的机器可读记录。与纯文本日志不同,结构化格式(JSON)让你能够大规模查询、过滤和可视化 Agent 行为。

    AI Agent 的关键日志模式:

  • 请求日志:捕获输入提示、模型名称和 Token 数量
  • 工具执行日志:记录调用了哪些工具、参数是什么、返回了什么
  • 错误日志:记录失败及其上下文——什么触发了它们、前置状态是什么
  • 成本日志:跟踪每个会话、每个用户、每个任务的累计花费
  • {
      "timestamp": "2026-09-07T10:30:00Z",
      "agent_id": "support-agent-01",
      "session_id": "sess_abc123",
      "event": "tool_call",
      "tool": "search_knowledge_base",
      "input": {"query": "return policy"},
      "output_length": 1247,
      "duration_ms": 342,
      "model": "gpt-4o",
      "tokens_used": {"prompt": 856, "completion": 124, "total": 980}
    }

    最佳实践:

  • 在所有日志源中使用一致的字段名称
  • 包含用于跨服务追踪的相关性 ID
  • 绝不记录敏感数据(PII、API 密钥、凭证)
  • 设置适当的日志级别(开发环境用 DEBUG,生产环境用 INFO)
  • 2. 指标与监控

    指标提供高层健康信号。日志告诉你发生了什么,指标告诉你是否正常工作。

    关键 Agent 指标:

    | 指标 | 显示内容 | 告警阈值 |
    |——|———-|———-|
    | 每小时 Token 用量 | 成本趋势 | 超过基线 200% |
    | 工具调用成功率 | 可靠性 | 低于 95% |
    | 响应延迟 P99 | 用户体验 | 交互式 Agent 超过 10s |
    | 按类型分类的错误率 | 失败模式 | 出现任何新错误类型 |
    | 会话时长分布 | 参与质量 | 双峰分布 |
    | 模型回退率 | 基础设施健康 | 回退率超过 10% |

    实现方式:

  • 自定义计数器:在 Agent 代码中为关键事件递增指标
  • OpenTelemetry 集成:导出标准化指标到 Prometheus、Datadog 或类似工具
  • CloudWatch / CloudWatch Logs Insights:适用于 AWS 托管的 Agent
  • 第三方可观测性平台:Langfuse、Phoenix、Arize 或 Weights & Biases 用于 LLM 专用可观测性
  • 3. 分布式链路追踪

    链路追踪跟踪单个请求经过的每一个组件。对于 AI Agent,这意味着跟踪从用户输入到模型推理、工具调用、记忆读取和最终响应的完整旅程。

    AI Agent 的追踪结构:

    “`
    ┌─────────────────────────────────────────────────────────────┐
    │ Span: user_request (总计 100ms) │
    ├─────────────────────────────────────────────────────────────┤
    │ ├─ Span: model_inference (65ms) │
    │ │ ├─ 输入: “我的订单状态是什么?” │
    │ │ ├─ 模型: gpt-4o │
    │ │ └─ 输出: [思考 tokens] → tool_call │
    │ ├─ Span: tool_execution (200ms) │
    │ │ ├─ 工具: order_lookup │
    │ │ ├─ 输入: {order_id: “ORD-123”} │
    │ │ └─ 输出: {status: “已发货”, eta: “2天”} │
    │ └─ Span: model_inference (80ms) │
    │ ├─ 输入: [上下文 + 工具结果] │
    │ └─ 输出: “您的订单已发货…” │
    └─────────────────────────────────────────────────────────────┘
    “`

    Agent 链路追踪工具:

  • OpenTelemetry:厂商中立标准,兼容任何后端
  • Langtrace / Langfuse:专为 LLM 应用设计
  • Phoenix (Arize):高级 LLM 评估与追踪
  • Weights & Biases:具备追踪功能的实验跟踪
  • 实用实现模式

    AI Agent 监控仪表板,显示延迟和成本指标

    模式 1:可观测性包装器

    使用可观测性装饰器包装 Agent 的核心循环,自动捕获:

    from functools import wraps
    import time
    import logging
    
    def with_observability(agent_function):
        @wraps(agent_function)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            session_id = kwargs.get('session_id', generate_id())
            
            log.info({
                "event": "agent_start",
                "session_id": session_id,
                "input": str(kwargs.get('user_input'))[:500]
            })
            
            try:
                result = agent_function(*args, **kwargs)
                
                log.info({
                    "event": "agent_complete",
                    "session_id": session_id,
                    "duration_ms": int((time.time() - start_time) * 1000),
                    "output_length": len(result) if result else 0
                })
                return result
                
            except Exception as e:
                log.error({
                    "event": "agent_error",
                    "session_id": session_id,
                    "error_type": type(e).__name__,
                    "error_message": str(e)[:500]
                })
                raise
        return wrapper

    模式 2:工具调用插桩

    每次工具调用都应该被插桩以捕获:

    def instrumented_tool_call(tool_name, tool_func):
        @wraps(tool_func)
        def wrapper(*args, **kwargs):
            start = time.time()
            logger.info({
                "event": "tool_start",
                "tool": tool_name,
                "args": sanitize_args(args, kwargs)
            })
            
            try:
                result = tool_func(*args, **kwargs)
                duration = time.time() - start
                
                logger.info({
                    "event": "tool_success",
                    "tool": tool_name,
                    "duration_ms": int(duration * 1000),
                    "result_size": len(str(result)) if result else 0
                })
                return result
                
            except Exception as e:
                logger.error({
                    "event": "tool_error",
                    "tool": tool_name,
                    "error": str(e)
                })
                raise
        return wrapper

    模式 3:成本跟踪中间件

    实现中间件以实时跟踪 API 成本:

    class CostTracker:
        def __init__(self):
            self.session_costs = {}
            self.rate_limits = {
                'gpt-4o': {'rpm': 1000, 'tpm': 200000}
            }
        
        def track_usage(self, model, prompt_tokens, completion_tokens):
            session_id = get_current_session()
            cost = calculate_token_cost(model, prompt_tokens, completion_tokens)
            
            if session_id not in self.session_costs:
                self.session_costs[session_id] = {
                    'total_cost': 0,
                    'token_usage': {'prompt': 0, 'completion': 0},
                    'model_counts': {}
                }
            
            self.session_costs[session_id]['total_cost'] += cost
            self.session_costs[session_id]['token_usage']['prompt'] += prompt_tokens
            self.session_costs[session_id]['token_usage']['completion'] += completion_tokens
            
            log_metric('agent_token_cost', cost, {'model': model, 'session': session_id})

    常见可观测性陷阱

    陷阱 1:无过滤地记录一切

    问题:记录完整的提示和响应正文会产生大量数据量,并可能暴露敏感信息。

    解决方案:实施带 sanitization 的选择性日志记录:

  • 默认只记录元数据(Token 数量、时间戳、错误代码)
  • 仅在 DEBUG 级别或特定错误情况下记录完整内容
  • 记录前始终 sanitization PII
  • 陷阱 2:忽视成本指标

    问题:团队专注于功能指标而成本飙升。一个配置错误的 Agent 可以在任何人注意到之前耗尽预算。

    解决方案:在多个层级设置成本告警:

  • 每个会话的成本限制
  • 每小时/每日支出阈值
  • 按模型分类的预算分配
  • 陷阱 3:无基线对比

    问题:没有上下文的指标只是数字。延迟增加 5% 如果没有基准就无法判断是否正常。

    解决方案:在稳定期建立基线并与当前指标对比:

  • 周环比
  • 按时间段归一化
  • 对可预测流量模式进行季节性调整
  • 构建可观测性仪表板

    一个好的可观测性仪表板让你在几秒钟内获得答案,而不是几分钟。以下是应该包含的内容:

    顶部区域:健康概览

  • 过去一小时的总会话数
  • 错误率(当前 vs. 基线)
  • 平均延迟 P50/P95/P99
  • 当前成本率($/小时)
  • 中部区域:详细指标

  • 按模型分类的 Token 用量随时间变化
  • 工具调用成功/失败率
  • 会话时长分布
  • 按类型分类的错误分解
  • 底部区域:实时活动

  • 最近的 Agent 会话(最近 10 个)
  • 带上下文的活跃错误
  • 按会话分类的成本累加器
  • 仪表化工具:

  • Grafana:连接到 Prometheus 或 CloudWatch 创建自定义仪表板
  • Langfuse UI:专为 LLM 可观测性设计
  • Kibana:如果使用 Elasticsearch 存储日志
  • CloudWatch Console:AWS 原生部署
  • 案例研究:将调试时间减少 80%

    一个生产 AI 支持 Agent 存在订单查询失败的反复问题。实施可观测性之前:

  • 调试时间:每次事件 4-6 小时
  • 用户影响:2+ 小时内无法解决工单
  • 成本:估计支持开销 500 美元/小时
  • 实施结构化日志和链路追踪之后:

    1. 15 分钟内识别根本原因:某个特定工具有 12% 的概率返回格式错误的 JSON
    2. 设置了工具失败自动化告警
    3. 创建了会话回放功能以复现问题
    4. 将平均解决时间从 4 小时缩短到 15 分钟

    可观测性投资在第一周就收回了成本。

    常见问题

    问题 1:如何在多个服务间追踪请求?

    使用 OpenTelemetry 分布式链路追踪。在入口点设置 trace ID 并在所有服务调用间传播它。大多数可观测性平台如果在相同标准下被插桩,会自动跨服务关联链路。

    问题 2:小团队的最低可观测性配置是什么?

    从结构化日志(JSON 格式)和基础指标(Token 数量、错误率、延迟)开始。使用 Langfuse 或 Logtail 等托管服务,如果你不想维护基础设施。这能以 20% 的努力获得 80% 的价值。

    问题 3:如何处理日志和链路中的 PII?

    实施 sanitization 层:

  • 检测 PII 模式(邮箱、电话、信用卡等)
  • 哈希或遮蔽检测到的值
  • 异步运行以避免阻塞 Agent 循环
  • 允许根据环境切换 sanitization(生产严格,预发详细)
  • 问题 4:我应该记录完整对话还是仅摘要?

    默认记录摘要(每轮前 500 字符)。仅在以下情况启用完整记录:

  • 标记用于调试的会话
  • 错误情况
  • 高价值交互(如销售转化)
  • 这在可见性和存储成本之间取得平衡。

    问题 5:如何检测 Agent 是否”偏离轨道”?

    实施行为监控:

  • 跟踪工具调用序列以发现异常模式
  • 监控每步 Token 用量(突然 spike 表明循环)
  • 设置语义相似度检查以检测话题漂移
  • 将当前行为与训练基线模式对比
  • 问题 6:监控和可观测性的区别是什么?

    监控告诉你何时出问题(基于阈值告警)。可观测性帮助你理解为何出问题(链路追踪、结构化日志、指标关联)。生产可靠性两者都需要。

    下一步

    可观测性不是一次性设置——它是一种持续实践。从基础开始:

    1. 第 1 周:为所有 Agent 交互实施结构化日志
    2. 第 2 周:添加成本跟踪和基础指标
    3. 第 3 周:为关键路径设置分布式链路追踪
    4. 第 4 周:构建你的第一个仪表板和告警规则
    5. 持续进行:根据事件模式和团队反馈进行优化

    目标不是完美的可观测性——而是当你的 Agent 在凌晨 2 点行为异常时,能够回答”发生了什么?”的能力。

    准备好让你的 Agent 更可靠了吗?访问 [SmaugBrain](https://www.smaugbrain.com/) 探索内置可观测性的生产就绪 AI Agent 框架。