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。
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 的调用链很长,全量采集成本高,但简单随机采样会漏掉关键失败。Q5: PII 脱敏应该放在哪一层?
脱敏不是”最后导出时再处理”,而要在产生数据的最早可拦截点做:
工程实践:
- 对 email、手机号、身份证、token、密钥做正则与结构化识别。
- 对 prompt / completion 内容设大小上限,避免整段用户数据入库。
- 保留脱敏前后的映射关系时,映射表要单独加密存储。
- 建立”禁止记录字段”清单,并在 CI 里做检查。
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 功能”为例,包含一次工具失败、一次重派、一次产物写入:- 失败点:
write_file超时,不是模型错。 - 重派:带
attempt=2,可核对幂等键是否避免了重复写入。 - 产物链路:
patch.diff的 artifactId、hash、version 都在,可回溯。 - 成本分布:coder 两次调用占了大部分 token,是优化重点。
面试时不要只说”我们接了 Langfuse”,而要能描述一条真实 trace:哪个 span 失败、错误类型、是否重派、产物落到哪、最终评分多少。
Q10: 八道深度追问(及格 vs 满分)
八题覆盖”数据模型 / 跨 Agent 传播 / 语义约定 / 采样 / 脱敏 / Langfuse 架构 / 评估器 / 指标闭环”。
Trace、Span、Generation、Observation 是什么关系?
Trace、Span、Generation、Observation 是什么关系?
及格回答: Trace 是一次请求,Span 是里面的步骤,Generation 是模型调用。满分回答: Trace 是一次请求或一个任务的完整链路,通过 traceId 把多个 observation 逻辑分组;Observation 是链路中的单个步骤,可以嵌套形成父子树;Span 是通用步骤,Generation 专指一次模型调用,Event 是没有持续时间的时间点。Session 再往上把多轮 trace 归到一个会话。理解父子关系很重要,因为排障时你要能沿着树定位到底是哪个 Agent、哪次工具调用出的问题。
跨 Agent 的 trace 怎么串成一条链?
跨 Agent 的 trace 怎么串成一条链?
及格回答: 给每个请求加个相同 ID,日志里带上。满分回答: 用 W3C Trace Context 传播
traceparent,里面包含 traceId、parentSpanId 和采样标记。Lead 调 Worker 时通过 HTTP header 或消息属性注入,Worker 恢复上下文后创建子 span,工具调用继续往下传,异步任务则把 traceparent 存进任务消息、消费时恢复。不要自己拼字符串,也不要在子服务里新建 TracerProvider,否则 trace 会断成好几段。排查多 Agent 前,先确认 trace 是完整的一棵树。OTel GenAI 语义约定里,最关键的属性有哪些?
OTel GenAI 语义约定里,最关键的属性有哪些?
及格回答: 记录模型名和 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% 采样,灰度或特定租户单独提高比例。实现上更推荐尾部采样,因为它能看到链路结果再决定是否保留。核心是保证”该看的都在”,而不是追求一个好看的采样率。
PII 脱敏应该放在哪一层?
PII 脱敏应该放在哪一层?
及格回答: 展示的时候打码就行。满分回答: 要放在数据产生后、导出前的最早拦截点,也就是 SDK 或 OTel 的导出层,用统一的 mask hook 或 span processor 处理。展示层打码太晚,数据已经落库和传输了。具体做法是对 email、手机号、身份证、token、密钥做确定性规则识别,对 prompt 和 completion 设大小上限,建立禁止记录字段清单并在 CI 检查。绝不能依赖模型自己记得别输出敏感信息,脱敏必须是代码规则且默认开启。
Langfuse 自托管为什么需要这么多组件?
Langfuse 自托管为什么需要这么多组件?
及格回答: 因为要存的东西多,所以要数据库和缓存。满分回答: 它把读写路径拆开了:Web 接收上报后批量写对象存储,Redis 只放引用做缓冲,Worker 异步消费再写入 ClickHouse 和 PostgreSQL。PostgreSQL 存事务性元数据,ClickHouse 扛大规模 trace 查询和聚合,对象存储放原始事件与大对象。这样能削峰、解耦、支撑高吞吐,但代价是运维一套数据栈,而不是一个服务。小团队只要基础 trace,可以选单容器方案;要做大规模分析和长期留存,才值得上这套架构。
LLM-as-a-Judge 怎么防止评估器放水?
LLM-as-a-Judge 怎么防止评估器放水?
及格回答: 多跑几次取平均。满分回答: 放水的根因是评估标准和评估者独立性。我做四件事:评分标准写成可逐条检查的 rubric,避免”写得好不好”这类模糊标准;评估器换模型或换厂商,避免同源模型偏袒;强制输出评分理由,人工抽检理由质量;定期用人工标注校准,跟踪评估分与人工分的一致性。关键指标是一致性,分数高低本身说明不了问题。一致性低就说明评估器不可信,需要重新设计 rubric 或换评估器。
生产指标怎么设告警,怎么闭环到评测?
生产指标怎么设告警,怎么闭环到评测?
及格回答: 成功率低于阈值就告警,然后看日志。满分回答: 告警要可行动,不能只报”成功率下降”,要能下钻到工具错误率、重派率、步数、成本这些过程指标,快速判断是工具挂了、某个 Agent 熔断、还是拆解过细。闭环是把线上失败案例沉淀成数据集样本,做离线回归,修复后再验证,同时把人工标注和用户反馈回流。只做离线评测、不回收线上失败,评测集会很快和真实分布脱节。
延伸阅读与引用参考
- OpenTelemetry: GenAI Semantic Conventions:
gen_ai.*属性、操作类型与 span 命名约定。 - W3C Trace Context:
traceparent与跨服务上下文传播标准。 - Langfuse: Observability:Trace / Observation / Session 数据模型与 SDK 接入。
- Langfuse: Self-hosting:Web、Worker、PostgreSQL、ClickHouse、Redis、对象存储的部署架构。
- Langfuse: Evaluation:Scores、Datasets、LLM-as-a-Judge、人工标注与在线评测。
- Langfuse: Prompt Management:名称、版本、标签与变量编译。
- Arize Phoenix:基于 OpenTelemetry / OpenInference 的可观测方案。
- LangSmith:与 LangChain / LangGraph 深度集成的可观测与评测平台。
- Helicone:代理式可观测与网关方案。
