diff --git a/PROGRESS.md b/PROGRESS.md index 967fc3f..df13a51 100644 --- a/PROGRESS.md +++ b/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-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 | -| 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 | | 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内) | | | FFmpeg | 已安装 | apt 安装 | | Ollama | 0.32.14 | | -| llava-phi3:latest | 2.9 GB 已拉取 | | +| qwen2.5:7b | 已拉取 | 纯文本模型,仅问答兜底(原 llava-phi3 已废弃) | | Python 依赖 | 全部安装成功 | flask, gunicorn, requests, PyYAML, opencv, numpy | | 模块导入验证 | PASS | FAM-Edge 全部 8 个模块导入正常 | | 代码部署 | /opt/fam-edge/ | rsync 同步 | @@ -109,27 +109,36 @@ | 29 | 关键帧提取改为自适应帧数 (随视频时长动态计算) | ✅ 完成 | 2026-08-20 | | 30 | FFmpeg 快速 seek 替代 fps 滤镜 (6-8x 提速) | `7ce8aff` | 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 ✅ | 高 | -| 33 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 | -| 34 | Tailscale 防火墙修复 (NAS↔Oracle) | - | 低 | +| 39 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 | +| 40 | Tailscale 防火墙修复 (NAS↔Oracle) | - | 低 | +| 41 | daily_summaries 每日摘要 | - | 低 | ## 技术决策记录 1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8 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 无需编译 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 -7. **FAM-Edge 聊天代理** - Ollama 端口 11434 未对外暴露,FAM-Edge 新增 /api/edge/chat 代理转发至本地 Ollama -8. **Oracle 公网 IP 替代 Tailscale** - Tailscale 两节点在线但端口不通(防火墙),edge_url 和 ollama_url 改用 Oracle 公网 IP 129.146.203.203 +7. **FAM-Edge 聊天代理** - 历史:/api/edge/chat 直连 Ollama 代理;架构重构后被 `/api/edge/chat/ask` 三模型编排端点取代(旧端点保留兼容) +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 够用) 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 -frames:v 1` 快速 seek,仅 33s(6-8x 提速) ## 真实视频性能基准测试 (2026-08-20) @@ -158,13 +167,16 @@ AI 分析瓶颈: 帧5耗时 229s (疑似 ARM CPU 热降频), 其余帧 50-65s | /api/member/name | POST | 人物A→张三 | ✅ 成功命名, 0 条事件记录回溯更新 | | /api/chat/ask | POST | "今天有什么事件?" | ✅ 端到端成功, 回答"今天没有观察到张三" | -## 端到端聊天链路验证 (2026-08-20) +## 端到端聊天链路验证 (2026-08-20,新架构) ``` -用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Ollama (Oracle:11434) - /api/edge/chat 代理 /api/generate 本地 +用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Gemini / NVIDIA NIM / 本地 Ollama (兜底) + /api/edge/chat/ask run_qa 三模型降级编排 ``` -- FAM-Core 调用 `ollama_url` 配置的 `http://129.146.203.203:5000/api/edge/chat` -- FAM-Edge 代理转发至 `http://127.0.0.1:11434/api/generate` -- 回答正常返回,chat_history 记录已保存 (chat_id=1) +- FAM-Core Chat-Handler 调用 `qa_url` 配置的 `http://129.146.203.203:5000/api/edge/chat/ask`(不再直连 Ollama) +- FAM-Edge `run_qa` 按 Gemini → NVIDIA → 本地 Ollama 顺序调用 `chat()`,首个成功即返回 `{answer, provider}` +- **验证结果**: + - 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,属正常设计 diff --git a/README.md b/README.md index 8cfaa35..d0f37ea 100644 --- a/README.md +++ b/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/?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 每日摘要 | 低 | ---