04 - 语义约定与内容治理
前置:02 篇的埋点路线。
本篇回答:span 上的字段该叫什么名字(约定),以及 prompt 和模型输出这些字段值到底记不记(内容治理)。这两件事看着是两个话题,但决定它们的开关经常在同一个配置对象里。
本篇会用到的词:
| 词 | 意思 |
|---|---|
| 语义约定 | 规定 span 叫什么名、带哪些属性的标准。有它,不同厂商的工具才读得懂同一份数据 |
| 命名空间 | 属性名的前缀。gen_ai.* 和 llm.* 是两个不同命名空间,表达的却常是同一件事 |
| OTTL | OpenTelemetry Transformation Language,在 Collector 里改写遥测数据的表达式语言 |
| 归一化 | 把不同来源、不同命名的数据改写成同一套字段名 |
| 索引属性 | 形如 llm.input_messages.0.message.role 的属性 —— 数组下标编在属性名里,条数越多属性越多 |
一、两套约定的定位
| OpenTelemetry GenAI | OpenInference | |
|---|---|---|
| 仓库 | open-telemetry/semantic-conventions-genai | Arize-ai/openinference |
| ★ | 267 | 1,159 |
| 协议 | Apache-2.0 | Apache-2.0 |
| 属性前缀 | gen_ai.* | llm.* document.* embedding.* |
| 出身 | OpenTelemetry 官方 | Arize(Phoenix 的开发方) |
| 定位 | 通用可观测标准的 GenAI 扩展 | 面向 LLM 应用调试的实用约定 |
不要用 star 数比较这两个仓库。 使用者 star 的是 SDK 和平台,不是规范文本 —— semantic-conventions-genai 只有 267 星,不代表它边缘。判断采纳度看的是哪些平台和基础设施项目在生产路径上实现了它,第三节给证据。
二、覆盖范围不同
两套的差异不在命名风格,而在建模粒度:
最后一行的 MCP 空缺不是我推断的。Envoy AI Gateway 的源码注释里写着:
// OpenInference defines no MCP conventions, so MCP spans keep the
// gateway-specific vocabulary they have always emitted.
mcp: mcpVocabularyLegacy(),
选了 OpenInference,MCP 那部分 span 就得各家自己发明词汇。 而 OTel GenAI 那边有一份 1,332 行的 docs/gen-ai/mcp.md。