Agent 开发的核心挑战:如何从海量 Traces 中发现问题
LangChain 创始人 Harrison Chase 今天发布了一篇文章,讨论 Agent 开发中的一个问题:当你的 Agent 在生产环境中每天产生成千上万条 Traces 时,你该如何理解它到底在做什么?
原文链接:From Traces to Insights: Understanding Agent Behavior at Scale
现状
Harrison 在文章开头引用了一段对话:
"可观测性是最简单的部分。真正困难的是分析和理解你观察到的东西。我接触过的团队每天记录超过 10 万条 traces。他们用这些 traces 做什么?什么都没做。因为在任何人类尺度上,阅读和总结 10 万条 traces 是不可能的。"
— Dev Shah
这种情况并不少见。很多团队部署了 Tracing,收集了数据,但没有进一步分析。
Agent 为什么不同于传统软件
Harrison 指出了 Agent 与传统软件的三个本质区别:
graph TB
subgraph "传统软件"
A1[确定性] --> A2[相同输入 = 相同输出]
B1[鲁棒性] --> B2[小改动 ≠ 大变化]
C1[有界输入] --> C2[UI 限制了用户能做的事]
end
subgraph "Agent"
D1[非确定性] --> D2[相同输入 ≠ 相同输出]
E1[Prompt 敏感性] --> E2[小改动 = 大变化]
F1[无界输入] --> F2[自然语言,用户可以问任何事]
end
1. 非确定性(Non-determinism)
传统软件运行多次,结果相同。Agent 不是这样。每次调用 LLM 都可能产生不同结果。当 Agent 连续调用上百次 LLM 时,同样的输入很可能走出完全不同的路径。
2. Prompt 敏感性(Prompt Sensitivity)
传统软件对输入的小变化具有鲁棒性。LLM 有一个特性叫 Prompt 敏感性—Prompt 空间中的微小变化可能导致输出的巨大变化。
3. 无界输入空间(Unbounded Input Space)
传统软件通过 UI 结构化用户输入,输入空间天然是有界的。Agent 接受自然语言,这是无界的—用户可以输入任何东西。
核心洞察:你无法在上线前预测 Agent 的行为
这三个特性叠加在一起,导致了一个根本性的问题:传统软件开发和 Agent 开发的迭代模式完全不同。
flowchart LR
subgraph "传统软件开发"
S1[写代码] --> S2[写测试] --> S3[上线] --> S4[监控指标]
S2 -.->|测试覆盖大部分场景| S3
end
subgraph "Agent 开发"
A1[写 Prompt] --> A2[写 Evals] --> A3[上线] --> A4[发现真正的问题]
A2 -.->|只能覆盖已知场景| A3
A4 -->|迭代| A1
end
传统软件:确定性 + 鲁棒性 + 有界输入 = 你可以在上线前通过测试确保行为符合预期。上线后的产品分析主要是观察用户行为,但这被 UI 所限制。
Agent:非确定性 + Prompt 敏感性 + 无界输入 = 你不知道 Agent 在生产环境中会做什么,直到它真的上线。自然语言接口意味着有更多用户意图需要捕获和分析。
💡 构建 Agent 时,你需要在生产数据上迭代的程度远超传统软件。
Harrison 强调了两点:
-
你需要迭代 Agent 的失败模式:传统软件通过测试在上线前捕获正确性问题,可能有少数边缘情况漏网。Agent 正好相反—大多数失败是在生产环境中才暴露的。
-
你需要迭代用户实际如何使用 Agent:传统软件中,用户只能按你允许的方式使用产品。Agent 的自然语言接口意味着用户可以用更多方式使用它。
传统产品分析为什么不够用
传统软件产生大量事件(点击、页面浏览、会话)。产品分析工具(Mixpanel、Amplitude 等)通过以下方式解决"数据太多"的问题:
- 将离散事件聚合成指标
- 构建漏斗和用户群组
- A/B 测试
Agent 也可以(也应该)这样做。Harrison 发现大多数生产环境中的团队会追踪:
- 终端用户反馈
- 延迟
- 工具调用
但这些指标只能告诉你"发生了什么",不能告诉你"为什么"。
要理解为什么这些指标在变化,你需要分析 Traces 本身。
graph TB
subgraph "传统产品分析"
M1[离散事件] --> M2[聚合指标]
M2 --> M3[漏斗/群组/A/B]
M3 --> M4[发现 WHAT]
end
subgraph "Agent 分析需求"
A1[非结构化对话] --> A2[模式发现]
A2 --> A3[聚类分析]
A3 --> A4[发现 WHY]
end
M4 -.->|不够| A4
那有没有更好的方法?很多团队会想到用 Online Evals。
Online Evals 的局限
Online Evals 对已知问题有帮助。你可以运行评估器来给 Traces 打分—用户挫败感、话题标签、成功标准。
但 Online Evals 要求你预先知道要找什么。
那探索性问题呢?
- "用户实际上是怎么使用我的 Agent 的?"
- "存在哪些失败模式?"
你无法为尚未发现的模式编写评估器。
Agent 分析应该是什么样的
Harrison 提出,真正的 Agent 分析工具需要:
- 分析非结构化对话,而不是离散事件
- 发现你不知道要找的模式
- 大规模浮现聚类
这正是 LangSmith Insights Agent 要解决的问题。
LangSmith Insights Agent:用聚类发现模式
LangSmith Insights Agent 使用聚类自动发现 Traces 中的模式。它不需要你预先定义要找什么,而是分析成千上万的对话,浮现出重要的聚类—使用模式、错误模式,或任何你指定的维度。
flowchart TB
subgraph "输入"
T[海量 Traces<br/>10万+/天]
end
subgraph "Insights Agent 处理"
C1[一级聚类<br/>顶层模式]
C2[二级聚类<br/>详细分组]
C3[具体 Runs<br/>单个案例]
C1 --> C2 --> C3
end
subgraph "输出"
R[分析报告<br/>可逐层下钻]
end
T --> C1
C3 --> R
两种最常见的分析场景
Harrison 提到团队最常问的两个问题:
| 问题 | 目的 |
|---|---|
| 用户是怎么使用我的 Agent 的? | 发现使用模式 |
| 我的 Agent 可能在哪些方面失败? | 发现失败模式 |
LangSmith 为这两种场景提供了预设 Prompt,但你也可以指定任意 Prompt—因为每个 Agent 都不同,你可能关心合规性、语气、准确性或特定领域的失败。
与定量信号结合
有时你只想对特定子集的 Runs 运行 Insights Agent。这让你可以将 Insights Agent 与 Online Evals 或传统产品分析结合使用。
例如:你可能只想调查收到负面用户反馈(如 👎)的 Runs。
flowchart LR
A[所有 Traces] --> B{用户反馈}
B -->|👎 负面| C[Insights Agent]
B -->|👍 正面| D[暂不分析]
C --> E[发现负面反馈<br/>背后的模式]
这样就把定量信号(👎)和定性分析(这些 👎 背后存在什么模式)结合起来了。
动态过滤
你甚至可以按尚不存在的属性过滤。
例如:"为什么用户感到沮丧?"
LangSmith Insights Agent 可以即时计算"用户感到沮丧",然后基于它进行过滤和聚类。
聚合属性发现异常
当产生聚类时,系统会聚合这些分组中与 Traces 相关的属性,让你快速发现异常聚类。你还可以指定即时计算的属性(然后也包含在聚合统计中)。
发现你不知道要追踪的模式。
核心方法论总结
把上面的内容整合起来,Agent 可观测性可以分为三个层次:
graph TB
subgraph "Agent 可观测性金字塔"
L1[基础指标<br/>延迟/错误率/反馈]
L2[Online Evals<br/>已知问题检测]
L3[Insights Agent<br/>未知模式发现]
L1 --> L2 --> L3
end
subgraph "适用场景"
S1[监控健康状态]
S2[检测预定义问题]
S3[探索性分析]
end
L1 --- S1
L2 --- S2
L3 --- S3
| 层级 | 工具 | 回答的问题 | 局限 |
|---|---|---|---|
| 基础指标 | Dashboards | 发生了什么? | 不知道为什么 |
| Online Evals | LLM-as-Judge | 预定义的问题存在吗? | 只能检测已知问题 |
| Insights Agent | 聚类分析 | 存在什么模式?为什么? | — |
写在最后
Harrison 的这篇文章讨论了一个很多团队面临的问题:
Agent 产生的是非结构化的 Traces,传统指标只能告诉你有事发生,但不能告诉你是什么或为什么。手动审查无法扩展。
当你的 Agent 上线后,你需要的不只是可观测性,而是可理解性。
Harrison 在文章开头的引用点出了一个普遍现象:很多团队在收集 Traces,但能从中获得洞察的不多。LangSmith Insights Agent 是 LangChain 针对这个问题给出的解决方案。
参考链接
- 原文:From Traces to Insights
- LangSmith Insights Agent 文档
- Tracing 对 Agent 开发至关重要
- Prompt 敏感性论文
- LangSmith