系列 《评测、可观测与可追溯:怎么知道改了之后更好了》 第 7 / 7 篇 进阶
系列总览 — 为什么这样组织、读它需要什么、读完能做什么
学习地图 — AI 应用工程师学习地图 第 5 / 7 个系列
前六篇讲的是上线前(评测)与上线后看(可观测、可追溯)。这一篇讲两件补充的事。第一件是运行时:上线后在请求路径上拦住坏输出——guardrails、置信度与拒答、幻觉检测、fallback——它们是评测发现的失效模式在生产里的最后一道网。第二件是物理世界:自动驾驶、机器人、工业控制的失败可能致命且不可逆,”评测”不能在真实世界里做,于是验证被做成了一门独立的工程——仿真。地图把它作为应用栈的对照案例;这一篇讲仿真的层次、开环与闭环、sim-to-real、覆盖率与长尾、影子模式,以及它与数字 agent 的沙箱环境、录制回放、红队集的同构关系。
本篇要回答的核心问题是:
运行时 guardrails 在哪一步拦什么,幻觉检测的实际手段与成本是什么?1 物理世界的仿真有哪些层次,开环与闭环、sim-to-real、覆盖率各是什么问题?2 影子模式与 HIL / SIL 是什么,数字 agent 的评测与物理世界的验证有什么同构?3
一、总览
1. 两条防线
%%{init: {"flowchart": {"wrappingWidth": 320}}}%%
%% 图:请求路径上的两道检查与 fallback;评测发现的失效模式做成运行时检查
flowchart TB
U["请求"] --> I["输入侧检查:注入特征、越界请求、敏感信息(只降概率,不是防线)"]
I --> LLM["模型 / agent"]
LLM --> O["输出侧检查:schema、引用是否存在、置信度、幻觉检测、敏感词"]
O -- "通过" --> Rr["返回用户"]
O -- "不通过" --> FB["fallback:拒答 + 说明 / 降级到更保守的 prompt 或模型 / 转人工"]
E["上线前的评测(第一到四篇)发现的失效模式"] -. "做成运行时检查" .-> O
| 上线前 | 运行时 | |
|---|---|---|
| 目的 | 证明改动更好(分布上) | 拦住这一次的坏输出(单次) |
| 手段 | 评测集、judge、门禁 | guardrails、置信度、拒答、在线 judge 拦截、fallback |
| 代价 | 评测成本、发布延迟 | 每请求的延迟与成本、误拦 |
| 关系 | 评测发现失效模式 → 运行时加对应的拦截 → 拦截事件进 bad case 队列 → 评测集补 | 闭环 |
2. 物理与数字
| 数字 agent | 物理世界(自动驾驶 / 机器人) | |
|---|---|---|
| 失败的代价 | 可回滚(多数) | 不可逆、可能致命 |
| 能在生产里试吗 | 灰度、影子可以 | 不行——验证在真实世界之外 |
| “测试环境” | 容器快照、录制回放、评测集 | 仿真(一门工程)、日志回放、影子模式、封闭场地 |
| 长尾 | bad case 队列积累 | 仿真放大稀有场景 |
| 自主级别的判据 | 能自动验证到什么程度(《工具、Agent 与 harness(08):memory 与 human-in-the-loop》) | 同一判据的最严格版本:SAE 每升一级验证体系跳一个量级 |
3. 本文的章节安排
第二章运行时 guardrails;第三章置信度、拒答与幻觉检测;第四章 fallback;第五章物理世界为什么不能在生产里试;第六章仿真的层次;第七章开环 / 闭环、sim-to-real、覆盖率;第八章影子模式、HIL / SIL 与同构;第九章实践建议。
二、运行时 guardrails
1. 位置
%% 图:输入侧与输出侧检查的位置
flowchart TB
U["用户输入"] --> I["输入侧检查"]
I -->|"通过"| C["上下文组装"]
I --> B["拦"]
C --> M["模型"] --> O["输出侧检查"]
O -->|"通过"| A["工具 / 呈现"]
O --> F["拦 / 改写 / 重试 / 降级"]
classDef check fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef stop fill:#fdecea,stroke:#c0392b,color:#222
class I,O check
class B,F stop
2. 输入侧
| 检查 | 手段 | 动作 |
|---|---|---|
| 注入 | 规则(已知模式)+ 分类器 + 对工具返回的隔离标记 | 标记 / 拒绝 / 降低该段内容的权重 |
| 敏感信息 | PII 识别 | 脱敏后继续,或拒绝 |
| 越界请求 | 分类器(这不是本产品处理的事) | 拒答出口 |
| 长度与格式 | 规则 | 截断 / 拒绝 |
| 速率与配额 | 《模型作为组件(06):客户端工程——重试、超时、幂等、限流与流式解析》 | 限流 |
输入侧对注入的检测只是降低概率——真正的防线是 《工具、Agent 与 harness(05):权限、沙箱与安全边界》的四层与 L6 的分层防御;这里的检查是第一层。
3. 输出侧
| 检查 | 手段 | 动作 |
|---|---|---|
| 格式与 schema | 规则(《Prompt 与上下文工程(03):结构化输出——约束解码、schema 设计与失败修复》的解析层) | 带错误重试一次 → 降级 |
| 业务校验 | 规则(金额范围、日期合法、id 存在) | 同上 |
| 引用存在性 | 规则(引用的块 id 在检索结果里) | 去掉无依据的断言或重试 |
| 敏感信息 | PII / 凭据识别 | 脱敏 / 拦 |
| 有害内容 | 分类器 | 拦 + 记录 |
| 忠实度(抽样) | 在线 judge(第四篇) | 低分标记;高风险场景同步拦 |
| 动作 | 《工具、Agent 与 harness(05):权限、沙箱与安全边界》的四层 | 权限 / 审批 / 沙箱 |
4. 代价
每项检查加延迟(规则微秒到毫秒、分类器几十毫秒、judge 几百毫秒到秒)与误拦率——把正常请求拒了是另一种失败(第三篇的误拒率)。同步拦截只放在高风险路径(对外发送、不可逆动作、合规敏感),其他走异步标记进队列。
%% 图:运行时 guardrails 的位置与代价——输入侧(注入 · PII · 越界 · 长度 · 限流)在上下文组装之前拦;输出侧(schema · 业务校验 · 引用存在 · PII · 有害 · 忠实度 · 动作四层)在工具执行与呈现之前拦 / 改写 / 重试 / 降级;规则微秒级同步做,分类器几十毫秒,judge 几百毫秒只放在高风险路径同步、其余异步标记进队列
flowchart TB
U["用户输入 / 工具返回"] --> IN["输入侧检查<br/>注入模式(规则 + 分类器)· PII 脱敏 · 越界分类 · 长度 · 限流"]
IN -->|"通过 / 标记或降权后继续"| CTX["上下文组装 → 模型"]
IN -->|"拦"| BLOCK["拒绝 / 拒答"]
CTX --> OUT["输出侧检查<br/>schema · 业务校验 · 引用存在性 · PII / 凭据 · 有害内容"]
OUT -->|"过"| HR{"高风险路径?<br/>对外发送 · 不可逆 · 合规敏感"}
HR -->|"是"| SYNC["同步:忠实度 judge(几百 ms)+ 动作四层"]
HR -->|"否"| ACT["工具执行 / 呈现"]
HR -. "否:异步抽样" .-> ASYNC["异步:judge 抽样标记进队列<br/>不加请求路径延迟"]
SYNC -->|"通过"| ACT
SYNC -->|"不过"| STOP["拦"]
OUT -->|"不过"| FIX["带错误重试一次 → 降级 / 拒答出口"]
C["代价:每项检查加延迟 + 误拦率<br/>规则 µs · 分类器几十 ms · judge 几百 ms–s"] -.-> OUT
classDef n fill:#fff7e0,stroke:#c98a00,color:#222
classDef dec fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef ok fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef bad fill:#fdecea,stroke:#c0392b,color:#222
class U,IN,CTX,OUT,SYNC,ASYNC n
class HR dec
class ACT ok
class BLOCK,STOP,FIX,C bad
三、置信度、拒答与幻觉检测
1. 模型没有可靠的置信度
模型说”我确定”不代表确定(《模型作为组件(01):失效模式——非确定性、幻觉、上下文与越界,把「模型会出错」拆成七条可检测的性质》)。可用的信号:结构化输出里的显式拒答出口(《Prompt 与上下文工程(03):结构化输出——约束解码、schema 设计与失败修复》)——模型自己说”信息不足”比自己打的置信分可靠;logprobs(部分 API 提供)对短答案有一定校准;自一致性——同一问题采样 k 次看一致率,一致率低说明不确定(成本 k 倍,只用于高风险)。
2. 拒答的设计
该拒的拒、不该拒的不拒(第三篇的两半)。运行时:拒答出口被触发时给用户的呈现(L7)——说明缺什么、下一步能做什么,而不是一句”无法回答”;拒答率进面板(骤升 = 检索 / 权限 / 模型出问题——《检索与知识接入(07):检索评测与运营》)。
3. 幻觉检测的实际手段
| 手段 | 做法 | 成本 | 适用 |
|---|---|---|---|
| 引用对照 | 答案的每个断言必须能定位到检索结果的某块(规则 + 轻量 judge) | 低到中 | RAG |
| 自一致性 | k 次采样,断言在多数样本里出现才保留 | k 倍 | 高风险单步 |
| 事实核对工具 | 让模型(或另一个 agent)用检索 / 计算器验证关键断言 | 中到高 | 数字、日期、实体 |
| 结构化证据 | schema 里要求每个结论带 evidence 字段引用原文 |
低 | 抽取、分类 |
| 结果校验 | agent 声称完成 → 读回状态核对(《工具、Agent 与 harness(09):可靠性、评测与运营 agent》) | 低 | agent |
| judge 抽样 | faithfulness judge 跑在流量抽样上 | 中 | 全部(异步) |
没有一种能”检测所有幻觉”;能做的是让高风险断言必须有依据、没有依据的不呈现为事实(L7 的呈现)。
四、fallback
《模型作为组件(06):客户端工程——重试、超时、幂等、限流与流式解析》讲了方向性:推理状态不可跨供应商、加密的压缩 item 不可跨供应商、工具 schema 的方言差异。运行时 fallback 的层次:重试(同模型,瞬时错误)→ 降档(同家族更小的模型,容量或超时)→ 跨供应商(大故障;会话状态要可读才能带过去)→ 降级到非模型路径(规则回答、转人工、”稍后再试”)。每一级的触发条件、超时预算(《模型作为组件(06):客户端工程——重试、超时、幂等、限流与流式解析》的四层超时)、以及 fallback 后的质量标记(这次回答来自降档模型——进 trace,评测时分开看)。
%% 图:运行时 fallback 的四级梯子——瞬时错误先同模型重试;容量或超时降档到同家族更小模型;大故障跨供应商(会话状态要可读才能带过去,加密压缩 item 与推理状态带不过去);最后降级到非模型路径:规则回答、转人工、稍后再试;每一级触发条件不同,fallback 后的回答在 trace 里标来源
flowchart TB
E["一次调用失败"] --> L1{"瞬时?429 · 5xx · 网络"}
L1 -->|"是"| R1["① 重试:同模型<br/>退避 + 抖动 · 重试预算"]
L1 -->|"容量 / 超时持续"| R2["② 降档:同家族更小模型<br/>Opus → Sonnet"]
R2 -->|"整家不可用"| R3["③ 跨供应商<br/>会话状态要可读 · 推理状态与加密压缩 item 带不过去 · prompt 可能要调"]
R3 -->|"都不行"| R4["④ 非模型路径<br/>规则回答 · 缓存答案 · 转人工 · 「稍后再试」"]
R1 & R2 & R3 -.->|"trace 标记:这次回答来自哪一级"| T["评测时分开看"]
classDef dec fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef a fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef b fill:#fff7e0,stroke:#c98a00,color:#222
classDef c fill:#fdecea,stroke:#c0392b,color:#222
class L1 dec
class R1 a
class R2,R3 b
class R4 c
class E,T b
五、物理世界为什么不能在生产里试
一次自动驾驶的失败可能致命、不可逆、且发生在你控制不了的环境里;一次机器人的失败可能损坏设备与伤人;一次工业控制的失败可能停产。数字 agent 的”灰度 1% 流量看看”在这里不成立——1% 的车祸不是可接受的实验代价。于是验证被推到真实世界之外:仿真、日志回放、影子模式、封闭场地,最后才是有安全员的真实道路。这条路径与 《工具、Agent 与 harness(08):memory 与 human-in-the-loop》的六级人机分工同构:SAE L2 → L3 → L4 每升一级,对应的不是模型换了一代,是验证体系跳了一个量级。
六、仿真的层次
| 层 | 做什么 | 优点 | 局限 | 代表 |
|---|---|---|---|---|
| 场景仿真 | 可编程的场景(车、人、天气、路况)与物理引擎,系统在其中闭环运行 | 可复现、可参数化、能放大稀有场景(”雨夜横穿的行人”生成一万种变体) | 渲染与行为模型与真实有差距 | CARLA 一类开源仿真器;各厂自建 |
| 日志回放 | 真实采集的传感器数据重放给感知与规划模块 | 真实数据、覆盖真实分布 | 开环:系统的动作不改变后续输入(你刹车了,回放里的车还是照原来的轨迹开) | 各厂的回放平台 |
| 传感器仿真 | 渲染相机 / 激光雷达 / 雷达的物理级信号 | 测感知模块 | 渲染真实度、传感器噪声模型 | 游戏引擎 + 物理渲染;神经渲染 |
| 数字孪生 | 特定场地(工厂、港口、园区)的高保真复制 | 对固定场景极准 | 只覆盖该场地 | 工业机器人、物流 |
| 世界模型生成 | 用生成模型合成场景与传感器数据(文本 / 布局 → 视频) | 长尾场景的多样性、成本低 | 生成的物理一致性、与真实分布的差距要验证 | NVIDIA Cosmos 一类世界基础模型;各厂的生成式仿真 |
| 封闭场地 | 真车真机器人在受控场地 | 真实物理 | 贵、慢、场景有限 | 测试场 |
一个成熟的验证体系是这些层的组合:场景仿真跑百万级场景、日志回放跑真实分布、传感器仿真验感知、封闭场地验物理、真实道路验整体——与数字世界的”单元测试 → 集成 → 影子 → 灰度”是同一形状。
%% 图:自动驾驶的验证漏斗与数字 agent 的同构——百万级场景仿真(闭环、可放大长尾)→ 日志回放(真实分布、开环)→ 传感器仿真验感知 → 封闭场地验物理 → 影子模式(真车真路、不控制)→ 有安全员的真实道路;右边是数字世界的同一形状:单元测试 → 录制回放 → 容器评测 → 影子 → 灰度 → 全量
flowchart TB
subgraph PHY["物理世界:验证在真实世界之外"]
direction TB
P1["场景仿真:百万级场景 · 闭环 · 放大长尾"] --> P2["日志回放:真实传感器数据 · 开环"] --> P3["传感器仿真:验感知模块"] --> P4["封闭场地:真车真机器人"] --> P5["影子模式:真路上读全部、决策全部、不控制"] --> P6["真实道路 + 安全员"]
end
subgraph DIG["数字 agent"]
direction TB
D1["单元测试 · 容器快照的闭环评测"] --> D2["录制回放:开环"] --> D3["集成测试:接真实工具(沙箱账户)"] --> D4["影子模式:新旧并跑只记录"] --> D5["灰度 1–5%"] --> D6["全量"]
end
PHY ~~~ DIG
classDef p fill:#fff7e0,stroke:#c98a00,color:#222
classDef d fill:#eefaf0,stroke:#4d9a5c,color:#222
class P1,P2,P3,P4,P5,P6 p
class D1,D2,D3,D4,D5,D6 d
七、开环、闭环、sim-to-real、覆盖率
1. 开环 vs 闭环
开环:输入固定(回放),看系统的输出对不对(感知识别对了吗、规划给的轨迹合理吗)——便宜、真实数据、但测不了决策的后果。闭环:系统的动作改变环境,环境再给新输入(仿真器)——能测”刹车之后会怎样”、多步决策的累积效应、与其他参与者的交互。数字 agent 的对应:录制回放是开环(模型输出固定,看应用侧),带环境快照的 agent 评测是闭环(agent 的动作改变仓库状态,下一步看到新状态)。决策系统必须有闭环评测——两个世界都是。
%% 图:开环与闭环——开环:输入是固定的回放,系统输出不改变后续输入(你刹车了,回放里的车还是照原轨迹开),便宜、真实、但测不了决策的后果;闭环:系统的动作改变环境,环境再给新输入,能测「刹车之后会怎样」;数字 agent 里录制回放是开环、带环境快照的 agent 评测是闭环
flowchart TB
subgraph OPEN["开环:日志回放 / 录制回放"]
direction LR
O1["固定输入 t₁"] --> S1["系统"] --> O2["输出:刹车"]
O3["固定输入 t₂(车照原轨迹开)"] --> S1
O2 -.-|"不影响"| O3
end
subgraph CLOSED["闭环:场景仿真 / 环境快照评测"]
direction LR
C1["输入 t₁"] --> S2["系统"] --> C2["动作:刹车"]
C2 --> ENV["环境 / 仿真器:车距变大、后车反应"]
ENV --> C3["新输入 t₂"] --> S2
end
OPEN ~~~ CLOSED
OPEN -.- N1["便宜 · 真实分布 · 测感知与非决策部分"]
CLOSED -.- N2["测决策的后果 · 多步累积 · 与他人的交互<br/>决策系统必须有它"]
classDef o fill:#fff7e0,stroke:#c98a00,color:#222
classDef c fill:#eefaf0,stroke:#4d9a5c,color:#222
classDef n fill:#eef6ff,stroke:#5b8fd6,color:#222
class O1,O2,O3,S1 o
class C1,C2,C3,S2,ENV c
class N1,N2 n
2. sim-to-real 差距
仿真里 99.99% 通过不等于真实世界 99.99%:渲染差异、物理简化、行为模型(仿真里的行人不像真人)、传感器噪声。手段:域随机化(在仿真里随机化光照、纹理、噪声让系统对差异鲁棒)、用真实数据校准仿真(回放与仿真的输出差异作为仿真真实度的度量)、神经渲染与世界模型缩小视觉差距、封闭场地与真实道路作为最终校准。数字 agent 的对应是第四篇的”离线—在线相关性”:评测集分数能否预测线上表现——同一个问题。
3. 覆盖率与长尾
几百万公里的真实里程覆盖不了每百万公里一次的事件;而这些稀有事件正是致命的。仿真的核心价值是放大长尾:从真实日志里挖出稀有场景 → 参数化 → 生成成千上万变体 → 闭环跑。覆盖率的度量:场景库的维度覆盖(天气 × 路况 × 参与者 × 行为)、真实日志里出现的场景类型有多少在仿真库里有对应、新采集的日志里”仿真库没见过”的比例(它下降说明覆盖在收敛)。数字 agent 的对应:评测集的类型覆盖、bad case 队列里”分类不了的新类”的比例(第六篇)。
%% 图:用仿真放大长尾——几百万公里的真实里程里「雨夜横穿的行人」只出现几次;从日志里挖出这个场景、参数化(雨量 · 光照 · 行人速度 · 距离 · 车速)、生成一万种变体、闭环跑,把每百万公里一次的事件变成可以反复测的东西;覆盖率看新日志里「仿真库没见过」的比例是否在下降
flowchart TB
LOG["真实日志:几百万公里<br/>「雨夜横穿的行人」出现 3 次"] --> MINE["挖出稀有场景"]
MINE --> PARAM["参数化<br/>雨量 · 光照 · 行人速度 · 出现距离 · 车速 · 路面"]
PARAM --> GEN["生成 10,000 种变体<br/>场景仿真 / 世界模型生成"]
GEN --> RUN["闭环跑 → 失败的变体进回归库"]
NEW["新采集的日志"] --> COV{"仿真库里有对应场景?"}
COV -->|"有"| OK["覆盖"]
COV -->|"没有:新类"| MINE
COV -.- M["度量:「没见过」的比例下降 = 覆盖在收敛<br/>数字 agent 的对应:bad case 里分类不了的新类比例"]
classDef n fill:#fff7e0,stroke:#c98a00,color:#222
classDef dec fill:#eef6ff,stroke:#5b8fd6,color:#222
classDef ok fill:#eefaf0,stroke:#4d9a5c,color:#222
class LOG,MINE,PARAM,GEN,RUN,NEW n
class COV dec
class OK,M ok
八、影子模式、HIL / SIL 与同构
1. 影子模式
新版本的软件在车上跑,读全部传感器、做全部决策,但不控制车;它的决策与当前版本(或人类驾驶员)的决策对比,差异大的场景被记录、上传、进入仿真库。真实分布、真实硬件、零风险。Tesla 一类公开描述过这种做法。数字世界的影子模式(第四篇:新旧版本并跑只记录)是同一思想——只是数字世界还能灰度,物理世界影子几乎是上路前的最后一步。
2. HIL / SIL
SIL(软件在环):软件在仿真环境里跑,全部虚拟;HIL(硬件在环):真实的控制器硬件接仿真的传感器与执行器信号——测时序、硬件与软件的交互、实时性。数字 agent 的对应:SIL 是容器里的评测,HIL 是接真实的外部 API 与工具(但在沙箱账户里)。
3. 同构表
| 物理世界 | 数字 agent | 共同的原则 |
|---|---|---|
| 场景仿真 | 容器快照的 agent 评测环境 | 可复现、可参数化的闭环环境 |
| 日志回放 | 录制回放 | 开环,测非决策部分 |
| 长尾场景放大 | 红队集、bad case 变换扩增 | 稀有失败要主动制造 |
| sim-to-real | 离线—在线相关性 | 测试环境要能预测生产 |
| 覆盖率 | 评测集类型覆盖、新类比例 | 不知道没覆盖什么最危险 |
| 影子模式 | 影子模式 | 真实分布零风险 |
| SAE 分级 | 六级人机分工 | 验证决定自主 |
| 事故调查与场景回灌 | 事后分析 → 评测集 | 事故是最贵的用例 |
物理世界的代价高几个量级,所以它把这些做成了工程学科;数字 agent 正在低代价地重走这条路——两边可以互相借方法。
九、实践建议
- 列运行时 guardrails 表:输入侧与输出侧各查什么、用规则还是分类器还是 judge、同步拦还是异步标、误拦率多少;同步只放高风险路径。
- 高风险断言必须有依据:引用对照 + 结构化证据字段;没有依据的不呈现为事实。
- fallback 四级(重试 → 降档 → 跨供应商 → 非模型路径),每级触发条件与超时,fallback 标记进 trace。
- agent 评测必须有闭环环境(快照 + 动作改变状态),录制回放只用于开环回归。
- 做物理世界的团队:画出仿真层次与各层覆盖,量 sim-to-real 差距(回放 vs 仿真输出),维护场景库覆盖率与”新场景比例”,上路前影子。
- 借对方的方法:数字 agent 团队学场景库与覆盖率度量;物理团队学 bad case 队列与失败分类的运营。
十、本文小结
- 两条防线:上线前证明分布上更好,运行时拦这一次的坏输出;拦截事件回到 bad case 队列闭环。
- guardrails:输入侧(注入、PII、越界、长度、限流——只是第一层)、输出侧(格式、业务校验、引用存在、敏感、有害、抽样忠实度、动作四层);每项有延迟与误拦代价,同步只放高风险路径。
- 置信度不可靠:用显式拒答出口、logprobs(短答案)、自一致性(k 倍成本);幻觉检测六手段(引用对照、自一致性、事实核对、结构化证据、结果校验、judge 抽样),原则是高风险断言必须有依据。
- fallback 四级与方向性;标记进 trace。
- 物理世界不能在生产里试 → 验证在真实世界之外:场景仿真、日志回放(开环)、传感器仿真、数字孪生、世界模型生成、封闭场地;闭环才能测决策;sim-to-real 用域随机化与真实数据校准;仿真的核心价值是放大长尾,覆盖率用场景维度与”新场景比例”度量;影子模式零风险测真实分布;SIL / HIL。
- 同构:仿真 ↔ 容器评测环境、回放 ↔ 录制回放、长尾放大 ↔ 红队集、sim-to-real ↔ 离线在线相关性、覆盖率 ↔ 评测集覆盖、影子 ↔ 影子、SAE ↔ 六级、事故回灌 ↔ 事后分析。
十一、自测
-
一个对外发送邮件的 agent,团队想在发送前用 judge 同步检查忠实度,每次多 1.5 秒。合理吗?其他路径也要吗?
答案
合理——对外发送是不可逆的高风险路径,1.5 秒换一次拦截值得;同时应有引用对照与人审阅草稿(《工具、Agent 与 harness(08):memory 与 human-in-the-loop》的中间物)。其他低风险路径(内部草稿、只读查询)不要同步 judge,改异步抽样标记进队列——同步拦截的延迟与误拦要只花在高风险处。详见第二章。
-
为什么”让模型输出一个 0–1 的置信度”不是可靠的幻觉信号?有什么更可靠的替代?
答案
模型对自己的确定程度没有校准,”我 95% 确定”与实际正确率不对应(《模型作为组件(01):失效模式——非确定性、幻觉、上下文与越界,把「模型会出错」拆成七条可检测的性质》)。替代:显式拒答出口(模型说”信息不足”比打分可靠)、logprobs 对短答案的校准、自一致性(k 次采样看一致率)、引用对照(断言能否定位到检索结果)、结构化证据字段——原则是要依据不要自评分。详见第三章。
-
日志回放里新版本的规划模块给出了与旧版本不同的刹车决策,回放显示”通过”。为什么这个结论不可靠?该用什么?
答案
回放是开环:系统刹车了但回放里的其他车辆仍按原轨迹运动,看不到刹车之后的后果(后车追尾?前方情况变化?)。决策的后果只有闭环仿真能测——系统的动作改变环境、环境给新输入。日志回放只适合测感知等非决策部分。同理数字 agent 的决策要在带环境快照的闭环里评,录制回放只做开环回归。详见第七章。
-
仿真里 100 万个场景通过率 99.99%,真实道路测试的表现明显更差。列出三个可能原因与对应手段。
答案
sim-to-real 差距:(1)渲染 / 传感器噪声与真实不同——域随机化、神经渲染、用回放数据校准仿真;(2)仿真里其他参与者的行为模型不像真人——从真实日志学行为模型;(3)场景库覆盖不了真实长尾——用真实日志挖新场景回灌仿真库,监控”新场景比例”。度量差距本身:同一输入下回放与仿真的输出差异。详见第七章。
-
用同构表说明:数字 agent 团队的”bad case 队列 → 变换扩增 → 评测集”对应物理世界的什么?反过来物理世界的哪一项是数字团队最该借的?
答案
对应”事故 / 影子模式差异场景 → 参数化生成变体 → 场景库”——从真实失败挖场景、放大长尾、回灌测试环境。数字团队最该借的是覆盖率度量:场景库按维度的覆盖与”新采集里仿真库没见过的比例”——数字 agent 的评测集少有系统的覆盖度量,多靠 bad case 被动积累;主动定义类型维度并追踪”分类不了的新类比例”是可以直接搬的方法。详见第八章。
-
输入侧:注入(规则 + 分类器 + 工具返回隔离标记,只降概率,真防线在 L4 四层与 L6)、PII 脱敏、越界请求分类走拒答出口、长度格式、限流。输出侧:格式与 schema(带错误重试一次再降级)、业务校验、引用存在性(去掉无依据断言)、敏感与有害内容、抽样忠实度 judge、动作走 L4 四层。每项加延迟(规则毫秒、分类器几十毫秒、judge 几百毫秒到秒)与误拦率,同步拦截只放高风险路径(对外发送、不可逆、合规),其余异步标记进队列。置信度:模型自评分不可靠,用显式拒答出口、logprobs(短答案)、自一致性(k 倍成本)。幻觉检测六手段——引用对照(RAG,低到中)、自一致性(高风险单步,k 倍)、事实核对工具(数字日期实体,中到高)、结构化
evidence字段(低)、结果校验(agent,低)、judge 抽样(异步);原则是高风险断言必须有依据、无依据不呈现为事实。fallback 四级:重试 → 降档 → 跨供应商(状态要可读)→ 非模型路径,标记进 trace。详见第二章到第四章。 ↩ -
层次:场景仿真(可编程可复现可放大稀有场景,CARLA 一类;渲染与行为模型有差距)、日志回放(真实数据真实分布;开环)、传感器仿真(物理级相机 / 激光雷达 / 雷达信号,测感知)、数字孪生(特定场地高保真)、世界模型生成(生成模型合成场景与传感器数据,NVIDIA Cosmos 一类;物理一致性要验证)、封闭场地(真实物理,贵慢有限);成熟体系是组合。开环(输入固定看输出对不对,便宜真实但测不了后果)vs 闭环(动作改变环境再给新输入,能测决策后果与多步累积)——决策系统必须闭环,数字 agent 同理(录制回放开环、快照环境闭环)。sim-to-real:仿真通过率不等于真实——用域随机化、真实数据校准仿真(回放 vs 仿真输出差异作为真实度度量)、神经渲染与世界模型、封闭场地与真实道路最终校准;对应数字世界的离线—在线相关性。覆盖率与长尾:真实里程覆盖不了百万公里一次的致命事件,仿真的核心价值是从日志挖稀有场景 → 参数化 → 生成成千变体 → 闭环跑;度量用场景维度覆盖与”新采集里仿真库没见过的比例”。详见第五章到第七章。 ↩
-
影子模式:新版本在车上读全部传感器做全部决策但不控制,与当前版本或人的决策对比,差异大的场景记录上传进仿真库——真实分布、真实硬件、零风险,是上路前的最后一步;数字世界的影子(新旧并跑只记录)同一思想。SIL 软件在环全虚拟;HIL 真实控制器硬件接仿真信号测时序与实时性;数字对应是容器评测与接真实外部 API 的沙箱账户。同构:场景仿真 ↔ 容器快照评测环境(可复现闭环)、日志回放 ↔ 录制回放(开环)、长尾放大 ↔ 红队集与变换扩增(主动制造稀有失败)、sim-to-real ↔ 离线—在线相关性(测试环境要能预测生产)、覆盖率 ↔ 评测集类型覆盖与新类比例、影子 ↔ 影子、SAE 分级 ↔ 六级人机分工(验证决定自主)、事故调查回灌 ↔ 事后分析进评测集。物理世界代价高几个量级所以把这些做成了工程学科,数字 agent 低代价重走同一条路,两边互借方法——数字团队最该借覆盖率度量,物理团队可借 bad case 队列与失败分类运营。详见第八章。 ↩
系列 《评测、可观测与可追溯:怎么知道改了之后更好了》 第 7 / 7 篇 进阶
系列总览 — 为什么这样组织、读它需要什么、读完能做什么
学习地图 — AI 应用工程师学习地图 第 5 / 7 个系列
去 Series 挑下一个系列
本文由 arganzheng 创作,采用 CC BY 4.0 许可协议。在保留原文作者、署名以及完整原文链接(https://arganzheng.life/runtime-reliability-and-simulation-for-the-physical-world.html)的前提下,欢迎各种形式的转载、翻译或商业引用。
COMMENTS
评论存放在 GitHub Discussions, 用 GitHub 账号登录即可发表,支持 Markdown。 想针对正文某句话说?选中那段文字,点浮出的「评论」即可划线评论;觉得哪里写错了,发表时勾上「同时提交 Issue」。 有人回复你时 GitHub 会按你的通知设置发邮件,不用守在这里。