Agent 的 trace 怎么做?出了问题怎么定位是哪一步错的?

Q3-22可观测性常见traceOTelspan重放内容捕获采样策略成本归因

谁在问:工程向二面;平台组与运维过 Agent 的面试官用它验证你有没有真的排过障

口语化问法

  • 你们的 Agent 出问题了怎么查?打日志吗?
  • 一条 trace 里你会记哪些东西?
  • 有个偶发的错误重现不了,你怎么办?

考察意图

这题不难,但特别能验真伪:真排过障的人会条件反射地说出"先看终止原因分布"这类分层套路,没排过的人只会答"打日志、看日志"。面试官关注四点:

  1. trace 的结构对不对(一次 run 一条 trace,步骤嵌套,而不是一堆平铺的日志行)。
  2. 有没有定位方法论——从便宜到贵的排查顺序,而不是每次都从头读全文。
  3. 知不知道重放的价值——不可复现是 Agent 排障最大的敌人,能重放就能把偶发变成固定用例。
  4. 有没有合规与成本意识——全量存 prompt 和工具结果既贵又有隐私风险。

参考答案

图 2 · 60 分与 90 分差在哪:代价、演进、怎么验证

60

60 分答案(及格线)

结构:一次完整运行是一条 trace,里面按步骤嵌套 span——外层是这次 Agent 运行,里面每一步是一次模型调用 span,模型调用下面挂它触发的工具执行 span。截至 2026-08,OpenTelemetry 的 GenAI 语义约定(v1.41)已经定义了 agent / workflow / tool / model 这几类 span 以及耗时和 token 指标,嵌套结构就是 invoke_agent → chat → execute_tool,对齐它可以少走弯路(注意多数属性仍是实验性的,且内容捕获默认关闭)。

每步至少记:步号、模型与版本、提示词/harness 版本号、工具名、参数摘要、结果长度、耗时、输入输出 token(含缓存命中)、终止原因、护栏是否触发、本步成本。

定位顺序:先看终止原因(正常结束 / 步数上限 / 预算熔断 / 工具熔断),再看轨迹形态(选错工具、参数填错、工具返回空、重复调用、上下文超限),最后才去看具体某一步的请求体。

90

90 分答案(有生产经验的回答)

补四层。

1. 终止原因是性价比最高的一个字段。 它的分布就是系统健康度看板:正常终止占比下滑、步数上限触发率上升,通常意味着任务变难或某次提示词改动引入了退化——这个信号比用户投诉早得多。加上按意图分组,还能立刻看出是哪类请求出了问题。所以我会把它做成默认告警项,而不是排障时才去查。

2. 定位分四层,从便宜到贵。 ① 终止原因分布(秒级,覆盖大部分归因);② 轨迹形态分类(看动作序列的模式,不看文本);③ 单步请求体(这一层要能一键拿到最终发出去的 payload,包括系统提示、工具定义、完整历史——很多框架在这里不透明,是选型时就该验的,见 Q3-17);④ 离线重放。绝大多数问题在前两层就能定位,直接从第三层开始读全文是最费时的做法。

3. 重放是 Agent 排障的核心能力。 保存完整的 messages 序列和每次工具的原始返回,就能做两种重放:纯回放(把已发生的轨迹重新渲染出来给人看,用于复盘)和带录制的重跑(用录下来的工具返回重新跑模型,这样能验证"改了提示词之后同样的输入会不会走对")。有了后者,一个偶发问题就能变成回归集里的一条固定用例——这是把不可复现问题转化成可管理资产的唯一办法。

4. 内容捕获要分级,别一刀切。 全量存提示词和工具结果,成本和隐私风险都很高(客服场景里工具返回可能全是个人信息)。我的做法:正常轨迹只存结构化元数据 + 内容摘要/哈希;异常轨迹(失败、触发护栏、超预算)全量捕获;敏感字段脱敏;设保留期;大体量的工具结果存指针而不是正文。这样既能查问题,又不至于把 trace 存储做成第二个数据仓库。

5. 顺带解决成本归因。 只要 token 按步骤、工具、意图、用户打了标签,"钱花在哪"就是一次查询的事——这正是 Q3-02 那类成本突涨问题能在一天内定位的前提。没有这层标签,成本分析只能靠猜。

追问链

