一、产品定位
面向企业实景场景(巡检、监控、协作直播、远程指挥等)与个人用户实景场景(盲人辅助、智能眼镜等),在通用多模态大模型基础上补齐两类核心能力:
- 短期视觉记忆召回:用户事后用自然语言追问"刚才/之前"画面里发生了什么。
- 持续视觉检测与主动反馈:用户口语化描述一条规则,系统在后续画面流中带外检测,命中或超时主动告知。
本原型用方舟豆包 Doubao-Seed-2.0-lite(多模态)单一模型跑通端到端链路。
二、关键功能
-
①
多模态实时观察
浏览器摄像头按 1 fps 抽帧(JPEG dataURL)上行
/observe。后端用豆包 VLM 为每帧生成 ≤60 字的客观描述,作为短期记忆条目。会话级 in-memory 索引,上限 30 分钟 / 256 帧,自动滚动淘汰。 -
②
历史记忆召回 (recall_history)
问题文本与每帧 caption 转 256 维 hash-based 稀疏向量,余弦相似度召回 topK 帧(阈值 0.55),将其图片+描述与原问题拼装多模态 prompt,VLM 联合作答并明确引用时间点。命中失败时回退到当前帧或建议注册规则。
-
③
当前画面问答 (current_frame_vqa)
"现在/这是什么/在哪里"等当前指代型问题直接以最新帧为输入做 VQA。无新帧时回退到记忆中最后一帧并向用户说明。
-
④
持续检测与主动反馈 (register_rule)
"等到 X 出现告诉我"等口语化规则交由 LLM 抽取目标短语 + timeoutMs(默认 60s,最长 5 分钟),写入会话规则池。后台调度器每 500ms tick 一次,按 ≤2 QPS / 会话限流抽帧匹配,命中 / 超时 / 取消三态通过 SSE
/events主动推送到浏览器横幅。 -
⑤
意图路由 + 可观测
每次对话先经 LLM 严格 JSON 意图分类(recall_history / current_frame_vqa / register_rule / chitchat),再分发到对应工具链;响应回包暴露
trace.intent、命中数、活动规则列表,便于调参与回归。
三、技术架构
3.1 分层视图
┌────────────────────────── 浏览器 (单页 SPA) ──────────────────────────┐
│ Webcam → Canvas 抽帧 (1 fps, JPEG dataURL) │
│ Chat 表单 → /api/chat (text + currentImage) │
│ EventSource ← /api/events (SSE: ready / hit / timeout / cancelled) │
└──────────────────────────────────┬───────────────────────────────────┘
│ HTTP / SSE
┌──────────────────────────────────▼───────────────────────────────────┐
│ IGA Pages Functions (Node, Express, api/[[default]].js) │
│ ┌─────────────────────────┐ ┌────────────────────────────────────┐ │
│ │ 路由层 │ │ 调度层 (RuleScheduler 500ms tick) │ │
│ │ /health /observe │ │ · ≤2 QPS/会话 │ │
│ │ /chat /rule/cancel │ │ · active → hit/timeout/cancelled │ │
│ │ /events (SSE) │ │ · 命中 push SSE 给前端 │ │
│ └────────────┬────────────┘ └──────────────┬─────────────────────┘ │
│ │ │ │
│ ┌────────────▼────────────┐ ┌────────────▼───────────────────┐ │
│ │ Memory (in-memory) │ │ Ark 调用层 (api/ark.js) │ │
│ │ · session │ │ · describeImage (多模态 caption)│ │
│ │ · frames (img/cap/vec) │ │ · intentClassify (严格 JSON) │ │
│ │ · rules (taskId→state) │ │ · generateVqaAnswer │ │
│ │ · SSE clients Map │ │ · matchRuleAgainstFrame │ │
│ └────────────────────────┘ │ · textEmbedding (256d hash 稀疏)│ │
│ └──────────────┬─────────────────┘ │
└────────────────────────────────────────────────┼────────────────────┘
│
┌──────────────────▼───────────────────┐
│ 方舟 Ark · doubao-seed-2-0-lite │
│ POST {endpoint}/chat/completions │
│ OpenAI-兼容 + image_url 多模态 │
└──────────────────────────────────────┘
3.2 关键时序
-
历史召回链:用户问句 →
intentClassify→recall_history→textEmbedding(query)→searchMemory(topK=3, ≥0.55)→ VLM 联合作答(带画面 + caption)。 -
持续检测链:用户问句 →
register_rule→ 写入rules池 → 前端轮询新帧(/observe)→RuleScheduler每 tick 选最早未检查规则 + 最新帧 →matchRuleAgainstFrame(VLM 严格 JSON 判断)→ 命中或超时 →pushEvent→ 浏览器 SSE 横幅 + 系统消息 + 状态翻转。
3.3 配置默认值
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 抽帧速率 | 1 fps | 前端 setInterval;可调 |
| 记忆容量 | 30 min / 256 帧 | 滚动淘汰 |
| 召回 topK | 3 | 余弦阈值 0.55 |
| 规则带外限流 | ≤2 QPS / 会话 | 调度器 tick 500ms |
| 规则超时 | 60 s(默认)/ 300 s(最长) | LLM 抽取 + 上界裁剪 |
| SSE 心跳 | 15 s | : heartbeat 注释行 |
| LLM | doubao-seed-2-0-lite-260428 | 方舟 OpenAI 兼容 |
四、API 协议
| Method | Path | 说明 |
|---|---|---|
| GET | /api/health | 探活 + ARK 配置状态 |
| POST | /api/observe | { sessionId, image, hint } — 写入一帧 + caption + vector |
| POST | /api/chat | { sessionId, text, currentImage } — 路由到三种工具或 chitchat |
| POST | /api/rule/cancel | { sessionId, taskId } — 取消活动规则 |
| GET | /api/events?sessionId=… | SSE:ready / visual_rule_hit / visual_rule_timeout / visual_rule_cancelled |
五、原型边界与开放问题
- Embedding 用 hash-based 256 维稀疏向量,仅做语义近似;正式系统应替换为豆包向量模型(最大 1024 维)或 BGE 中文模型。
- 记忆为单进程 in-memory,多实例需要外置 Redis/向量库;规则调度同样需要可靠队列与去重。
- VLM 单帧匹配在长序列上成本较高,后续可引入"先描述合并 → 文本规则匹配 → 命中再 VLM 复核"两段式以降本。
- 浏览器 1 fps 抽帧仅覆盖 toB demo;真实工业摄像头/RTSP 需后端订阅推流并按事件触发抽帧。
- 灰度可观测:建议补充每条 trace 的 latency 分位、命中误报率、SSE 推达率等指标。