No-Evidence No-Model Short-Circuit
当应用在模型调用前已经能确定当前没有任何可采纳业务证据时,直接确定性返回 insufficient/abstain,而不是把“没有证据”交给 LLM 再猜一次。
[!info] related notes
- 所属 MOC: agent-evals-moc
- 前置概念: agent-evidence-consistency-contract、agent-behavioral-contract
- 并列概念:
- 易混淆概念:
- 关系笔记:
No-Evidence No-Model Short-Circuit
一句话定义
No-Evidence No-Model Short-Circuit 是一个运行时原则:如果应用在调用模型之前已经能够确定“当前没有任何可采纳的业务证据”,就直接由确定性逻辑返回 insufficient / abstain,而不是调用 LLM 让它在空证据上生成结果。
admissible evidence catalog = ∅
→ model call unnecessary
→ deterministic insufficient result
为什么这是正确性问题,不只是省 Token
最直接的收益当然是:
requests = 0
tokens = 0
latency ↓
cost ↓
但更重要的是,它缩小了错误空间。
如果系统明明知道:
没有 posture evidence
没有 report evidence
没有 confirmed BodyState evidence
却仍把请求交给模型:
“请完成一次 Assessment”
模型会面对一个不合理任务:
必须产出东西
+
没有东西可以依据
如果 schema 还要求 completed => observations.length > 0,这种压力甚至会主动鼓励模型编造。
所以:
能在 deterministic shell 判定的“不知道”,不要再让 stochastic core 猜一次。
基本流程
Frozen Input
↓
Build Authoritative Evidence Catalog
↓
Catalog empty?
├─ yes → deterministic insufficient_information
│ model_executed = false
│ observations = []
│ durable mutation = none
│
└─ no → resolve configuration / call model
→ evidence contract
→ durable projection
关键点是 short-circuit 发生在:
model resolution / model invocation 之前
而不是模型已经调用后再把结果丢掉。
“没有证据”必须按 Admissible Evidence 判断
不能只检查原始输入是否为空。
例如 BodyState 里有一条记录:
review_state = unverified
excluded_from_reasoning = true
物理上数据存在,但它不能成为当前推理证据。
因此真正的判断是:
raw input exists
≠ usable evidence exists
应该先经过:
source collection
→ lifecycle/review filtering
→ admissibility
→ authoritative catalog
再判断 catalog 是否为空。
为什么 Profile 通常不能阻止 Short-Circuit
用户可能有:
birth_date
gender
account/profile metadata
这些信息可以是稳定身份上下文,但如果业务问题是:
“当前有哪些健康/体态 observation?”
Profile 的存在本身并不意味着有 health evidence。
否则系统会出现:
用户填写了生日
→ 系统认为“有资料”
→ 调模型生成健康观察
所以 evidence domain 必须和任务语义对应。
输出应该是什么
一个好的 no-evidence path 应显式表达:
status = insufficient_information
observations = []
evidence_coverage = insufficient
missing domains = ...
而不是伪造:
health_grade = D
score = 0
score = 50
“亚健康倾向”
“未知”不能通过一个看起来像健康判断的默认值来表达。
Provenance 也要如实表达“模型没有运行”
Short-circuit 后审计信息不能仍然写:
status = generated
model_executed = true
否则结果虽然正确,trace 却在说谎。
推荐明确记录:
execution_status = skipped_no_evidence
model_executed = false
usage.requests = 0
usage.tokens = 0
phase = deterministic_derivation
这对:
- audit;
- cost accounting;
- replay;
- regression export;
- incident diagnosis
都很重要。
Short-Circuit 与 Abstain 的关系
它们相关但不完全相同。
No-Evidence Short-Circuit
在模型前就能确定:
没有可用证据
所以直接不调用模型。
Model/Policy Abstain
系统可能拥有部分 evidence,模型也运行了,但:
critical uncertainty remains
risk too high
policy forbids action
于是最终 abstain。
因此:
no-evidence short-circuit
⊂ deterministic degradation paths
不是所有 abstain 都意味着模型不该运行。
为什么这能改善测试稳定性
如果 Profile-only case 仍调用真实模型,测试只能断言:
希望模型别乱说
换成 short-circuit 后,可以精确断言:
model call count == 0
status == insufficient_information
observations == []
BodyState revision unchanged
这是一个真正的 hard behavioral contract。
BodySense Assessment 示例
新 Assessment 在构建 evidence catalog 后,如果六个 evidence domains 全部缺失:
posture missing
exercise missing
lifestyle missing
anthropometry missing
health_report missing
injury_symptoms missing
则直接得到:
coverage = insufficient
status = insufficient_information
model_executed = false
并且:
BodyState 不新增 observation
revision 不变化
这比“调用模型,然后希望它返回空 observations”更强。
推荐测试
A. profile only
→ 0 model calls
→ insufficient_information
B. only unverified evidence
→ filtered catalog empty
→ 0 model calls
C. one confirmed lifestyle fact
→ catalog non-empty
→ model path may execute
D. no-evidence path
→ persistence unchanged
E. provenance
→ explicitly model_executed=false
常见误区
- 只要请求来了就应该调用模型:Agent runtime 可以先做 deterministic routing/gating。
- Short-circuit 只是优化成本:它同时减少 hallucination surface。
- 有任何 Profile 字段就算有 evidence:Evidence 必须与当前业务 claim 相关。
- 模型运行了但最终没用结果也一样:不一样;已经增加成本、延迟和不必要的随机路径。
- 结果正确就不需要记录 skipped provenance:审计必须区分 executed 与 derived-without-model。
最短记忆
系统已经确定“不知道”
→ 不要再问模型“你猜呢?”
把可确定的缺失状态留在 deterministic shell,是生产 Agent 控制随机性的一个重要方法。