## 主要变更 ### 文档重构(减少 1199 行,-23%) - 01-架构设计.md: 503→369 行 (-27%),删除 DDL/配置示例,精简鉴权/存储描述 - 02-接口文档.md: 1313→570 行 (-57%),删除 Go 接口/Orchestrator 实现/配置管理 - 07-成本控制.md: 65→59 行 (-9%),代码块替换为文件引用 ### 文档编号规范化 - 08-功能创意.md → 删除(内容整合到 README.md "功能扩展方向") - 10-Eino框架与编排设计.md → 08-Eino框架与编排设计.md - 情景切换.md → 09-情景切换.md - 12-鉴权体系.md → 10-鉴权体系.md - 13-令牌桶限流.md → 11-令牌桶限流.md ### 交叉引用更新 - 01-架构设计.md: 更新对鉴权体系/令牌桶限流的引用为新编号 - README.md: 更新文档索引表、推荐阅读顺序、新增功能扩展方向 ### 删除过时文档 - 09-技术名词解释.md(内容已整合到 03-技术选型.md) - 10-Eino重构方案.md(历史记录,已完成) - 11-Eino框架技术文档.md(已合并到 08) - 情景切换功能完整文档.md(已规范化为 09) ## 重构原则 - 架构文档聚焦系统结构,移除实现细节 - 接口文档保留纯契约,删除内部实现 - 编号连续(01-11),语义清晰 - 通过交叉引用连接相关文档,避免重复
2.9 KiB
2.9 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" |
实现细节:参见 frontend/src/lib/sampling.ts 中的 SamplingController,根据 VAD 状态在空闲模式(5s/帧)和活跃模式(1s/帧)之间切换。
策略二:端云协同——把计算推到边缘
不是所有计算都需要上云。可前置到客户端的计算:
- VAD 语音检测:浏览器端完成,减少无效音频上传(节省 ~70% 带宽)
- 人脸/物体检测(待实现):用 ONNX Runtime 跑轻量模型(如 YOLOv8-nano ~6MB,推理 ~30ms),只在检测到新物体时触发 LLM。当前 MVP 使用 Canvas 像素比较做关键帧检测
- 重复画面过滤:计算帧间相似度,对话模式 similarity > 0.9 跳过,观察模式 similarity < 0.85 触发
- 敏感内容过滤(待实现):NSFW 检测前置,避免无效 API 调用
策略三:模型分级——用对模型做对事(待实现)
不是每个问题都需要最贵的模型:
用户提问 → 问题复杂度判断
├── 简单识别 → 轻量模型(如 qwen-turbo)
├── 深度分析 → qwen3-vl-plus(默认,按量计费)
└── 代码/推理 → 更强模型(如 o1)
当前 MVP 阶段使用单一模型(默认 DashScope qwen3-vl-plus),模型分级路由为未来优化方向。LLM 通过 Eino ChatModel 接入,支持任何 OpenAI 兼容接口。
策略四:缓存与复用(待实现)
- 语义缓存(待实现):相似问题直接返回缓存结果(如反复问"这是什么")
- 上下文复用:连续对话中,未变化的图像不必重复发送(已通过重复画面过滤实现)
- 对话历史裁剪:前端按
MAX_HISTORY_ROUNDS = 10裁剪,后端按defaultHistorySize = 20裁剪,限制每轮的固定 token 开销