图 1 · 五层追问树:面试官会往哪儿挖
从「一条 trace 记哪些字段」挖到「0.5% 的错误怎么抓」

  1. 一条 trace 最少记哪些字段?为什么终止原因排最前?

    期望最小集:run/关联 id、步号、模型与版本、提示词与 harness 版本、工具名与参数摘要、结果长度、耗时、token(输入/输出/缓存)、终止原因、护栏触发、成本。版本最常漏,漏了就关联不上是哪次变更;终止原因排最前:零成本把排查空间切成几类,也是投诉前报警的健康度指标
    信号主动提「要记提示词/harness 版本」→ 做过变更归因;只答「记输入输出和耗时」→ 够用但没深度
  2. 提示词和工具结果要不要全量存?怎么平衡合规与成本?

    期望分级捕获:正常轨迹存元数据 + 摘要/哈希,异常轨迹全量;身份证、手机号、地址脱敏;内容捕获要能按开关与采样率控制(OTel GenAI 约定默认就关);设保留期与权限:trace 里的内容也是用户数据;大结果存指针。工具返回动辄几万 token,全量存会让可观测存储超过业务系统
    信号提出「异常全量、正常采样」和「trace 内容也要管权限」→ 做过合规;答「全都存下来方便排查」→ 会在成本和隐私上出事
  3. 有个偶发问题重现不了,怎么办?

    期望别追求复现,追求捕获与重放:① 定向捕获,命中特征(某意图 + 某工具 + 失败)即全量记录,而不是提整体采样率;②「带录制的重跑」:偶发多半是工具返回了罕见形态(空结果、超长、字段缺失),录下来喂回去就稳定复现;③ 立刻转成回归用例。剩下的来自采样随机,只能多跑看概率、架构上兜
    信号提出「定向捕获 + 录制回放 + 转回归用例」三步 → 排过障;只答「加大日志、多跑几次」→ 方法太原始
  4. 跨服务、跨 MCP server、多 Agent 的 trace 怎么串起来?

    期望关联 id 全链路透传,走请求头:会话 → run → step → 工具调用 四级 id,下游与 MCP server 原样带回。多 Agent 委托带同一个 run id 并标父子关系,否则 trace 拼不起来;跨组织 A2A 内部不可见,任务 id 与原因码必须对得上
    信号说出「多 Agent 标父子关系」「跨组织靠任务 id + 原因码」→ 做过分布式排障;只答「用 traceId 串起来」→ 没落到 Agent 场景
  5. 严重错误只有 0.5% 会话触发,采样率 1% 基本抓不到样本,怎么办?

    期望先别调采样率:全局提采样存储线性涨还要过合规,0.5% 采到也只有零星几条不够归因。① 轻量指纹打标:终止原因异常、某工具返回码、护栏触发、步数超阈值、重试次数,命中会话全量捕获,存储只涨一点;② 先行指标(转人工率、重试率、护栏触发率)按意图与时段切片缩范围;③ 必要时低风险分片全量,带脱敏和短保留期,几小时攒够 → ④ 默认改成正常低采样、异常全量
    信号走「轻量指纹 + 命中全量」并把结论落到采样按异常优先 → 运维过真实系统;只答「采样率调到 100%」或「多等几天攒样本」→ 没算过成本
一句「先看终止原因分布」就把「打过日志的」和「排过障的」切开了 —— 第 1 层是闸门;第 3 层验重放,第 5 层验你认不认均匀采样对排障本身就是错的。

评分要点

  1. trace 结构正确:一次 run 一条 trace,模型调用与工具执行嵌套
  2. 能列出每步必记字段,含提示词/harness 版本
  3. 把终止原因当作首要归因字段与健康度指标
  4. 有分层定位顺序(终止原因 → 轨迹形态 → 单步 payload → 重放)
  5. 能一键拿到最终发出的请求体(并知道这是框架选型的硬指标)
  6. 知道重放机制的两种形态及其价值
  7. 内容捕获分级:正常采样、异常全量、脱敏、保留期、权限
  8. 加分:token 打标签实现成本归因
  9. 加分:关联 id 全链路透传,多 Agent 标父子、跨组织靠任务 id 与原因码
  10. 加分:采样策略按异常优先而非均匀

常见错误

「打日志、出问题看日志」——没有结构,也没有定位方法论。
日志是平铺的文本行,没有 run/step 的层级关系,几百行读不出轨迹。
只记录最终输出,中间步骤和工具返回都没留,出了问题无从查起。
trace 里没有提示词或 harness 版本,指标变了却对不上是哪次变更导致的。
全量存所有内容,不脱敏、不设保留期,成本和隐私双爆。
不知道重放,遇到偶发问题只会"多跑几次试试"。
均匀采样,然后抱怨低频错误抓不到样本。

关联学习