trace 字段与 OTel 语义约定
一次多轮 Agent 请求的 trace 里必须记:每次模型调用的输入输出与 token、每次工具调用的参数与结果、模型与提示词版本、成本。OpenTelemetry 的 GenAI 语义约定(gen_ai.*)还在演进,内容捕获要处理 PII 与采样,目标是任何一条失败请求都能重放。
也叫:trace · OpenTelemetry · OTel · gen_ai 语义约定 · 可重放 · PII · 内容捕获
二、trace 里必须记什么出自 T5-3
按「没有它就查不出问题」的标准,分四类:
| 类别 | 必记 | 为什么 |
|---|---|---|
| 身份与串联 | trace_id、conversation/session id、user id(脱敏)、请求入口/渠道 | 没有会话 ID,多轮问题永远查不了;没有渠道,开篇那个故障永远定位不到 |
| 可重放的输入 | 系统提示的版本号、检索命中的文档 ID + 分数、工具的真实入参与返回、上下文总长度、是否触发过压缩 | 能不能把一条线上请求原样搬到离线跑,全看这一栏记全没有(承接 Q5-02 第一刀) |
| 模型与配置 | 模型 ID(含小版本)、effort 档位、max_tokens、是否命中 prompt 缓存、是否走了降级路由 | 上游静默升级、降级到小模型,都只有这一栏能证明 |
| 结果与判定 | 结束原因(正常结束 / 打到 max_tokens 被截断 / 工具报错 / 超时)、结构化输出是否解析成功、评测分数与 judge 版本 | 截断和解析失败是两个最高发、最容易被当成「模型变笨」的假象 |
判据:trace 的验收标准不是「记得全不全」,是「能不能据此把这条请求在离线复现出来」。 做不到,它就只是一堆好看的瀑布图。
存不存 prompt / completion 原文,是本节最真实的一道取舍题:
| 存原文 | 不存原文 | |
|---|---|---|
| 收益 | 能排障、能做数据飞轮、能补评测用例 | — |
| 代价 | PII 合规风险 + 存储成本的绝对大头 | 出问题只能看到「有个 span 慢了」 |
实践口径:默认脱敏 + 按采样存原文 + 敏感字段哈希 + 保留期分层(原文 7–30 天,指标与评分长期保留)。这条几乎是所有做过合规评审的团队最后收敛到的位置。
以上节选自T5-3 可观测:trace、线上质量监控与数据飞轮,读全文能看到前后语境。