Skip to main content
Agent 上线后我最想先解决的是”怎么知道它哪里出了问题”。一条 trace 要能定位到具体步骤和工具,光有日志不够。

Q1: Trace、Span、Generation、Observation 到底是什么关系?

先记住一句话:Trace 是一次请求的完整故事,Observation 是故事里的每个步骤。
Trace 通过 trace_id 把 observations 逻辑分组;observation 可以嵌套形成父子树。很多系统(包括 Langfuse)在存储上就是一张 observations 表,每行带 trace 级属性的副本,因此按用户、会话、标签过滤非常快。

Q2: 跨 Agent 的 trace 怎么串成一条链?

多 Agent 最容易断链:Lead 调 Worker,Worker 又调工具,如果各写各的日志,就无法还原完整调用树。标准做法是用 W3C Trace Context 传播 traceparent。
工程要点:
异步队列消费时没有恢复上下文、工具调用用了新的 TracerProvider、采样策略在子服务里各自为政——这三种情况都会导致 trace 断成好几段。排查多 Agent 问题前,先确认 trace 是完整的一棵树。

Q3: OpenTelemetry GenAI 语义约定里,哪些属性最关键?

语义约定是为了让不同框架、不同厂商的 Agent 数据能对齐。最需要记住的: Span 命名建议跟随约定:chat {model}、execute_tool {name}、invoke_agent {name}。这样在 Langfuse 等后端里,GenAI span 能自动渲染成 Generation,普通 span 作为普通步骤展示。
gen_ai.input.messages / gen_ai.output.messages 这类内容属性很有用,但涉及隐私和体积。生产环境要设开关、设大小上限、做脱敏,不能默认全量记录。

Q4: 采样怎么做?为什么不能简单随机采样?

Agent 的调用链很长,全量采集成本高,但简单随机采样会漏掉关键失败。
关键原则:采样决策要基于整条 trace,而不是单个 span。 Langfuse 的 SDK 也提供采样率配置,但要和业务侧的”错误必留”策略配合,不能只靠一个全局比例。

Q5: PII 脱敏应该放在哪一层?

脱敏不是”最后导出时再处理”,而要在产生数据的最早可拦截点做:
工程实践:
  • 对 email、手机号、身份证、token、密钥做正则与结构化识别。
  • 对 prompt / completion 内容设大小上限,避免整段用户数据入库。
  • 保留脱敏前后的映射关系时,映射表要单独加密存储。
  • 建立”禁止记录字段”清单,并在 CI 里做检查。
不要指望让 LLM 自己”记得别输出敏感信息”。脱敏必须是确定性的代码规则,且默认开启。

Q6: Langfuse 的自托管架构为什么这么复杂?

因为它的读写路径被拆成了”接收”和”处理”两段,以扛住高吞吐:
这也解释了自托管的代价:部署的是一整套数据栈,运维面比单个服务大得多。小团队如果只是要基础 trace,单容器的方案(如 Phoenix 默认 SQLite)运维成本更低;但要做大规模分析和长期留存,ClickHouse 这套架构更合适。
Python 侧常见的是装饰器 @observe、上下文管理器,以及短生命周期进程结束前调用 flush();JS/TS 侧常用 @langfuse/tracing + @langfuse/otel,通过 LangfuseSpanProcessor 接入 OTel。具体 API 以对应版本文档为准,升级大版本前先看迁移说明。

Q7: Langfuse 的评测能力怎么用?LLM-as-a-Judge 怎么防止放水?

数据模型

在线 vs 离线

防放水的四道保险

关键指标是评估分与人工分的一致性,“评估分多高”参考价值有限。一致性低,评估器就不可信,再漂亮的分数也没有意义。
Prompt 用名称 + 版本管理,配合 production / staging 等标签做灰度。评测时固定数据集、只改 Prompt 版本,才能判断提升来自 Prompt 还是随机波动。

Q8: 生产上要盯哪些指标?评测闭环怎么建?

核心指标

告警要有”可行动性”

不要只告警”成功率下降”,要能定位到哪一层:

评测闭环

闭环的关键是把线上失败案例变成可复现的评测样本。只做离线评测、不回收线上失败,评测集很快会和真实分布脱节。

Q9: 一个多 Agent 任务的完整 Trace 长什么样?

以”生成订单导出 PDF 功能”为例,包含一次工具失败、一次重派、一次产物写入:
从这条 trace 能直接读出四件事:
  1. 失败点:write_file 超时,不是模型错。
  2. 重派:带 attempt=2,可核对幂等键是否避免了重复写入。
  3. 产物链路:patch.diff 的 artifactId、hash、version 都在,可回溯。
  4. 成本分布:coder 两次调用占了大部分 token,是优化重点。
