独立 AI 产品遇到模型故障:缓存、熔断和规则兜底
说明:本文以 AI 产品的容量压力说明限流与降级设计。成本、并发和时延相关数字均为示例,需结合供应商配额、预算与监控数据调整。
发布首个版本后的第三个小时,监控看板上的错误日志陡然拉升。刚从 Hacker News 和社群引流进来的第一批种子用户,正在频繁触发一个尴尬的 Toast 提示:“AI 生成失败,请稍后再试”。
在独立产品的冷启动阶段,种子用户对于 AI 工具的耐心极其有限。他们不会理会是 OpenAI 的 API 抖动、上游 Gateway 超时,还是模型在输出 JSON 时少生成了一个闭合括号。只要界面卡住或者抛出不友好的错误,用户就会毫不犹豫地下线,甚至在体验反馈群里贴出崩溃截图。
独立智能化工具在早期最忌讳的就是把“大模型的稳定性”当作“产品的稳定性”。LLM 本质上是一个具备随机性与时延波动的非确定性组件。要留住极其珍贵的第一批种子用户,系统应构建一套确定性的多阶降级与熔断防护网。
1. Product Hunt 跑流量的第一天:LLM 上游超时引发种子用户批量流失
很多独立开发者在本地测试时,习惯了 GPT-4o 几秒内顺畅吐出结果的完美体验。然而在实际的流量峰值下,API 延迟往往会从正常的 1.5 秒陡增至 15 秒以上,甚至频繁触发 HTTP 504 报头超时。
搜集当时真实排障的数据包,故障模式集中在三种类型:
冷启动阶段的推广渠道(如 Product Hunt、V2EX 或专业 Discord 社群)所带来的用户,都是怀着极高预期来试用产品的。如果连续发生两次超时或报错,次日留存率就会直接掉到个位数。
flowchart TD
A[种子用户发起 AI 功能请求] –> B{查询本地语义缓存 Semantic Cache}
B — 高相似度命中 –> C[直接返回离线缓存结果 <50ms]
B — 未命中 –> D[发起主模型 API 请求 (带 5s 超时控制)]
D — 成功且 JSON 校验通过 –> E[返回结果并异步写入缓存]
D — 超时/5xx错误/JSON解析失败 –> F{尝试轻量级备用模型 API}
F — 成功 –> E
F — 再次失败/熔断器打开 –> G[触发本地规则引擎/模版生成器]
G –> H[返回结构化兜底响应 + 标记"已降级" UI]
这套多阶降级机制的终极目标非常纯粹:哪怕 LLM 完全宕机,界面也绝不能白屏或抛出未捕获异常,应提供可用的兜底结果。
2. 状态机与多阶降级架构:从 Semantic Cache 到规则模板
为了在降低 API 成本的同时保证极高可用性,降级架构分为四个递进层级:
3. 示例性熔断与兜底拦截器代码实现
下面是在独立产品的 Node.js/TypeScript 服务端落地的一套完整熔断降级执行器。该模块集成了 Circuit Breaker(熔断器)、超时控制以及自动 JSON 结构修复机制。
import { EventEmitter } from 'events';
export interface FallbackOptions<T> {
timeoutMs: number;
primaryFn: (signal: AbortSignal) => Promise<string>;
fallbackModelFn: (signal: AbortSignal) => Promise<string>;
ruleEngineFallback: () => T;
schemaValidator: (raw: string) => T | null;
}
export enum CircuitState {
CLOSED, // 正常服务
OPEN, // 熔断开启(禁止请求上游)
HALF_OPEN // 半开尝试状态
}
export class LLMCircuitBreaker extends EventEmitter {
private failureCount = 0;
private successCount = 0;
private state: CircuitState = CircuitState.CLOSED;
private nextAttemptTime = 0;
constructor(
private threshold = 3, // 连续失败 3 次触发熔断
private resetTimeoutMs = 30000 // 熔断 30 秒后自动尝试恢复
) {
super();
}
public async execute<T>(options: FallbackOptions<T>): Promise<{ data: T; source: string }> {
const now = Date.now();
// 检查熔断状态
if (this.state === CircuitState.OPEN) {
if (now > this.nextAttemptTime) {
this.state = CircuitState.HALF_OPEN;
} else {
// 处于熔断保护期,直接触发最底层的规则降级
return { data: options.ruleEngineFallback(), source: 'rule-engine-circuit-open' };
}
}
// 1. 尝试主模型
try {
const rawPrimary = await this.callWithTimeout(options.primaryFn, options.timeoutMs);
const parsed = options.schemaValidator(rawPrimary);
if (parsed) {
this.onSuccess();
return { data: parsed, source: 'primary-model' };
}
} catch (err) {
this.onFailure();
}
// 2. 主模型失败,尝试备用小模型
try {
const rawFallback = await this.callWithTimeout(options.fallbackModelFn, options.timeoutMs / 2);
const parsedFallback = options.schemaValidator(rawFallback);
if (parsedFallback) {
return { data: parsedFallback, source: 'fallback-model' };
}
} catch (err) {
// 备用模型亦失败
}
// 3. 全链路异常,保底回退到规则引擎
return { data: options.ruleEngineFallback(), source: 'rule-engine-final-fallback' };
}
private async callWithTimeout(
fn: (signal: AbortSignal) => Promise<string>,
timeoutMs: number
): Promise<string> {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeoutMs);
try {
const result = await fn(controller.signal);
clearTimeout(timer);
return result;
} catch (err) {
clearTimeout(timer);
throw err;
}
}
private onSuccess() {
this.failureCount = 0;
if (this.state === CircuitState.HALF_OPEN) {
this.state = CircuitState.CLOSED;
}
}
private onFailure() {
this.failureCount++;
if (this.failureCount >= this.threshold) {
this.state = CircuitState.OPEN;
this.nextAttemptTime = Date.now() + this.resetTimeoutMs;
}
}
}
在 UI 层接收到 source: 'rule-engine-final-fallback' 状态时,前端不会向用户展示错误弹窗,而是弹下一个温和的黄色 Pill 标签:已自动使用精简模式生成。这样不仅保护了产品口碑,还将失败转化为了一种“可接受的功能降级”。
4. 冷启动阶段的工程总结:用确定性体验换取用户信任
在独立智能化产品的冷启动阶段,营销渠道和种子用户群体的拉新成本非常高昂。很多产品并非败在需求不够刚需,而是败在大模型非确定性响应带来的极差首屏体验上。
经过这套降级方案改造后,我们记录到了非常明显的数据变化:
归根结底,做智能化生产力工具,大模型只是其中的一个能力引擎。用严密、确定的工程架构将非确定性的 AI 能力包裹起来,才是独立产品能够快速跑通冷启动、赢得种子用户信任的底层根基。


