docs(README/PROGRESS): 文档收尾,与架构重构代码对齐
1. README 8.3 节:fam-core 配置示例更新(video_dir 生产路径 + chat_handler.qa_url),fam-edge 配置示例对齐新架构(role/usage=qa_fallback、gemini-flash-latest、实际 timeout) 2. README 1.3 节:历史视频积压标记已处理(forward-only);吞吐不足表述更新(无本地融合) 3. README 5.3 节:改名为云端结构化输出 JSON Schema,描述适配器解析 + format_cloud_result 校验两阶段 4. README 6.2 节:移除融合 timeout 行,num_predict 更新为 512,已知问题改述为专职问答兜底 5. README 10.5/10.6 节:Gemini 模型名修正为 gemini-flash-latest;NVIDIA 验证状态更新为已验证 6. README 12 节:架构重构与双端部署验证纳入已完成;v1.1 待办移除已完成项 1-5,保留单元测试/Tailscale/daily_summaries 7. PROGRESS.md:服务状态表更新(新架构、qwen2.5:7b);任务进度追加 32-38;技术决策记录追加云端直出直存与 Q&A 降级;聊天链路验证段更新为 run_qa 编排
This commit is contained in:
44
PROGRESS.md
44
PROGRESS.md
@@ -1,15 +1,15 @@
|
|||||||
# 项目进度追踪
|
# 项目进度追踪
|
||||||
|
|
||||||
> 最后更新: 2026-08-20 02:10
|
> 最后更新: 2026-08-20 10:45
|
||||||
|
|
||||||
## 服务运行状态
|
## 服务运行状态
|
||||||
|
|
||||||
| 服务 | 节点 | 地址 | 状态 | 验证结果 |
|
| 服务 | 节点 | 地址 | 状态 | 验证结果 |
|
||||||
|------|------|------|------|---------|
|
|------|------|------|------|---------|
|
||||||
| FAM-Core | NAS | 0.0.0.0:8000 | ✅ 运行中 | health=ok, Python 3.10 venv, API 全部测试通过 |
|
| FAM-Core | NAS | 0.0.0.0:8000 | ✅ 运行中 | health=ok, Python 3.10 venv, API 全部测试通过 |
|
||||||
| FAM-Edge | Oracle | 0.0.0.0:5000 | ✅ 运行中 | health=ok, chat proxy 已验证 |
|
| FAM-Edge | Oracle | 0.0.0.0:5000 | ✅ 运行中 | 新架构已部署(云端直出直存);`/api/edge/chat/ask` 实测 provider=nvidia(Gemini→NVIDIA 降级成功) |
|
||||||
| MariaDB | NAS | 127.0.0.1:3306 | ✅ 运行中 | 10.11.11, 6 张表, utf8mb4 |
|
| MariaDB | NAS | 127.0.0.1:3306 | ✅ 运行中 | 10.11.11, 6 张表, utf8mb4 |
|
||||||
| Ollama | Oracle | 127.0.0.1:11434 | ✅ 运行中 | llava-phi3, 通过 FAM-Edge 代理访问 |
|
| Ollama | Oracle | 127.0.0.1:11434 | ✅ 运行中 | qwen2.5:7b,仅智能问答兜底(不参与视觉/融合) |
|
||||||
| Tailscale | Oracle ↔ NAS | 100.74 ↔ 100.70 | ⚠️ 待修复 | Tailscale 运行但端口不通,当前用公网IP |
|
| Tailscale | Oracle ↔ NAS | 100.74 ↔ 100.70 | ⚠️ 待修复 | Tailscale 运行但端口不通,当前用公网IP |
|
||||||
| FAM-UI | NAS | 0.0.0.0:8501 | ✅ 运行中 | Streamlit 1.61.1, HTTP 200, health=ok |
|
| FAM-UI | NAS | 0.0.0.0:8501 | ✅ 运行中 | Streamlit 1.61.1, HTTP 200, health=ok |
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
| pip | 25.0.1 (venv内) | |
|
| pip | 25.0.1 (venv内) | |
|
||||||
| FFmpeg | 已安装 | apt 安装 |
|
| FFmpeg | 已安装 | apt 安装 |
|
||||||
| Ollama | 0.32.14 | |
|
| Ollama | 0.32.14 | |
|
||||||
| llava-phi3:latest | 2.9 GB 已拉取 | |
|
| qwen2.5:7b | 已拉取 | 纯文本模型,仅问答兜底(原 llava-phi3 已废弃) |
|
||||||
| Python 依赖 | 全部安装成功 | flask, gunicorn, requests, PyYAML, opencv, numpy |
|
| Python 依赖 | 全部安装成功 | flask, gunicorn, requests, PyYAML, opencv, numpy |
|
||||||
| 模块导入验证 | PASS | FAM-Edge 全部 8 个模块导入正常 |
|
| 模块导入验证 | PASS | FAM-Edge 全部 8 个模块导入正常 |
|
||||||
| 代码部署 | /opt/fam-edge/ | rsync 同步 |
|
| 代码部署 | /opt/fam-edge/ | rsync 同步 |
|
||||||
@@ -109,27 +109,36 @@
|
|||||||
| 29 | 关键帧提取改为自适应帧数 (随视频时长动态计算) | ✅ 完成 | 2026-08-20 |
|
| 29 | 关键帧提取改为自适应帧数 (随视频时长动态计算) | ✅ 完成 | 2026-08-20 |
|
||||||
| 30 | FFmpeg 快速 seek 替代 fps 滤镜 (6-8x 提速) | `7ce8aff` | 2026-08-20 |
|
| 30 | FFmpeg 快速 seek 替代 fps 滤镜 (6-8x 提速) | `7ce8aff` | 2026-08-20 |
|
||||||
| 31 | 真实视频性能基准测试 (30min 360MB 视频) | ✅ 完成 | 2026-08-20 |
|
| 31 | 真实视频性能基准测试 (30min 360MB 视频) | ✅ 完成 | 2026-08-20 |
|
||||||
|
| 32 | 视频端到端集成测试 (task 289 → SUCCESS, 落库正确) | ✅ 完成 | 2026-08-20 |
|
||||||
|
| 33 | 生产目录切换 forward-only (285 历史视频占位跳过) | ✅ 完成 | 2026-08-20 |
|
||||||
|
| 34 | 今日 17 片段诊断(根因:Ollama 本地融合 300s 超时) | ✅ 完成 | 2026-08-20 |
|
||||||
|
| 35 | **架构重构**:移除本地融合(run_text_fusion),云端 VLM 直出 JSON → format_cloud_result → 直存 DB | `babf5b0` | 2026-08-20 |
|
||||||
|
| 36 | 适配器 chat() 方法 + run_qa 三模型降级(Gemini→NVIDIA→Ollama 兜底) | `babf5b0` | 2026-08-20 |
|
||||||
|
| 37 | 端点 /api/edge/chat/ask + chat_handler 改走 Edge 编排(qa_url) | `babf5b0` | 2026-08-20 |
|
||||||
|
| 38 | 双端部署验证:Oracle 7 文件 + 重启;NAS chat_handler + config 手术 + HUP;实测 /api/edge/chat/ask provider=nvidia、NAS→Edge 编排 43s 落库 | ✅ 完成 | 2026-08-20 |
|
||||||
|
|
||||||
### 待完成
|
### 待完成
|
||||||
|
|
||||||
| # | 任务 | 依赖 | 优先级 |
|
| # | 任务 | 依赖 | 优先级 |
|
||||||
|---|------|------|--------|
|
|---|------|------|--------|
|
||||||
| 32 | 视频端到端集成测试 | FAM-UI ✅ | 高 |
|
| 39 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 |
|
||||||
| 33 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 |
|
| 40 | Tailscale 防火墙修复 (NAS↔Oracle) | - | 低 |
|
||||||
| 34 | Tailscale 防火墙修复 (NAS↔Oracle) | - | 低 |
|
| 41 | daily_summaries 每日摘要 | - | 低 |
|
||||||
|
|
||||||
## 技术决策记录
|
## 技术决策记录
|
||||||
|
|
||||||
1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8
|
1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8
|
||||||
2. **rsync 替代 git clone** - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
|
2. **rsync 替代 git clone** - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
|
||||||
3. **num_predict 参数** - ARM CPU 上 llava-phi3 生成速度较慢,限制输出 token 数控制延迟
|
3. **num_predict 参数** - ARM CPU 上 qwen2.5:7b 生成速度较慢,限制输出 token 数控制延迟
|
||||||
4. **PyMySQL 替代 mysql-connector-python** - 45KB 纯 Python 替代 19MB C 扩展,NAS 无需编译
|
4. **PyMySQL 替代 mysql-connector-python** - 45KB 纯 Python 替代 19MB C 扩展,NAS 无需编译
|
||||||
5. **MariaDB JSON 路径兼容** - MariaDB 10.11 不支持 MySQL 的 `$[*]` 通配符 JSON 路径和 `->` 操作符,name_member() 改用 Python 层解析 + 逐行 UPDATE
|
5. **MariaDB JSON 路径兼容** - MariaDB 10.11 不支持 MySQL 的 `$[*]` 通配符 JSON 路径和 `->` 操作符,name_member() 改用 Python 层解析 + 逐行 UPDATE
|
||||||
6. **Python 3.10 venv** - NAS 系统 Python 3.8 过旧,用 Synology Python3.10 包创建 venv
|
6. **Python 3.10 venv** - NAS 系统 Python 3.8 过旧,用 Synology Python3.10 包创建 venv
|
||||||
7. **FAM-Edge 聊天代理** - Ollama 端口 11434 未对外暴露,FAM-Edge 新增 /api/edge/chat 代理转发至本地 Ollama
|
7. **FAM-Edge 聊天代理** - 历史:/api/edge/chat 直连 Ollama 代理;架构重构后被 `/api/edge/chat/ask` 三模型编排端点取代(旧端点保留兼容)
|
||||||
8. **Oracle 公网 IP 替代 Tailscale** - Tailscale 两节点在线但端口不通(防火墙),edge_url 和 ollama_url 改用 Oracle 公网 IP 129.146.203.203
|
8. **Oracle 公网 IP 替代 Tailscale** - Tailscale 两节点在线但端口不通(防火墙),edge_url 和 qa_url 改用 Oracle 公网 IP 129.146.203.203
|
||||||
9. **Ollama 模型常驻内存** - systemd 加 `OLLAMA_KEEP_ALIVE=-1`,模型加载后永不卸载,消除 55s 冷启动延迟,常驻占用 4.3GB 内存(系统 12GB 够用)
|
9. **Ollama 模型常驻内存** - systemd 加 `OLLAMA_KEEP_ALIVE=-1`,模型加载后永不卸载,消除 55s 冷启动延迟,常驻占用 4.3GB 内存(系统 12GB 够用)
|
||||||
10. **关键帧自适应帧数** - 原固定 5-8 帧对长视频太稀疏(30分钟仅8帧=每3.75分钟1帧),改为随视频时长自适应:候选帧 `clamp(duration_min×2, 30, 120)`,关键帧上限 `clamp(duration/150s, 8, 30)`。30分钟→12帧,60分钟→24帧,封顶30帧
|
10. **关键帧自适应帧数** - 原固定 5-8 帧对长视频太稀疏(30分钟仅8帧=每3.75分钟1帧),改为随视频时长自适应:候选帧 `clamp(duration_min×2, 30, 120)`,关键帧上限 `clamp(duration/150s, 8, 30)`。30分钟→12帧,60分钟→24帧,封顶30帧
|
||||||
|
11. **云端直出直存(架构重构)** - 本地 Ollama 完全移出视频链路:云端 VLM(Gemini 多图单请求 / NVIDIA 逐帧聚合)直接产出结构化 JSON,Edge 仅 `format_cloud_result` 格式化/校验(无模型调用)后直存 NAS DB。根因:CPU 版 Ollama 对无上限融合 prompt 预填充极慢导致 300s 超时
|
||||||
|
12. **Q&A 三模型降级编排** - 智能问答由 Edge `run_qa` 编排:Gemini → NVIDIA → 本地 Ollama(仅两云端都失败才启用本地兜底);各适配器实现 `chat()` 纯文本接口
|
||||||
11. **FFmpeg 快速 seek 替代 fps 滤镜** - 原方案 `ffmpeg -vf fps=1/interval` 需全解码视频,30min 360MB 视频在 ARM CPU 上需 180s+(超 120s 超时)。改为逐帧 `ffmpeg -ss <ts> -frames:v 1` 快速 seek,仅 33s(6-8x 提速)
|
11. **FFmpeg 快速 seek 替代 fps 滤镜** - 原方案 `ffmpeg -vf fps=1/interval` 需全解码视频,30min 360MB 视频在 ARM CPU 上需 180s+(超 120s 超时)。改为逐帧 `ffmpeg -ss <ts> -frames:v 1` 快速 seek,仅 33s(6-8x 提速)
|
||||||
|
|
||||||
## 真实视频性能基准测试 (2026-08-20)
|
## 真实视频性能基准测试 (2026-08-20)
|
||||||
@@ -158,13 +167,16 @@ AI 分析瓶颈: 帧5耗时 229s (疑似 ARM CPU 热降频), 其余帧 50-65s
|
|||||||
| /api/member/name | POST | 人物A→张三 | ✅ 成功命名, 0 条事件记录回溯更新 |
|
| /api/member/name | POST | 人物A→张三 | ✅ 成功命名, 0 条事件记录回溯更新 |
|
||||||
| /api/chat/ask | POST | "今天有什么事件?" | ✅ 端到端成功, 回答"今天没有观察到张三" |
|
| /api/chat/ask | POST | "今天有什么事件?" | ✅ 端到端成功, 回答"今天没有观察到张三" |
|
||||||
|
|
||||||
## 端到端聊天链路验证 (2026-08-20)
|
## 端到端聊天链路验证 (2026-08-20,新架构)
|
||||||
|
|
||||||
```
|
```
|
||||||
用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Ollama (Oracle:11434)
|
用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Gemini / NVIDIA NIM / 本地 Ollama (兜底)
|
||||||
/api/edge/chat 代理 /api/generate 本地
|
/api/edge/chat/ask run_qa 三模型降级编排
|
||||||
```
|
```
|
||||||
|
|
||||||
- FAM-Core 调用 `ollama_url` 配置的 `http://129.146.203.203:5000/api/edge/chat`
|
- FAM-Core Chat-Handler 调用 `qa_url` 配置的 `http://129.146.203.203:5000/api/edge/chat/ask`(不再直连 Ollama)
|
||||||
- FAM-Edge 代理转发至 `http://127.0.0.1:11434/api/generate`
|
- FAM-Edge `run_qa` 按 Gemini → NVIDIA → 本地 Ollama 顺序调用 `chat()`,首个成功即返回 `{answer, provider}`
|
||||||
- 回答正常返回,chat_history 记录已保存 (chat_id=1)
|
- **验证结果**:
|
||||||
|
- Edge 单测:`/api/edge/chat/ask` → 200,`provider=nvidia`(Gemini 30s 超时后 NVIDIA 兜底成功,耗时 51s)
|
||||||
|
- NAS E2E:插入临时事件上下文后 `/api/chat/ask` → 43s 返回模型回答,`context_summary` 命中 1 条事件,chat_id 落库;测试数据已清理
|
||||||
|
- 无上下文时走短路分支(直接返回提示,不调 Edge),响应 <1s,属正常设计
|
||||||
|
|||||||
91
README.md
91
README.md
@@ -34,10 +34,10 @@
|
|||||||
|
|
||||||
| 问题 | 现状 | 影响 |
|
| 问题 | 现状 | 影响 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4;**已替换为 qwen2.5:7b**(纯文本模型,专职融合与对话) | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
|
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4;**已替换为 qwen2.5:7b**(纯文本模型,专职问答兜底) | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
|
||||||
| **吞吐不足** | 30s 视频全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min);30min/360MB 视频实测 929s | 生产视频每 30 分钟新增一个,处理速度勉强跟上但无余量;改用云端模型后该问题随之缓解 |
|
| **吞吐不足** | 历史本地模型全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min);30min/360MB 视频实测 929s | 已切换到云端 VLM 直出结构化 JSON(无本地融合步骤),吞吐瓶颈转移至云端调用延迟,整体明显改善 |
|
||||||
| **Tailscale 端口不通** | NAS tailscaled 以 userspace 模式运行(无 TUN 网卡),Oracle 无法反向访问 NAS;当前 NAS→Oracle 走公网 IP | 推送模式已规避反向访问,但流量走公网 |
|
| **Tailscale 端口不通** | NAS tailscaled 以 userspace 模式运行(无 TUN 网卡),Oracle 无法反向访问 NAS;当前 NAS→Oracle 走公网 IP | 推送模式已规避反向访问,但流量走公网 |
|
||||||
| **历史视频积压** | 正式目录 `/volume1/surveillance/Generic_ONVIF-001` 有约 285 个历史视频(~100GB),288 个历史任务已标记 FAILED 避免全量上传 | 切回生产目录前需确认回补策略 |
|
| **历史视频积压(已处理)** | 正式目录 `/volume1/surveillance/Generic_ONVIF-001` 原有约 285 个历史视频(~100GB),已切回生产目录并 forward-only 处理:历史任务占位 FAILED,scheduler dedup 自动跳过,仅处理新增视频 | 已解决;生产目录已生效,新视频正常入链 |
|
||||||
|
|
||||||
**规划方向(新框架)**:**云端大模型负责视觉识别与结构化输出、本地大模型仅做智能问答兜底**。按任务类型分工:
|
**规划方向(新框架)**:**云端大模型负责视觉识别与结构化输出、本地大模型仅做智能问答兜底**。按任务类型分工:
|
||||||
|
|
||||||
@@ -255,9 +255,14 @@ chat_history 独立表
|
|||||||
| `/api/member/list` | GET | 全部成员 |
|
| `/api/member/list` | GET | 全部成员 |
|
||||||
| `/media/<path>?token=xxx` | GET | 视频静态服务(token 鉴权,推送模式下备用) |
|
| `/media/<path>?token=xxx` | GET | 视频静态服务(token 鉴权,推送模式下备用) |
|
||||||
|
|
||||||
### 5.3 融合输出 JSON Schema
|
### 5.3 云端结构化输出 JSON Schema
|
||||||
|
|
||||||
三层容错解析:直接 `json.loads` → 提取 markdown fence ` ```json ... ``` ` → 贪婪匹配最大 `{...}`;再过 `validate_schema`(必填字段检查 + 脏数据清洗,`action` 由 AI 自由生成无枚举过滤,`is_attention_event` 由 AI 自行判断,`source_providers` 必须非空数组)。三层全失败 → 任务 FAILED 走重试。
|
云端 VLM 直接产出结构化 JSON,经两道处理入库:
|
||||||
|
|
||||||
|
1. **适配器内三层容错解析**(`json_parser.parse_vlm_json`):直接 `json.loads` → 提取 markdown fence ` ```json ... ``` ` → 贪婪匹配最大 `{...}`;失败抛 `VLMOutputInvalidError`
|
||||||
|
2. **`format_cloud_result` 归一化/校验**(无模型调用):`frame_details` 必须为非空列表并做字段类型归一化;`source_providers` 缺失时补为 `[provider]`;`compute_provider` 置为本次成功 provider;`entities_json` 缺失时由 `frame_details` 按人物去重推导;`global_summary` 缺失时格式化拼接生成
|
||||||
|
|
||||||
|
任一步骤失败 → 任务 FAILED 走重试。`action` 由 AI 自由生成无枚举过滤,`is_attention_event` 由 AI 自行判断。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -278,13 +283,12 @@ chat_history 独立表
|
|||||||
| 参数 | 值 | 依据 |
|
| 参数 | 值 | 依据 |
|
||||||
|------|-----|------|
|
|------|-----|------|
|
||||||
| `OLLAMA_KEEP_ALIVE=-1` | 模型常驻内存 | 消除 55s 冷启动(常驻约 4.3GB,12GB 内存够用) |
|
| `OLLAMA_KEEP_ALIVE=-1` | 模型常驻内存 | 消除 55s 冷启动(常驻约 4.3GB,12GB 内存够用) |
|
||||||
| `num_predict=60` | 限制生成 token | ARM 约 5 tok/s,500 会单帧跑数分钟触发超时 |
|
| `num_predict=512` | 限制生成 token | ARM 约 5 tok/s,过长生成会拖慢问答响应 |
|
||||||
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token |
|
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token(问答链路改用 config 中各模型 timeout) |
|
||||||
| 融合 timeout | 300s | — |
|
|
||||||
| gunicorn(Edge) | `--timeout 1800` | 同步分析模式,默认 30s 会杀 worker |
|
| gunicorn(Edge) | `--timeout 1800` | 同步分析模式,默认 30s 会杀 worker |
|
||||||
| push_timeout(NAS) | 1800s | 覆盖最坏情况(30min 视频实测 929s) |
|
| push_timeout(NAS) | 1800s | 覆盖最坏情况(30min 视频实测 929s) |
|
||||||
|
|
||||||
**已知问题**:原 llava-phi3 多图单请求基本失效(N 张图一次调用输出长度仅 3~4)。**已替换为 qwen2.5:7b**(纯文本模型,专职融合与对话,不涉及视觉多图问题)。
|
**已知问题**:原 llava-phi3 多图单请求基本失效(N 张图一次调用输出长度仅 3~4)。**已替换为 qwen2.5:7b**(纯文本模型,专职问答兜底,不涉及视觉多图问题;视频分析已全部由云端 VLM 承担)。
|
||||||
|
|
||||||
### 6.3 模型适配器架构
|
### 6.3 模型适配器架构
|
||||||
|
|
||||||
@@ -432,54 +436,47 @@ task_id=289(30s 测试片段)全链路打通:推送 5.7MB → Edge 分析
|
|||||||
|
|
||||||
### 8.3 配置文件要点
|
### 8.3 配置文件要点
|
||||||
|
|
||||||
**fam-core/config/config.yaml**(NAS):
|
**fam-core/config/config.yaml**(NAS,生产值):
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
scheduler:
|
scheduler:
|
||||||
video_dir: "/volume1/web/sentinel-home-ai/e2e-test" # 当前指向 E2E 测试目录
|
video_dir: "/volume1/surveillance/Generic_ONVIF-001" # 生产目录(YYYYMMDDAM/PM 两级子目录)
|
||||||
# 正式目录: /volume1/surveillance/Generic_ONVIF-001(YYYYMMDDAM/PM 两级子目录,
|
# 285 个历史视频由占位 FAILED 任务占用路径,scheduler dedup 自动跳过(forward-only 模式)
|
||||||
# os.walk 递归支持;切回前需处理 285 个历史视频积压,避免全量上传 ~100GB)
|
|
||||||
dispatcher:
|
dispatcher:
|
||||||
edge_url: "http://129.146.203.203:5000/api/edge/video/push"
|
edge_url: "http://129.146.203.203:5000/api/edge/video/push"
|
||||||
push_timeout: 1800
|
push_timeout: 1800
|
||||||
chat_handler:
|
chat_handler:
|
||||||
ollama_url: "http://129.146.203.203:5000/api/edge/chat" # 经 Edge 代理
|
qa_url: "http://129.146.203.203:5000/api/edge/chat/ask" # 问答统一走 Edge 编排(Gemini→NVIDIA→Ollama)
|
||||||
|
timeout: 120
|
||||||
```
|
```
|
||||||
|
|
||||||
**fam-edge/config/config.yaml**(Oracle,多模型池配置):
|
**fam-edge/config/config.yaml**(Oracle,多模型池配置,新架构):
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# 调度模式配置: fallback(顺序降级) 或 ensemble(并行交叉验证)
|
# 编排调度模式: fallback(顺序降级, 默认) | ensemble(并行交叉验证)
|
||||||
orchestrator:
|
orchestrator:
|
||||||
mode: "fallback"
|
mode: "fallback"
|
||||||
overall_timeout: 600
|
overall_timeout: 600
|
||||||
|
|
||||||
# 关键帧配置
|
# 多模型池配置(新框架:本地大模型不参与视频分析,仅智能问答兜底)
|
||||||
video:
|
# 视频分析链路: 云端 VLM 直出结构化 JSON → Edge format_cloud_result 格式化/校验 → 直存 NAS DB(无本地融合)
|
||||||
candidate_frames: 30
|
# 智能问答链路: Gemini → NVIDIA → 本地 Ollama(仅两云端都失败才启用本地兜底)
|
||||||
min_key_frames: 5
|
|
||||||
max_key_frames: 12
|
|
||||||
mse_threshold: 500
|
|
||||||
jpeg_quality: 80
|
|
||||||
max_long_edge: 1024
|
|
||||||
|
|
||||||
# 多模型池配置(视觉: Gemini → NVIDIA NIM 降级;文本: 本地 Ollama)
|
|
||||||
models:
|
models:
|
||||||
# 1. Google Gemini 1.5 Flash(视觉主)
|
# 1. Google Gemini(视觉主 + 参与问答)
|
||||||
- provider: "gemini"
|
- provider: "gemini"
|
||||||
role: "vision" # 视觉分析
|
role: "vision" # 视觉分析 + 问答(vision role 也参与 chat)
|
||||||
enabled: true
|
enabled: true
|
||||||
model_name: "gemini-1.5-flash"
|
model_name: "gemini-flash-latest" # v1beta 下 gemini-1.5-flash 会 404
|
||||||
api_key: "${GEMINI_API_KEY}"
|
api_key: "${GEMINI_API_KEY}"
|
||||||
timeout: 15
|
timeout: 30
|
||||||
circuit_breaker:
|
circuit_breaker:
|
||||||
enabled: true
|
enabled: true
|
||||||
threshold: 3
|
threshold: 3
|
||||||
cooldown: 600
|
cooldown: 600
|
||||||
|
|
||||||
# 2. NVIDIA NIM 托管 API(视觉备)
|
# 2. NVIDIA NIM 托管 API(视觉备 + 参与问答)
|
||||||
- provider: "nvidia"
|
- provider: "nvidia"
|
||||||
role: "vision" # 视觉分析
|
role: "vision" # 视觉分析 + 问答(vision role 也参与 chat)
|
||||||
enabled: true
|
enabled: true
|
||||||
model_name: "meta/llama-3.2-11b-vision-instruct" # 或 qwen/qwen2-vl-72b-instruct
|
model_name: "meta/llama-3.2-11b-vision-instruct" # 或 qwen/qwen2-vl-72b-instruct
|
||||||
base_url: "https://integrate.api.nvidia.com/v1"
|
base_url: "https://integrate.api.nvidia.com/v1"
|
||||||
@@ -490,13 +487,15 @@ models:
|
|||||||
threshold: 3
|
threshold: 3
|
||||||
cooldown: 600
|
cooldown: 600
|
||||||
|
|
||||||
# 3. 本地 Ollama(文本融合 + AI 对话,不参与视觉)
|
# 3. 本地 Ollama(纯文本,仅 Q&A 兜底,不参与视觉分析、不参与云端结果融合)
|
||||||
- provider: "ollama"
|
- provider: "ollama"
|
||||||
role: "text" # 文本融合 + AI 对话
|
role: "text" # 仅问答兜底
|
||||||
|
usage: "qa_fallback" # Gemini/NVIDIA 都失败时才启用
|
||||||
enabled: true
|
enabled: true
|
||||||
model_name: "qwen2.5:7b"
|
model_name: "qwen2.5:7b"
|
||||||
base_url: "http://localhost:11434"
|
base_url: "http://localhost:11434"
|
||||||
timeout: 60
|
timeout: 120
|
||||||
|
num_predict: 512
|
||||||
circuit_breaker:
|
circuit_breaker:
|
||||||
enabled: false
|
enabled: false
|
||||||
```
|
```
|
||||||
@@ -604,7 +603,7 @@ cd fam-ui && streamlit run src/app.py
|
|||||||
| 项目 | 值 |
|
| 项目 | 值 |
|
||||||
|------|-----|
|
|------|-----|
|
||||||
| API Key | AQ.Ab8RN6I0l8hC7hLnNHRY6qOXdch5CTWczDNlS4c1XrneGHipUQ |
|
| API Key | AQ.Ab8RN6I0l8hC7hLnNHRY6qOXdch5CTWczDNlS4c1XrneGHipUQ |
|
||||||
| 模型 | `gemini-1.5-flash`(生产配置);`gemini-flash-latest`(curl 验证端点别名) |
|
| 模型 | `gemini-flash-latest`(生产配置,v1beta 下 `gemini-1.5-flash` 会 404,故用别名) |
|
||||||
| 端点 | https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent |
|
| 端点 | https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent |
|
||||||
| 验证状态 | 2026-08-20 测试可用 |
|
| 验证状态 | 2026-08-20 测试可用 |
|
||||||
|
|
||||||
@@ -624,7 +623,7 @@ curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lates
|
|||||||
| Base URL | `https://integrate.api.nvidia.com/v1` |
|
| Base URL | `https://integrate.api.nvidia.com/v1` |
|
||||||
| 默认模型 | `meta/llama-3.2-11b-vision-instruct`(可替换 `qwen/qwen2-vl-72b-instruct`) |
|
| 默认模型 | `meta/llama-3.2-11b-vision-instruct`(可替换 `qwen/qwen2-vl-72b-instruct`) |
|
||||||
| SDK | `openai` Python SDK(NIM 兼容 OpenAI API 规范,直接复用) |
|
| SDK | `openai` Python SDK(NIM 兼容 OpenAI API 规范,直接复用) |
|
||||||
| 验证状态 | 待测(2026-08-20 配置完成,单图连通性验证脚本见 8.3) |
|
| 验证状态 | 已验证(2026-08-20 部署验证:`/api/edge/chat/ask` 实测 provider=nvidia,Gemini 超时后 NVIDIA 兜底成功;单图连通性验证脚本见 8.3) |
|
||||||
|
|
||||||
**环境变量**:
|
**环境变量**:
|
||||||
|
|
||||||
@@ -663,11 +662,16 @@ export NVIDIA_API_KEY="nvapi-9cFAdO5xdbwPuxS8KGRTnlVimn1gJzbbbzWNhPwHa_Yl3pTe-Pf
|
|||||||
- 模型基准测试(原 llava-phi3 预热 4.3s PASS,**已替换为 qwen2.5:7b**);Ollama 常驻内存
|
- 模型基准测试(原 llava-phi3 预热 4.3s PASS,**已替换为 qwen2.5:7b**);Ollama 常驻内存
|
||||||
- 架构改为推送模式(NAS 上传整段视频 → Edge 同步分析 → 结果随响应返回)
|
- 架构改为推送模式(NAS 上传整段视频 → Edge 同步分析 → 结果随响应返回)
|
||||||
- 关键帧自适应帧数 + FFmpeg 快速 seek(6-8x 提速)
|
- 关键帧自适应帧数 + FFmpeg 快速 seek(6-8x 提速)
|
||||||
- FAM-Core API 全端点测试通过;端到端聊天链路(Core→Edge→Ollama)验证
|
- FAM-Core API 全端点测试通过
|
||||||
- FAM-UI 部署(Streamlit 1.61.1)
|
- FAM-UI 部署(Streamlit 1.61.1)
|
||||||
- 真实视频性能基准(30min/360MB → 929s)
|
- 真实视频性能基准(30min/360MB → 929s)
|
||||||
- **E2E 全链路打通**:task 289 → SUCCESS,monitor_events/event_details 落库正确
|
- **E2E 全链路打通**:task 289 → SUCCESS,monitor_events/event_details 落库正确
|
||||||
- 可靠性加固:僵尸任务回收、文件日志、datetime 空值兜底、超时按实测调整
|
- 可靠性加固:僵尸任务回收、文件日志、datetime 空值兜底、超时按实测调整
|
||||||
|
- **架构重构(移除本地融合,云端直出直存)**:
|
||||||
|
- 视频分析链路:云端 VLM(Gemini `gemini-flash-latest` / NVIDIA NIM `llama-3.2-11b-vision-instruct`)直出结构化 JSON → Edge `format_cloud_result` 格式化/校验(无模型调用)→ 直存 NAS DB;本地 Ollama 不再参与视频摘要与融合(`run_text_fusion` 已移除)
|
||||||
|
- 智能问答链路:新增 `chat()` 方法,`run_qa` 按 Gemini → NVIDIA → 本地 Ollama 降级编排;端点 `/api/edge/chat/ask`;NAS Chat-Handler 经 Edge 编排(`qa_url`),不再直连 Ollama
|
||||||
|
- 生产目录已切回 `/volume1/surveillance/Generic_ONVIF-001`,285 历史视频 forward-only 占位跳过
|
||||||
|
- **双端部署验证通过**(2026-08-20):Oracle Edge 7 文件部署 + 重启,`/api/edge/chat/ask` 实测 provider=nvidia(Gemini 超时→NVIDIA 兜底成功);NAS chat_handler + config 手术式更新 + HUP 重载,插入临时上下文实测 NAS→Edge 编排链路 43s 返回并落库(测试数据已清理);Edge 日志确认 task 294(360MB)以新架构处理中、三模型健康检查全通过
|
||||||
|
|
||||||
详细进度见 `PROGRESS.md`。
|
详细进度见 `PROGRESS.md`。
|
||||||
|
|
||||||
@@ -675,14 +679,9 @@ export NVIDIA_API_KEY="nvapi-9cFAdO5xdbwPuxS8KGRTnlVimn1gJzbbbzWNhPwHa_Yl3pTe-Pf
|
|||||||
|
|
||||||
| # | 任务 | 优先级 |
|
| # | 任务 | 优先级 |
|
||||||
|---|------|--------|
|
|---|------|--------|
|
||||||
| 1 | 接入云端视觉模型(Gemini `gemini-1.5-flash` + NVIDIA NIM `llama-3.2-11b-vision-instruct`),承担全部视觉分析;本地 Ollama 专职文本融合与 AI 对话(不再参与视觉) | 高 |
|
| 1 | 单元测试(JSON parser / circuit breaker / schema 校验) | 中 |
|
||||||
| 2 | 实现 `NvidiaVisionAdapter`(基于 openai SDK,Base64 多图内联,`role: vision`)并在 `build_adapter` 工厂注册 `provider: nvidia` | 高 |
|
| 2 | Tailscale 修复(NAS userspace 模式升级,流量不走公网) | 低 |
|
||||||
| 3 | Orchestrator 视觉阶段按 `fallback` 降级 Gemini → NVIDIA NIM,全失败则任务 FAILED;文本阶段固定调本地 Ollama 融合;`compute_provider` / `source_providers` 兼容 `nvidia` 标签 | 高 |
|
| 3 | daily_summaries 每日摘要 | 低 |
|
||||||
| 4 | analyze_frames 改逐帧请求(云端模型支持多图,但逐帧更稳;同时解决历史 llava-phi3 多图失效问题,新方案本地 qwen2.5:7b 不参与视觉,该问题随之消除) | 高 |
|
|
||||||
| 5 | 切回生产视频目录(/volume1/surveillance/Generic_ONVIF-001),确认历史视频回补策略 | 高 |
|
|
||||||
| 6 | 单元测试(JSON parser / circuit breaker / schema 校验) | 中 |
|
|
||||||
| 7 | Tailscale 修复(NAS userspace 模式升级,流量不走公网) | 低 |
|
|
||||||
| 8 | daily_summaries 每日摘要 | 低 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user