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:
91
README.md
91
README.md
@@ -34,10 +34,10 @@
|
||||
|
||||
| 问题 | 现状 | 影响 |
|
||||
|------|------|------|
|
||||
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4;**已替换为 qwen2.5:7b**(纯文本模型,专职融合与对话) | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
|
||||
| **吞吐不足** | 30s 视频全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min);30min/360MB 视频实测 929s | 生产视频每 30 分钟新增一个,处理速度勉强跟上但无余量;改用云端模型后该问题随之缓解 |
|
||||
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4;**已替换为 qwen2.5:7b**(纯文本模型,专职问答兜底) | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
|
||||
| **吞吐不足** | 历史本地模型全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min);30min/360MB 视频实测 929s | 已切换到云端 VLM 直出结构化 JSON(无本地融合步骤),吞吐瓶颈转移至云端调用延迟,整体明显改善 |
|
||||
| **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 | 全部成员 |
|
||||
| `/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 内存够用) |
|
||||
| `num_predict=60` | 限制生成 token | ARM 约 5 tok/s,500 会单帧跑数分钟触发超时 |
|
||||
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token |
|
||||
| 融合 timeout | 300s | — |
|
||||
| `num_predict=512` | 限制生成 token | ARM 约 5 tok/s,过长生成会拖慢问答响应 |
|
||||
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token(问答链路改用 config 中各模型 timeout) |
|
||||
| gunicorn(Edge) | `--timeout 1800` | 同步分析模式,默认 30s 会杀 worker |
|
||||
| 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 模型适配器架构
|
||||
|
||||
@@ -432,54 +436,47 @@ task_id=289(30s 测试片段)全链路打通:推送 5.7MB → Edge 分析
|
||||
|
||||
### 8.3 配置文件要点
|
||||
|
||||
**fam-core/config/config.yaml**(NAS):
|
||||
**fam-core/config/config.yaml**(NAS,生产值):
|
||||
|
||||
```yaml
|
||||
scheduler:
|
||||
video_dir: "/volume1/web/sentinel-home-ai/e2e-test" # 当前指向 E2E 测试目录
|
||||
# 正式目录: /volume1/surveillance/Generic_ONVIF-001(YYYYMMDDAM/PM 两级子目录,
|
||||
# os.walk 递归支持;切回前需处理 285 个历史视频积压,避免全量上传 ~100GB)
|
||||
video_dir: "/volume1/surveillance/Generic_ONVIF-001" # 生产目录(YYYYMMDDAM/PM 两级子目录)
|
||||
# 285 个历史视频由占位 FAILED 任务占用路径,scheduler dedup 自动跳过(forward-only 模式)
|
||||
dispatcher:
|
||||
edge_url: "http://129.146.203.203:5000/api/edge/video/push"
|
||||
push_timeout: 1800
|
||||
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
|
||||
# 调度模式配置: fallback(顺序降级) 或 ensemble(并行交叉验证)
|
||||
# 编排调度模式: fallback(顺序降级, 默认) | ensemble(并行交叉验证)
|
||||
orchestrator:
|
||||
mode: "fallback"
|
||||
overall_timeout: 600
|
||||
|
||||
# 关键帧配置
|
||||
video:
|
||||
candidate_frames: 30
|
||||
min_key_frames: 5
|
||||
max_key_frames: 12
|
||||
mse_threshold: 500
|
||||
jpeg_quality: 80
|
||||
max_long_edge: 1024
|
||||
|
||||
# 多模型池配置(视觉: Gemini → NVIDIA NIM 降级;文本: 本地 Ollama)
|
||||
# 多模型池配置(新框架:本地大模型不参与视频分析,仅智能问答兜底)
|
||||
# 视频分析链路: 云端 VLM 直出结构化 JSON → Edge format_cloud_result 格式化/校验 → 直存 NAS DB(无本地融合)
|
||||
# 智能问答链路: Gemini → NVIDIA → 本地 Ollama(仅两云端都失败才启用本地兜底)
|
||||
models:
|
||||
# 1. Google Gemini 1.5 Flash(视觉主)
|
||||
# 1. Google Gemini(视觉主 + 参与问答)
|
||||
- provider: "gemini"
|
||||
role: "vision" # 视觉分析
|
||||
role: "vision" # 视觉分析 + 问答(vision role 也参与 chat)
|
||||
enabled: true
|
||||
model_name: "gemini-1.5-flash"
|
||||
model_name: "gemini-flash-latest" # v1beta 下 gemini-1.5-flash 会 404
|
||||
api_key: "${GEMINI_API_KEY}"
|
||||
timeout: 15
|
||||
timeout: 30
|
||||
circuit_breaker:
|
||||
enabled: true
|
||||
threshold: 3
|
||||
cooldown: 600
|
||||
|
||||
# 2. NVIDIA NIM 托管 API(视觉备)
|
||||
# 2. NVIDIA NIM 托管 API(视觉备 + 参与问答)
|
||||
- provider: "nvidia"
|
||||
role: "vision" # 视觉分析
|
||||
role: "vision" # 视觉分析 + 问答(vision role 也参与 chat)
|
||||
enabled: true
|
||||
model_name: "meta/llama-3.2-11b-vision-instruct" # 或 qwen/qwen2-vl-72b-instruct
|
||||
base_url: "https://integrate.api.nvidia.com/v1"
|
||||
@@ -490,13 +487,15 @@ models:
|
||||
threshold: 3
|
||||
cooldown: 600
|
||||
|
||||
# 3. 本地 Ollama(文本融合 + AI 对话,不参与视觉)
|
||||
# 3. 本地 Ollama(纯文本,仅 Q&A 兜底,不参与视觉分析、不参与云端结果融合)
|
||||
- provider: "ollama"
|
||||
role: "text" # 文本融合 + AI 对话
|
||||
role: "text" # 仅问答兜底
|
||||
usage: "qa_fallback" # Gemini/NVIDIA 都失败时才启用
|
||||
enabled: true
|
||||
model_name: "qwen2.5:7b"
|
||||
base_url: "http://localhost:11434"
|
||||
timeout: 60
|
||||
timeout: 120
|
||||
num_predict: 512
|
||||
circuit_breaker:
|
||||
enabled: false
|
||||
```
|
||||
@@ -604,7 +603,7 @@ cd fam-ui && streamlit run src/app.py
|
||||
| 项目 | 值 |
|
||||
|------|-----|
|
||||
| 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 |
|
||||
| 验证状态 | 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` |
|
||||
| 默认模型 | `meta/llama-3.2-11b-vision-instruct`(可替换 `qwen/qwen2-vl-72b-instruct`) |
|
||||
| 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 常驻内存
|
||||
- 架构改为推送模式(NAS 上传整段视频 → Edge 同步分析 → 结果随响应返回)
|
||||
- 关键帧自适应帧数 + FFmpeg 快速 seek(6-8x 提速)
|
||||
- FAM-Core API 全端点测试通过;端到端聊天链路(Core→Edge→Ollama)验证
|
||||
- FAM-Core API 全端点测试通过
|
||||
- FAM-UI 部署(Streamlit 1.61.1)
|
||||
- 真实视频性能基准(30min/360MB → 929s)
|
||||
- **E2E 全链路打通**:task 289 → SUCCESS,monitor_events/event_details 落库正确
|
||||
- 可靠性加固:僵尸任务回收、文件日志、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`。
|
||||
|
||||
@@ -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 对话(不再参与视觉) | 高 |
|
||||
| 2 | 实现 `NvidiaVisionAdapter`(基于 openai SDK,Base64 多图内联,`role: vision`)并在 `build_adapter` 工厂注册 `provider: nvidia` | 高 |
|
||||
| 3 | Orchestrator 视觉阶段按 `fallback` 降级 Gemini → NVIDIA NIM,全失败则任务 FAILED;文本阶段固定调本地 Ollama 融合;`compute_provider` / `source_providers` 兼容 `nvidia` 标签 | 高 |
|
||||
| 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 每日摘要 | 低 |
|
||||
| 1 | 单元测试(JSON parser / circuit breaker / schema 校验) | 中 |
|
||||
| 2 | Tailscale 修复(NAS userspace 模式升级,流量不走公网) | 低 |
|
||||
| 3 | daily_summaries 每日摘要 | 低 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user