LLM 批量校验全量走 fallback?容量门控超限的全有全无陷阱
生产环境首跑一个 LLM 批量校验任务,日志一片绿、状态成功——但检查输出发现 2449 个待校验对象全部标成了降级标记,实际 LLM 调用次数为零。「语义校验默认开启」的功能,等于一次都没开过。
在开发 AI运营 时遇到此问题——基于大语言模型的智能分析平台,自动洞察市场趋势、用户行为与销售数据;这个校验任务跑在其数据管道的标题优化环节。
TL;DR
容量门控按「预计量 ≤ 上限」做全有全无判断:试设的 cap 是 400,生产实际是 2449 个词×商品对,超限 → 整批降级、零 LLM 调用,且任务状态照样是成功。教训两条:容量上限必须用生产实测规模校准;超限降级应按单位粒度(分组/排队/截断)进行,并让「fallback 率 100%」这种异常可被观测。
问题现象
任务的 Layer2 是 LLM 语义校验,入口有一个容量门控:
def semantic_validate(pairs, cap=400):
if len(pairs) > cap:
# 超限:整批降级,一次 LLM 都不调
return [mark_overflow(p) for p in pairs]
return [llm_validate(p) for p in pairs]
生产首跑结果:
待校验词×商品对:2449/2449 全部 语义校验方式='overflow'
LLM 实际调用:0 次
任务状态:success(无任何报错)
如果只看「跑完没有」,一切正常;只有检查输出列的分布,才发现功能整体失效。
根因
两层问题叠加。第一层是数值:cap 试设 400,而生产规模是 60 个市场词×同类目商品 + 50 个本店词×商品、共 92 个商品,对数直接到 2449——预估和实测差了一个数量级。第二层是结构:门控是全有全无,超限即整批降级。「这是一个容量约束」的初衷,实际效果是「超限 = 功能整体关闭」,而且降级发生在数据列里、不抛错不打日志,完全静默。
这类「看起来成功、实际没干活」的静默失败和 DeepSeek thinking 吃满输出预算导致空回复静默兜底是同一个家族:错误被兜底逻辑消化,表面上永远 success。
解决方案
步骤 1:用生产实测规模校准 cap
上线前先统计真实待处理量,别用拍脑袋的预估值:
# dry-run:只统计规模,不产生 LLM 调用
python -c "from pipeline import build_pairs; print(len(build_pairs(shop='prod')))"
实测 2449 → cap 设 3000(约 1.2~2 倍余量),同时确认超大店铺超出时仍有降级路径,不会撞墙。
步骤 2:把调用粒度从「总量」改为「分组」
按商品分组调用,让调用次数随商品数线性增长,而不是随 词数×商品数 的乘积暴涨:
def semantic_validate(pairs, cap):
groups = group_by_product(pairs) # 92 商品 → ~92 次调用/轮
results = []
for g in groups:
if within_budget(g, cap): # 按组判断,不整批放弃
results.extend(llm_validate(g))
else:
log.warning("capacity gate: group degraded",
extra={"size": len(g), "cap": cap})
results.extend([mark_overflow(p) for p in g])
return results
本例校准后第三跑实测 2449/2449 全部走 LLM 校验;更大的店铺超出时按组降级,不再一损俱损。
步骤 3:让降级可观测
给降级路径埋点,并对异常比例告警(如 fallback 率 > 50%)。降级是安全网,不是掩体——它应该被看见,而不是替你掩盖超限。
注意事项
- 容量类参数(cap、并发、批量大小)上线前必须用生产实测规模校准;测试环境的小样本永远撑不出生产数量级。
- 全有全无门控只适合「成本硬上限」场景,且必须伴随显式告警;否则它就是一颗静默关闭功能的开关。
- 降级动作要落在独立可查询的字段/指标上(本例是
语义校验方式列),验收时先看分布、再看对错。 - LLM 输出还有一类静默失败来自结构化校验,见 用 Zod 校验 LLM 输出却静默失败?别用 .strict()。
常见问题
LLM 管道里的 fallback 机制应该怎么设计?
降级粒度尽量小——按条或按组降级,而不是整批放弃;降级动作必须留痕(标记列、日志、指标)并配置告警。全有全无式门控一旦触发等于整个功能关闭,只适合成本硬上限场景,且要显式报警。
LLM 批量任务的容量上限怎么定?
不能拍脑袋。先在生产规模或等比样本上跑一次 dry-run 统计实际待处理量,上限设为实测值的 1.5~2 倍,并随业务规模增长定期复核。预估与实测差一个数量级,是这类事故的标配。
怎么发现 LLM 任务被静默降级了?
任务状态往往仍是成功,必须检查输出:统计降级标记列的占比、核对实际 LLM 调用次数是否与预期一致。fallback 率异常(尤其 100%)应配置告警,把静默失败变成显式信号。