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 在做的就是这件事,它必要但远远不够。

真正待解决的是:

  1. 新原语:在 trajectory 之上找到能同时描述 Agent、RAG、多模型协作的统一原语。
  2. 新维度:把质量 / 正确性变成可入库、可告警、可治理的可观测信号——同时承认它更接近判断而非测量。
  3. 新闭环:在可控性对偶失效的前提下,重新定义"观测 → 干预"的反馈机制(prompt 治理、模型路由、guardrail 编排都是不完整的答案)。
  4. 新存储:在状态空间无限维的前提下,重新设计"存什么、丢什么"——embedding 聚类、语义采样、按 trajectory 重要性采样都是早期尝试。
  5. 新调试:让 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"声明。