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:
ericwyuan
2026-08-20 10:45:29 +08:00
parent babf5b09a9
commit 2e43afb6b2
2 changed files with 73 additions and 62 deletions

View File

@@ -34,10 +34,10 @@
| 问题 | 现状 | 影响 |
|------|------|------|
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4**已替换为 qwen2.5:7b**(纯文本模型,专职融合与对话 | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
| **吞吐不足** | 30s 视频全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min30min/360MB 视频实测 929s | 生产视频每 30 分钟新增一个,处理速度勉强跟上但无余量;改用云端模型后该问题随之缓解 |
| **llava-phi3 多图单请求失效(已替换)** | 原本地模型 llava-phi3 `analyze_frames` 多图单请求输出长度仅 3~4**已替换为 qwen2.5:7b**(纯文本模型,专职问答兜底 | 历史遗留描述,新方案下视觉走云端,本地不参与视觉分析,该问题随之消除 |
| **吞吐不足** | 历史本地模型全流程约 19 分钟(关键帧筛选 10min + VLM 5.5min + 融合 3min30min/360MB 视频实测 929s | 已切换到云端 VLM 直出结构化 JSON无本地融合步骤吞吐瓶颈转移至云端调用延迟整体明显改善 |
| **Tailscale 端口不通** | NAS tailscaled 以 userspace 模式运行(无 TUN 网卡Oracle 无法反向访问 NAS当前 NAS→Oracle 走公网 IP | 推送模式已规避反向访问,但流量走公网 |
| **历史视频积压** | 正式目录 `/volume1/surveillance/Generic_ONVIF-001` 有约 285 个历史视频(~100GB288 个历史任务已标记 FAILED 避免全量上传 | 切回生产目录前需确认回补策略 |
| **历史视频积压(已处理)** | 正式目录 `/volume1/surveillance/Generic_ONVIF-001` 有约 285 个历史视频(~100GB已切回生产目录并 forward-only 处理:历史任务占位 FAILEDscheduler 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.3GB12GB 内存够用) |
| `num_predict=60` | 限制生成 token | ARM 约 5 tok/s500 会单帧跑数分钟触发超时 |
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token |
| 融合 timeout | 300s | — |
| `num_predict=512` | 限制生成 token | ARM 约 5 tok/s过长生成会拖慢问答响应 |
| 视觉/模型 timeout | 600s | 实测 1024px 帧视觉编码 ~36s + 生成 ~12s/60token(问答链路改用 config 中各模型 timeout |
| gunicornEdge | `--timeout 1800` | 同步分析模式,默认 30s 会杀 worker |
| push_timeoutNAS | 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=28930s 测试片段)全链路打通:推送 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-001YYYYMMDDAM/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 SDKNIM 兼容 OpenAI API 规范,直接复用) |
| 验证状态 | 待测2026-08-20 配置完成,单图连通性验证脚本见 8.3 |
| 验证状态 | 已验证2026-08-20 部署验证:`/api/edge/chat/ask` 实测 provider=nvidiaGemini 超时后 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 快速 seek6-8x 提速)
- FAM-Core API 全端点测试通过端到端聊天链路Core→Edge→Ollama验证
- FAM-Core API 全端点测试通过
- FAM-UI 部署Streamlit 1.61.1
- 真实视频性能基准30min/360MB → 929s
- **E2E 全链路打通**task 289 → SUCCESSmonitor_events/event_details 落库正确
- 可靠性加固僵尸任务回收、文件日志、datetime 空值兜底、超时按实测调整
- **架构重构(移除本地融合,云端直出直存)**
- 视频分析链路:云端 VLMGemini `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-20Oracle Edge 7 文件部署 + 重启,`/api/edge/chat/ask` 实测 provider=nvidiaGemini 超时→NVIDIA 兜底成功NAS chat_handler + config 手术式更新 + HUP 重载,插入临时上下文实测 NAS→Edge 编排链路 43s 返回并落库测试数据已清理Edge 日志确认 task 294360MB以新架构处理中、三模型健康检查全通过
详细进度见 `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 SDKBase64 多图内联,`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 每日摘要 | |
---