1. Agent可观测性概述

大家好,我是你们这堂课的主讲人。今天咱们聊聊Agent可观测性。说实话,这个概念在AI Agent火起来之前,我更多是在微服务和分布式系统里折腾。但这两年做Agent项目,我发现——没有可观测性,你连Agent在「想什么」都不知道。

什么是可观测性

可观测性,英文叫Observability。说白了,就是你能从系统外部,通过它产出的数据,推断出内部到底发生了什么。

我习惯用一个比喻:你开车时看不到发动机内部,但通过仪表盘上的转速、水温、油压,你就能判断发动机状态。可观测性就是给Agent装上一套「仪表盘」。

具体到Agent场景,可观测性回答三个问题:

  • 发生了什么?——Agent调用了哪个工具?
  • 为什么发生?——LLM为什么选择了这个Action?
  • 接下来会怎样?——当前状态是否会导致死循环?

核心观点:可观测性不是监控。监控告诉你「系统挂了」,可观测性告诉你「为什么挂」。差一个字,差一个维度。

为什么Agent需要可观测性

你想想看,传统软件是确定性的——输入A,输出B。但Agent不一样。它依赖LLM,LLM的输出有随机性。同一个Prompt,两次调用可能给出不同结果。

我在项目中遇到过这样一个坑:一个客服Agent,上线后突然开始给用户推荐竞品。排查了三天,最后发现是LLM在一次工具调用中,把「推荐本公司产品」理解成了「推荐市面上最好的产品」。如果没有完整的调用链日志,这种问题根本无从下手。

Agent需要可观测性的原因,我总结为三点:

  1. 黑盒问题——LLM的推理过程不可见,你只能看到输入输出。可观测性帮你「透视」中间状态。
  2. 连锁故障——一个错误的工具调用,可能引发后续10步全部跑偏。没有追踪,你找不到根因。
  3. 成本控制——Token就是钱。可观测性帮你定位「哪个Prompt浪费了最多Token」。

避坑指南:我曾经在一个项目里,Agent每轮对话都调用了一个外部API。上线后账单吓死人。后来加了指标监控才发现——那个API调用完全没必要,LLM自己就能回答。可观测性直接帮我们省了60%的API成本。

可观测性的三大支柱

聊到可观测性,绕不开这个经典框架。三大支柱分别是:日志(Logs)指标(Metrics)追踪(Traces)。它们各司其职,又互相补充。

1. 日志(Logs)

日志是最原始的数据。每一行日志记录一个具体事件。在Agent场景下,日志应该包含:

  • 用户输入的原始Prompt
  • LLM返回的完整Response
  • 每次工具调用的请求和响应
  • Agent内部状态的变化(比如当前Step、已收集的信息)

我习惯给每条日志加上session_idstep_id,这样后续关联起来非常方便。

{
  "timestamp": "2025-01-15T10:30:00.123Z",
  "level": "INFO",
  "session_id": "sess_abc123",
  "step_id": 3,
  "event": "tool_call",
  "tool": "search_web",
  "query": "2025年AI Agent市场规模",
  "response": "预计2025年达到...",
  "latency_ms": 1200
}

小技巧:日志要结构化。别写「Agent调用了搜索工具」这种自然语言,用JSON。后面做分析时,结构化日志能直接喂给ELK或Loki,省大事了。

2. 指标(Metrics)

指标是聚合后的数值。它不关心单个事件,关心的是「整体趋势」。Agent场景下,我重点关注这几类指标:

指标类别 具体指标 说明
性能 平均响应时间、P99延迟 用户等多久才能拿到结果
成本 每轮对话Token数、API调用次数 钱花在哪了
质量 任务完成率、重试次数 Agent靠谱吗
异常 LLM返回错误率、工具超时率 哪里出问题了

嗯,这里要注意:指标不能太多。我见过有人给Agent挂了50多个指标,最后没人看。挑最重要的5-8个,盯住就行。

3. 追踪(Traces)

追踪是三大支柱里最「性感」的一个。它把一次完整的Agent执行过程串起来,形成一个调用链。

举个例子:用户问「帮我查一下北京明天的天气,然后提醒我带伞」。Agent的追踪链可能是这样的:

  1. Step 1: LLM分析意图 → 决定调用天气API
  2. Step 2: 调用天气API → 获取数据
  3. Step 3: LLM生成回复 → 包含天气信息
  4. Step 4: 调用提醒服务 → 设置提醒

每一步都有开始时间、结束时间、输入、输出。如果某一步卡住了,追踪能精确告诉你卡在哪。

我个人习惯用OpenTelemetry来做追踪。它支持自动埋点,你只需要在Agent的每个关键步骤前后加上span即可。

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("agent_execution") as span:
    span.set_attribute("session_id", session_id)
    
    with tracer.start_as_current_span("llm_call") as llm_span:
        llm_span.set_attribute("prompt_tokens", 150)
        response = llm.invoke(prompt)
    
    with tracer.start_as_current_span("tool_call") as tool_span:
        tool_span.set_attribute("tool_name", "weather_api")
        result = call_weather_api()

我的经验:三大支柱不是孤立的。日志提供细节,指标提供趋势,追踪提供链路。调试Agent时,我通常先看指标——发现异常,然后点进追踪——找到具体哪一步出问题,最后看那一步的日志——定位根因。三步走,效率最高。

知识体系总览

下面这张图,是我自己梳理的Agent可观测性知识体系。你可以把它当作本章的「地图」:

Agent可观测性知识体系 可观测性 日志 (Logs) 指标 (Metrics) 追踪 (Traces) 结构化日志 会话ID关联 性能指标 成本指标 调用链 Span 三者协同:日志提供细节 → 指标提供趋势 → 追踪提供链路 调试时:先看指标 → 点进追踪 → 查看日志 → 定位根因 常用工具:ELK / Loki / Prometheus / OpenTelemetry / Jaeger

这张图把三大支柱和它们的关键子项都串起来了。你调试Agent时,就按这个思路走——先看指标发现异常,再点进追踪定位步骤,最后翻日志找根因。这套流程,我在多个项目里验证过,确实好用。


好了,第一章就聊到这。可观测性不是锦上添花,是Agent上线的「安全带」。没有它,你就是在盲飞。下一章我们深入讲讲日志的具体落地——怎么埋点、怎么存储、怎么查询。到时候见。

专注资料整理