TL;DR · 本文论证:当被观测对象从确定性系统变成 LLM,前面三篇建立的三个回声(状态可推断 / 可控性对偶 / 状态空间维度)部分有效、部分崩塌——AI 可观测不是传统可观测的延伸,是一组新工程问题。 · 写给:构建 LLM 应用 / Agent / RAG 系统的工程师与架构师;以及已经在做传统可观测、想理解 AI 时代变了什么的 SRE。 · 不读会错过:“为什么 OpenTelemetry GenAI Conventions 必要但远不够"的根本理由——以及为什么 SRE 体系的 error budget 自动闭环在 LLM 上不能照搬。
L1-1 到 L1-3 建立了一个完整的理论——可观测性是被观测对象的性质,三支柱是误读,事件是基础原语,存储不下是物理约束。
但所有这些都隐含了一个假设:被观测对象是一个 Kalman 意义上的动态系统——确定性的状态转移、可枚举的内部变量、输入决定输出。
这一篇要问:当被观测对象不再满足这个假设——它变成一个 LLM、一个 Agent、一个 RAG 管道——前面建立的理论还能不能用?
我的答案是:部分能、部分不能、有一部分需要被发明。
1. 观察对象变了
Kalman 1960 年研究的系统大致是这样的:
- 状态变量是有限的、可枚举的(位置、速度、加速度、温度、电流……)。
- 状态转移由确定性方程描述:
x(t+1) = f(x(t), u(t))。 - 输出方程是确定性的:
y(t) = g(x(t))。 - 同样的输入,永远产生同样的输出。
过去六十年的可观测工程实践——无论它讲的是网卡、JVM、Kubernetes、还是分布式追踪——都默认了同一个对象模型:输入 → 确定性状态 → 输出。
LLM 推理打破了这个模型的几乎每一项:
- 它的"状态"不可枚举:上下文窗口里几千个 token 的语义嵌入、所有层的注意力分布、采样过程中的概率分布。
- 它的"状态转移"不确定:相同 prompt + 相同 context + 不同 random seed = 不同输出。
- 它的"输出"不是数值,是自然语言 —— 是否"正确"取决于人或另一个模型的判断。
我们今天用 OpenTelemetry GenAI Semantic Conventions 给 LLM 调用打 trace,给 token usage 加 metric——这些都对。一个典型的 GenAI span 长这样(截至 2026-06 规范,attributes 简化):
# 一次 LLM 调用产生的 span(OTLP / OTel GenAI Semantic Conventions)
span.name: "chat gpt-4"
attributes:
gen_ai.system: "openai"
gen_ai.operation.name: "chat"
gen_ai.request.model: "gpt-4"
gen_ai.request.max_tokens: 200
gen_ai.request.temperature: 0.7
gen_ai.response.model: "gpt-4-0613"
gen_ai.response.finish_reasons: ["stop"]
gen_ai.usage.input_tokens: 1024
gen_ai.usage.output_tokens: 256
events:
- name: "gen_ai.content.prompt" # 可选,敏感
body: { "role": "user", "content": "..." }
- name: "gen_ai.content.completion" # 可选,敏感
body: { "role": "assistant", "content": "..." }
这些都对——但它们只覆盖了 LLM 系统的外壳:调用了什么模型、花了多少 token、用了多少毫秒。它们没有触及内核:这次回答到底对不对?为什么是这样?换一次还会一样吗?
flowchart LR
subgraph K["Kalman 系统 (1960 假设)"]
K1["输入 u(t)"] --> K2["确定性状态
有限维、可枚举"]
K2 --> K3["确定性输出 y(t)"]
end
subgraph L["LLM 系统 (今天的对象)"]
L1["prompt + context"] --> L2["语义状态
高维、概率分布"]
L2 -->|"采样过程
非确定"| L3["自然语言输出
'对不对'需外部判断"]
end
K -.->|"对象模型变了"| L
style K2 fill:#e0eaff
style L2 fill:#ffe3e3
图 1·从 Kalman 系统到 LLM 系统,被观测对象的三大属性同时改变——状态、转移、输出方程全部失去了原有形式。
2. 三个回声的延伸与崩塌
把 L1-1 留下的三个回声逐个放到 LLM 系统里检验。
回声一(状态可推断性):部分有效,但"状态"被根本性扩展
在 LLM 系统里,“从输出反演内部状态"仍然是一个可以追求的目标——但"内部状态"的范围被极大扩展:
- 可被追踪的状态:prompt 模板版本、最终拼装的 prompt、工具调用链、检索召回的 chunk、模型 ID、温度参数、最终 token 序列。
- 难以追踪的状态:模型内部的注意力激活、生成过程的逐 token 概率分布、CoT 中间 reasoning 的真实内部表示(即使输出了"thinking"也只是另一段生成,未必反映真实推理过程)。
工程上的等价物:Prompt Tracing + Tool Call Span + Trajectory 三件套合在一起,能覆盖第一类;第二类目前几乎没有生产可行的方案。
所以回声一还在,但它从"完整反演"退化为"边界反演”——你能看清外壳,看不清内核。
回声二(可控性对偶):几乎完全失效
这是最深的崩塌。
在 Kalman 框架下,可观测性永远和可控性配对——你看到内部状态,是为了驱动它到期望的状态。
在 LLM 系统里,你能"驱动"的是什么?
- 改 prompt:间接、非线性、版本化、可能引发其他回归。
- 换模型:剧烈、全局、不可微调。
- 加 guardrail:边界控制,不是状态控制。
- Retrieval 调参:影响输入,不是模型行为本身。
- 微调:缓慢、批量、不可即时回滚。
这些都不是 Kalman 意义上的"状态驱动”。它们更像是对生成分布的扰动——你不能精确把模型推到某个状态,只能改变它的概率云的形状。
实践推论:LLM 系统的可观测体系不能直接继承 SRE 的"观测 → 决策 → 自动化干预"反馈闭环。传统系统里 error budget 触发 → 自动降级 / 限流;LLM 系统里质量下降触发 → 通常只能告警让人来介入。这不是工程问题,是对象问题。
回声三(状态空间维度):指数级恶化
L1-3 里我们算过六维状态空间 ≈ 10¹⁵ 时间序列。在 LLM 系统里这个数字是多少?
每个 prompt 在原则上就是状态空间中的一个独特点——你不能"把这次 prompt 和上次 prompt 看成同一类",因为它们的语义内容不同。即使两次 prompt 字面相同,retrieval 注入的上下文不同,行为也不同。
更糟的是,你无法用传统聚合方式压缩这个维度。GROUP BY user_id 是有意义的,GROUP BY prompt 几乎没有意义——每个 prompt 都是独特的。
这逼出了 LLM 可观测的一个标志性问题:怎么对一个"每个状态都几乎独特"的系统做有用的统计?
部分答案:把 prompt 投影到 embedding 空间,对 embedding 做聚类、做漂移检测、做异常分组。这是 embedding drift 这类新指标存在的原因——它们是回声三在新对象上的工程化回应。
flowchart LR
R1["回声一
状态可推断性"] -->|"延伸到 LLM"| O1["部分有效
外壳可追踪
内核仍是黑盒"]
R2["回声二
可控性对偶"] -->|"延伸到 LLM"| O2["近乎失效
无法'驱动'状态
只能扰动分布"]
R3["回声三
状态空间维度"] -->|"延伸到 LLM"| O3["指数恶化
每个 prompt 都独特
需 embedding 聚类"]
style O1 fill:#fff4d6
style O2 fill:#ffe3e3
style O3 fill:#ffe3e3
图 2·三个回声在 LLM 上的命运。一个生还、一个重伤、一个彻底崩塌——这决定了 AI 可观测必须有自己的工具集。
3. 三支柱的进一步失败
L1-2 论证了三支柱在传统系统里就已经是一种误读。在 LLM 系统里,这种误读变得更显眼。
Metric 能告诉你:调用数、latency、token usage、错误码分布、成本。 Metric 说不出:模型是不是说对了。
Log 能记录:每次调用的 prompt 和 response。 Log 说不清:多轮对话中"上下文是怎么演化的"。
Trace 能描绘:Agent 的工具调用先后顺序。 Trace 不擅长:表达 ReAct 循环里"思考 → 行动 → 观察 → 反思 → 重新思考"的循环结构,更不擅长表达 reflection 的回溯。
传统 distributed trace 假设的是树状因果——一个调用产生子调用,子调用产生孙调用,整体是一棵 DAG。Agent 系统不是这样:它会循环(一个 step 失败重试)、会反思(评估前面 step 的结果再决定下一步)、会分支与合并(多 sub-agent 并行后汇总)。把这种执行硬塞进 distributed trace 的 span 树里,你看到的会是一个被强行扁平化的、丢失了循环语义的"线性化叙事"。
flowchart TB
subgraph T["传统 distributed trace (DAG / 树)"]
TR1["请求"] --> TR2["service A"]
TR2 --> TR3["service B"]
TR2 --> TR4["service C"]
TR3 --> TR5["DB query"]
end
subgraph A["Agent Trajectory (循环 + 反思)"]
AR1["任务"] --> AR2["思考"]
AR2 --> AR3["调用工具"]
AR3 --> AR4["观察结果"]
AR4 -->|"评估不满意"| AR2
AR4 -->|"评估满意"| AR5["输出"]
end
图 3·传统 distributed trace 是树;Agent trajectory 是带循环、带反思、带分支合并的图。两者的拓扑根本不同。
4. 新原语:什么取代了"事件"?
L1-2 把"事件"立为传统可观测的基础原语。在 LLM 系统里,“事件"还够用吗?
不够用。
LLM 系统需要的基础原语是 trajectory——一次任务的完整 (state, action, observation) 序列。它和事件的差别在于:
- 事件是点,trajectory 是序列。
- 事件可以独立查询,trajectory 必须连续查询。
- 事件可以聚合,trajectory 的中间过程不能被压缩——压缩了就丢失了因果。
- 事件有相对清晰的 schema,trajectory 的 schema 因任务而异。
但 trajectory 也不是终点。它擅长描述 Agent 执行,不擅长描述:
- RAG 系统的检索质量(是 trajectory 中的一步,但有自己的子结构:候选 chunks、rerank 分数、最终选中)。
- 多模型协作(一次任务里可能调用 GPT-4 做规划、Claude 做执行、Gemini 做评估,每个都有自己的 trajectory)。
- 单次推理内部的过程(CoT 步骤、tool call、token-level confidence)。
我的判断:AI 可观测目前还没有一个统一的基础原语。它正处在"事件 → trajectory → 待定下一原语"的演化中段。L4 的一个核心议题就是这个原语会长成什么样。
5. 新维度:质量
传统可观测主要测三件事:可用性、性能、错误率。每一项都有相对清晰的标准——HTTP 200、p99 < 300ms、error rate < 0.1%。
LLM 系统强迫你测第四件事:质量 / 正确性。
这一维的特殊性不在于它"难量化”,而在于——
它不能被可观测工具自身回答。
要判断一次 LLM 输出"对不对",你需要:
- 人来评(贵、慢、不可扩展)
- 另一个 LLM 来评(便宜但有偏见,会随 judge 模型版本漂移)
- 与黄金集对比(适用于离线 eval,不适用于在线流量)
- 启发式规则(适用于结构化输出,不适用于开放性回答)
这意味着质量观测更像一种判断,而不是一种测量。它会引入一组传统可观测体系里完全不存在的问题:
- 判别者本身的偏见怎么治理?
- 评估成本如何控制(每条流量都评一次的 LLM-as-Judge 成本经常 >= 主调用本身)?
- 评估口径变更后历史数据怎么对齐?
- 评估的延迟(在线 eval 通常是异步的)和告警实时性怎么协调?
LLM-as-Judge 偏见不是抽象问题,是有数字的工程问题。 Zheng 等人 2023 年的 “Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena”(LMSYS / NeurIPS 2023)系统性测量了几种偏见:
- 位置偏见:在 pairwise comparison 中,judge 倾向给第一个出现的答案打高分——GPT-4 作为 judge 时位置偏见约 28%,弱模型作为 judge 时更高。
- 自我偏好:judge 模型倾向给自己家族的输出打高分——同样 GPT-4 judge 评估 GPT-4 vs Claude 时存在显著 self-bias。
- 长度偏见:更长的回答更容易被判定为"更好",即使内容质量未必。
这些数字直接决定了线上 eval pipeline 的工程化路径——比如必须做位置随机化(A/B 答案随机互换再投票)来抵消位置偏见。这些问题在 L4 系列(特别是 L4-8 Online vs Offline Eval 流水线)里会逐项展开。
理论上的意义已经清楚:可观测体系从"测量系统的状态"扩展到"判断系统输出的语义",是一次性质级别的扩展,不是程度级别的扩展。
6. 非确定性破坏了 debugging
传统 debugging 的基本假设:相同输入 → 相同输出。无法重现 = bug 是间歇性的(race condition、外部依赖、状态污染)。
LLM debugging:相同输入 → 不同输出。这是默认行为,不是 bug。
这件事的可观测论后果非常严重。在传统系统里,“重启服务再跑一遍看看"是一个标准操作。在 LLM 系统里,这个操作通常什么也证明不了——你跑两遍得到两个不同输出,到底是 bug 还是采样温度的自然差异?
工程界的回应是 Replay:基于记录的 prompt + context + tool response,重新执行一次调用以复现行为。但 replay 要可信,需要冻结:
- 模型版本(同一 API 调用在两个月里 vendor 可能已经偷偷更新过权重)
- 采样参数(temperature、top_p、seed)
- 所有外部依赖的响应(工具返回、retrieval 结果)
这意味着 LLM 可观测必须存"足够 replay 的状态”——远比传统系统多得多的上下文。这把回声三(状态空间维度)和回声一(状态可推断性)扣在了一起:你想 debugging,就必须存得多;存得多,就撞回基数问题。
flowchart TB
subgraph C["传统 debugging"]
C1["bug 报告"] --> C2["重启 + 重现"]
C2 -->|"相同输入
相同输出"| C3["定位 bug"]
end
subgraph L["LLM debugging"]
L1["bug 报告"] --> L2["replay"]
L2 --> L3{"需要冻结
模型 / 温度 / 工具响应"}
L3 -->|"全冻结"| L4["可复现"]
L3 -->|"未冻结"| L5["无法判定是 bug
还是采样差异"]
end
style L5 fill:#ffe3e3
图 4·非确定性让传统的"重现即定位"失效。LLM 调试的入口是 replay,而 replay 的代价是必须存下所有可能影响输出的状态。
7. AI 可观测的真正挑战
把上面这些拼起来,AI 可观测面临的真正挑战不是"把 traces / metrics / logs 搬过来"——OpenTelemetry GenAI Semantic Conventions 在做的就是这件事,它必要但远远不够。
真正待解决的是:
- 新原语:在 trajectory 之上找到能同时描述 Agent、RAG、多模型协作的统一原语。
- 新维度:把质量 / 正确性变成可入库、可告警、可治理的可观测信号——同时承认它更接近判断而非测量。
- 新闭环:在可控性对偶失效的前提下,重新定义"观测 → 干预"的反馈机制(prompt 治理、模型路由、guardrail 编排都是不完整的答案)。
- 新存储:在状态空间无限维的前提下,重新设计"存什么、丢什么"——embedding 聚类、语义采样、按 trajectory 重要性采样都是早期尝试。
- 新调试:让 replay 成为一等公民,而不是 trace 之上的可选项。
这五件事是 L4 系列要逐个展开的具体技术议题。L1-4 的任务是确认它们的合法性:它们不是传统可观测的"扩展应用",是一组新的工程问题,需要新的工具集和新的理论。
8. 自我证伪
如果以下任一条件成立,本文的核心论证就会动摇: ① 如果 LLM API 提供严格可复现——同 prompt + 同 seed 永远产生同输出——那么"非确定性破坏 debugging"这条核心论证瓦解。部分反驳: OpenAI 早在 2023 年就提供了
seed参数但官方文档明确写"best effort";Anthropic 截至 2026-06 仍未提供 seed 控制;vendor 在不通知用户的前提下更新模型权重也让"严格复现"在 SaaS API 下几乎不成立。 ② 如果 LLM 的"思考过程"(chain-of-thought 输出、reasoning tokens)忠实反映了内部计算路径——那么状态可推断性回声 (回声一) 完全恢复。反驳: Turpin 等 “Language Models Don’t Always Say What They Think”(2023)已经实证:模型 CoT 输出经常与真实推理不一致。这是开放研究问题。 ③ 如果未来的 LLM 控制原语(structured generation、constrained decoding、tool-use 协议)成熟到可以精确驱动模型行为——那么可控性对偶 (回声二) 可能部分恢复。这一条值得跟踪: 2024+ structured outputs / function calling 已经在补这一半,但仍远未达到 Kalman 意义上的"状态驱动"。
9. L1 系列总结
回看 L1-1 到 L1-4,这四篇不是关于"可观测性是什么"。
它们是关于一件更深的事:被观测对象的性质,如何决定可观测体系的形态。
- L1-1 把可观测性还原为系统的性质,而非工具的清单。
- L1-2 论证三支柱是输出格式的清单、不是理论维度。
- L1-3 论证存储下全部状态是物理上不可能的,每个体系都在做认识论选择。
- L1-4 论证当被观测对象变成 LLM,前三篇建立的理论必须被部分重写。
如果你在这四篇里只记一句话,应该是这句:
你看到的工具长什么样,决定于你看的是什么。
下一阶段进入 L4:在这个理论框架上,一项一项展开 AI 可观测的具体工程实现——prompt tracing 的 schema 设计、agent trace 的数据模型、online eval 的代价控制、embedding drift 的检测方法、LLM-as-Judge 的偏见治理、GenAI Semantic Conventions 的当前状态与未来。
L2、L3(系统内部与生产实践)会在 L4 之后展开。
10. Key Takeaways
- 被观测对象变了:从 Kalman 假设的确定性动态系统,变成概率分布生成器——状态、转移、输出方程全部改变。
- 三个回声的命运:状态可推断性部分有效(外壳可追内核黑盒)、可控性对偶几乎失效(只能扰动分布不能驱动状态)、状态空间维度指数恶化(每个 prompt 几乎独特)。
- OTel GenAI Semantic Conventions 必要但不够——它只覆盖外壳;内核(质量、推理过程、replay 状态)需要新工具。
- 质量是可观测的第四维,更接近判断而非测量——LLM-as-Judge 是当下答案,但有约 28% 的位置偏见等系统性问题。
- 非确定性破坏了 debugging——replay 取代 reproduce,但 replay 要冻结模型 / 温度 / 工具响应,反过来撞回基数问题。
- SRE 的"观测→自动干预"闭环在 LLM 上不能照搬——因为可控性对偶失效;质量下降通常只能告警让人介入。
11. 参考
- Kalman, R. E. (1960). On the General Theory of Control Systems. IFAC.
- Zheng, L., et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. NeurIPS 2023——LLM-as-Judge 位置偏见与自我偏好的实证测量。
- Turpin, M., et al. (2023). Language Models Don’t Always Say What They Think: Unfaithful Explanations in Chain-of-Thought Prompting. NeurIPS 2023——CoT 输出与真实推理不一致的实证。
- OpenTelemetry GenAI Semantic Conventions. github.com/open-telemetry/semantic-conventions——本文引用的
gen_ai.*命名空间标准。 - OpenAI API Documentation. Reproducible outputs——
seed参数的"best effort"声明。