当模型违反格式时,如何基于重试策略保证 99.9% 可用?
解读
面试官真正想考察的是:在国内真实线上流量下,大模型输出结构化格式(JSON、XML、指定分隔符等)一旦失效,你如何系统性兜底,把单次请求失败率压到 0.1% 以下,并确保端到端 SLA 99.9%。
这不仅是“多试几次”,而是要让重试链路可观测、可灰度、可回滚,同时兼顾成本、时延、合规三大红线。
知识点
-
格式违反的根因分类
- 提示词歧义:中文语境下指令被淹没
- 温度/top-p 过高:生成自由度溢出
- 上下文超长:尾部截断导致括号未闭合
- 微调样本偏差:缺少边界 case
- 推理框架 bug:vLLM 张量并行时 special token 被误截
-
可用性计算模型
单请求失败率 p,最多重试 N 次,则累计可用性
A = 1 – p^(N+1)
要 A ≥ 99.9%,若 p=5%,解得 N ≥ 2;若 p=15%,需 N ≥ 4;必须先把 p 降到 3% 以内,否则重试成本指数级上涨。 -
国内机房与合规限制
- 跨省专线 RTT 30~50 ms,重试次数直接影响 P99 时延
- 日志落盘需脱敏+加密,避免《个人信息保护法》第 38 条跨境风险
- GPU 资源配额受信创政策约束,夜间弹性缩容窗口仅 4 小时,重试不能无限制堆卡
-
LLMOps 三级防线
- L1 prompt 工程:自研中文语法检查器+few-shot 模板
- L2 轻量后处理:正则+括号匹配+JSON Repair 库
- L3 重试策略:指数退避+熔断+多模型冗余
-
观测指标
- 格式失败率 = 违反格式次数 / 总请求
- 重试放大倍数 =(总下发请求 / 业务请求)– 1
- 重试回源耗时 = 首次失败到最终成功耗时
- 成本放大系数 = 重试额外 token 数 / 成功 token 数
答案
线上架构采用“三段式重试+多模型冗余”方案,实测格式失败率从 7% 降至 0.8%,重试放大倍数 1.3,P99 时延 1.8 s,整体 SLA 99.92%。
-
L0 准入过滤
用户输入先过敏感词+安全模型,拒绝率 2%,避免后续无意义重试。 -
L1 零成本修正(0 ms)
大模型输出立即进入结构化验证器(基于 Lark 语法树+自定义 CFG),可自动补全括号、转义符;70% 轻微格式错误在此层被修复,无需重试。 -
L2 同模型重试(≤2 次)
若验证器无法修复,触发同节点重试:- 动态升高 presence penalty 0.1→0.3,降低 temperature 0.2→0.1
- 在 prompt 尾部追加**“请严格按照上述 JSON Schema 返回,不要添加任何解释”**
- 采用指数退避 200 ms、400 ms,单卡并发 8→4 降载,防止 GPU 排队放大时延
该层额外成功率 18%,重试放大 0.25。
-
L3 异构模型冗余(≤1 次)
若 L2 仍失败,请求被路由到备用模型(百亿参数蒸馏版,温度固定 0.01,输出长度限制 512 token),通过专线 VPC 内网调用,RTT < 20 ms。
备用模型格式失败率 1.2%,与主模型错误分布正交,可将联合失败率压到 0.8% × 1.2% ≈ 0.01%,满足 99.9% 可用。 -
熔断与成本兜底
- 重试总耗时超过 1.5 s 即熔断,返回缓存的默认结构(带 warn 字段),保证最坏情况仍有响应
- 按租户级别设置重试预算:每 1k 请求最多 300 次额外 token,超出即降级到规则模板,避免账单爆炸
- 所有重试日志写入Kafka->Iceberg,通过 Flink 实时计算“格式失败率+重试放大”,5 分钟级告警
-
灰度与回滚
新 prompt 模板先在金丝雀 5% 流量验证,格式失败率高于 2% 即自动回滚到上一版本,无需人工介入。
拓展思考
-
强化学习微调(RLHF)能否替代重试?
在国内数据标注成本 0.4 元/条的现状下,1 万条高质量格式对齐样本即可让格式失败率再降 30%,但需2 张 A100 训练 6 小时,ROI 临界点为日活 50 万请求以上;低于此规模,重试策略仍是最经济方案。 -
边缘场景
对于车载离线 GPU Orin 芯片,无冗余模型,可用静态语法修复+本地 200 MB 规则库兜底,重试次数限定 1 次,牺牲 0.5% 可用性换取P99 时延 < 600 ms。 -
合规升级
未来若《生成式 AI 备案新规》要求输出可溯源,需在重试链路里引入链上哈希,每次重试生成独立 request_id并写入国密 SM3 摘要,确保审计方可在 10 秒内定位任意一次重试记录,此时重试策略需额外预留5% 的 CPU 周期做摘要计算。