- 移除 Obsidian 特有语法(callout、wikilinks、YAML frontmatter) - 目录结构从 3 层嵌套扁平化为编号文件(01~09) - 新增 docs/README.md 文档索引与推荐阅读顺序 - 精简冗余解释,保留所有代码块和实现参考 - CLAUDE.md 全面中文化
3.0 KiB
3.0 KiB
成本控制
概述
实时视频流 + 多模态 LLM 推理的成本极易失控。从视觉链路、语音链路、推理链路三个维度梳理成本控制策略,核心思想是端云协同——将适合的计算前置到客户端,降低对云端 API 的依赖。
成本对比:优化前(1fps 全量发送)vs 优化后(0.2fps + 端侧筛选 + 模型分级)→ 月成本从 $5000 降至 $300~500,降幅约 90%。
成本构成
总成本
├── 视觉链路:图像编码与传输、视觉 token 消耗
├── 语音链路:STT 按分钟计费、TTS 按字符计费
└── 推理链路:LLM 输入 tokens、LLM 输出 tokens
假设:10 分钟/天/用户,1fps,每次 1000 tokens → 一天 60 万 tokens。1000 用户时成本不可控。
策略一:智能采样——少发图,发好图
| 策略 | 降本幅度 | 实现复杂度 | 说明 |
|---|---|---|---|
| 提高采样间隔 | 高 | 低 | 从 1fps 降到 0.2fps |
| 关键帧过滤 | 中 | 中 | 画面不变时不发送 |
| 用户触发 | 高 | 低 | 只在用户提问时拍照 |
| 本地预筛选 | 中 | 高 | 用轻量模型判断"是否值得问 LLM" |
// 混合策略:定时低频 + 事件高频
const NORMAL_INTERVAL = 5000; // 正常 5 秒一帧
const ACTIVE_INTERVAL = 1000; // 用户说话时 1 秒一帧
let isUserSpeaking = false;
setInterval(() => {
captureAndSend(isUserSpeaking ? "low" : "high");
}, isUserSpeaking ? ACTIVE_INTERVAL : NORMAL_INTERVAL);
策略二:端云协同——把计算推到边缘
不是所有计算都需要上云。可前置到客户端的计算:
- VAD 语音检测:浏览器端完成,减少无效音频上传(节省 ~70% 带宽)
- 人脸/物体检测:用 ONNX Runtime 跑轻量模型(如 YOLOv8-nano ~6MB,推理 ~30ms),只在检测到新物体时触发 LLM
- 重复画面过滤:计算帧间相似度,相似度 > 90% 直接跳过
- 敏感内容过滤:NSFW 检测前置,避免无效 API 调用
策略三:模型分级——用对模型做对事
不是每个问题都需要最贵的模型:
用户提问 → 问题复杂度判断
├── 简单识别 → GPT-4o-mini ($0.15/1M tokens)
├── 深度分析 → GPT-4o ($2.5/1M tokens)
└── 代码/推理 → o1 ($15/1M tokens)
async function routeQuery(image: string, question: string) {
const complexity = await classifyComplexity(question);
const modelMap = {
simple: "gpt-4o-mini", // "这是什么?"
moderate: "gpt-4o", // "分析这张图"
complex: "o1" // "推理/规划"
};
return callLLM(modelMap[complexity], image, question);
}
策略四:缓存与复用
- 语义缓存:相似问题直接返回缓存结果(如反复问"这是什么")
- 上下文复用:连续对话中,未变化的图像不必重复发送
- Prompt 压缩:精简 system prompt,减少每轮的固定 token 开销