面试时不要只说”我们接了 Langfuse”,而要能描述一条真实 trace:哪个 span 失败、错误类型、是否重派、产物落到哪、最终评分多少。

Q10: 八道深度追问(及格 vs 满分)

八题覆盖”数据模型 / 跨 Agent 传播 / 语义约定 / 采样 / 脱敏 / Langfuse 架构 / 评估器 / 指标闭环”。
及格回答: Trace 是一次请求,Span 是里面的步骤,Generation 是模型调用。满分回答: Trace 是一次请求或一个任务的完整链路,通过 traceId 把多个 observation 逻辑分组;Observation 是链路中的单个步骤,可以嵌套形成父子树;Span 是通用步骤,Generation 专指一次模型调用,Event 是没有持续时间的时间点。Session 再往上把多轮 trace 归到一个会话。理解父子关系很重要,因为排障时你要能沿着树定位到底是哪个 Agent、哪次工具调用出的问题。
及格回答: 给每个请求加个相同 ID,日志里带上。满分回答: 用 W3C Trace Context 传播 traceparent,里面包含 traceId、parentSpanId 和采样标记。Lead 调 Worker 时通过 HTTP header 或消息属性注入,Worker 恢复上下文后创建子 span,工具调用继续往下传,异步任务则把 traceparent 存进任务消息、消费时恢复。不要自己拼字符串,也不要在子服务里新建 TracerProvider,否则 trace 会断成好几段。排查多 Agent 前,先确认 trace 是完整的一棵树。
及格回答: 记录模型名和 token 数就行。满分回答: 至少要有四组:gen_ai.operation.name 标明是 chat、invoke_agent 还是 execute_tool;gen_ai.request.model 和 gen_ai.provider.name 定位模型;gen_ai.usage.input_tokens / output_tokens 支撑成本统计;error.type 用低基数类别支撑错误聚合。多 Agent 场景再加 gen_ai.agent.name 和 gen_ai.conversation.id。Span 命名跟随约定,比如 chat {model}、invoke_agent {name},这样后端能正确渲染成 Generation 而不是普通 span。
及格回答: 按比例随机采,比如 10%。满分回答: 简单随机采样会把关键失败一起丢掉,而且需要在整条 trace 上做决策,不能每个 span 各自随机。我的策略是分层:错误链路 100% 保留、超过 P95 的慢请求 100% 保留、人工接管和越级上报 100% 保留,普通成功链路按 5% 到 20% 采样,灰度或特定租户单独提高比例。实现上更推荐尾部采样,因为它能看到链路结果再决定是否保留。核心是保证”该看的都在”,而不是追求一个好看的采样率。
及格回答: 展示的时候打码就行。满分回答: 要放在数据产生后、导出前的最早拦截点,也就是 SDK 或 OTel 的导出层,用统一的 mask hook 或 span processor 处理。展示层打码太晚,数据已经落库和传输了。具体做法是对 email、手机号、身份证、token、密钥做确定性规则识别,对 prompt 和 completion 设大小上限,建立禁止记录字段清单并在 CI 检查。绝不能依赖模型自己记得别输出敏感信息,脱敏必须是代码规则且默认开启。
及格回答: 因为要存的东西多,所以要数据库和缓存。满分回答: 它把读写路径拆开了:Web 接收上报后批量写对象存储,Redis 只放引用做缓冲,Worker 异步消费再写入 ClickHouse 和 PostgreSQL。PostgreSQL 存事务性元数据,ClickHouse 扛大规模 trace 查询和聚合,对象存储放原始事件与大对象。这样能削峰、解耦、支撑高吞吐,但代价是运维一套数据栈,而不是一个服务。小团队只要基础 trace,可以选单容器方案;要做大规模分析和长期留存,才值得上这套架构。
及格回答: 多跑几次取平均。满分回答: 放水的根因是评估标准和评估者独立性。我做四件事:评分标准写成可逐条检查的 rubric,避免”写得好不好”这类模糊标准;评估器换模型或换厂商,避免同源模型偏袒;强制输出评分理由,人工抽检理由质量;定期用人工标注校准,跟踪评估分与人工分的一致性。关键指标是一致性,分数高低本身说明不了问题。一致性低就说明评估器不可信,需要重新设计 rubric 或换评估器。
及格回答: 成功率低于阈值就告警,然后看日志。满分回答: 告警要可行动,不能只报”成功率下降”,要能下钻到工具错误率、重派率、步数、成本这些过程指标,快速判断是工具挂了、某个 Agent 熔断、还是拆解过细。闭环是把线上失败案例沉淀成数据集样本,做离线回归,修复后再验证,同时把人工标注和用户反馈回流。只做离线评测、不回收线上失败,评测集会很快和真实分布脱节。

延伸阅读与引用参考