你无法改进你看不到的东西。智能体上线后,可观测性就是你的"眼睛"。
传统软件的运行是确定性的:同样的输入产生同样的输出,出错时看日志就能定位。智能体不同:同样的输入可能产生不同的输出,错误可能是"输出合理但不对"而非报错。这种不确定性让可观测性变得更加重要,也更加困难。
| 支柱 | 回答的问题 | 实现方式 |
|---|---|---|
| 日志(Logging) | 发生了什么? | 记录每次调用的输入输出 |
| 指标(Metrics) | 整体表现如何? | 聚合统计关键数值 |
| 追踪(Tracing) | 问题出在哪一步? | 贯穿完整调用链路 |
三者配合,才能从宏观到微观全面掌握智能体的运行状况。
智能体的日志与传统软件不同,需要记录更多"语义"层面的信息。
{
"timestamp": "2026-08-19T10:23:45Z",
"session_id": "sess_abc123",
"user_id": "user_456",
"model": "claude-sonnet-4",
"system_prompt_hash": "a1b2c3d4",
"messages_count": 8,
"input_tokens": 2340,
"output_tokens": 580,
"tools_available": ["search", "calculator"],
"tools_called": [{"name": "search", "params": {"q": "AI配音"}}],
"latency_ms": 3200,
"status": "success",
"finish_reason": "tool_use"
}
{
"timestamp": "2026-08-19T10:23:46Z",
"session_id": "sess_abc123",
"tool_name": "search",
"input_params": {"q": "AI配音"},
"output_summary": "返回10条结果",
"output_tokens_estimate": 1500,
"latency_ms": 800,
"status": "success"
}
注意:不要把完整的工具输出记入日志(可能包含用户数据且体量巨大),记摘要即可。如果需要完整输出,单独存储并关联ID。
{
"session_id": "sess_abc123",
"user_message": "帮我查一下最近的AI配音工具",
"agent_response_summary": "推荐了5款AI配音工具",
"user_feedback": null,
"turns_in_session": 4,
"session_duration_s": 45
}
多步任务中,一个用户请求可能触发多次模型调用和工具调用。链路追踪把整个过程串联起来:
[用户请求] 帮我分析这篇文章的SEO问题
│
├─ [模型调用 #1] 分析用户意图 → 决定调用read_article工具
│ ├─ [工具调用] read_article("article_123") → 3200字内容
│ └─ 耗时: 1.2s | Token: 3500入+120出
│
├─ [模型调用 #2] 分析文章内容 → 决定调用seo_check工具
│ ├─ [工具调用] seo_check(content) → SEO报告
│ └─ 耗时: 2.1s | Token: 4200入+280出
│
└─ [模型调用 #3] 综合分析 → 生成最终建议
└─ 耗时: 1.8s | Token: 3800入+450出
总耗时: 5.1s | 总Token: 15850 | 状态: 成功
有了链路追踪,当用户反馈"太慢了"或"回答不对"时,可以快速定位是哪个环节的问题:是工具调用慢?还是某次模型调用的输出质量差?
性能瓶颈定位:按耗时排序Top 10的会话,分析哪类任务最慢、慢在哪个环节。
质量回归排查:对比本周和上周的任务完成率,如果下降,查看新引入的失败模式。
成本异常调查:单日成本突然上升,按用户/任务类型/模型维度拆解,找到成本增长源。
安全事件审计:筛选被标记为疑似注入的对话,人工复核是否有实际攻击。
合理的保留策略既满足排查需求,又控制存储成本。涉及用户隐私的日志要按合规要求处理。
可观测性不是为了"记录一切",而是为了"在需要时能看到需要的信息"。日志和监控的设计应该从"我要解决什么问题"出发,而不是盲目地全量记录。