docs: update docs_v1.0/ documentation
- Fix markdown lint issues (MD030, MD047, MD051, MD028, MD005) - Update AI agents, architecture, implementation docs - Add new identity, face recognition, and API documentation - Remove deprecated face/person API guides
This commit is contained in:
@@ -35,25 +35,25 @@
|
||||
#### 🚨 H1: `faces` 表與 `file_identities` 表的關係不清
|
||||
|
||||
**問題**:
|
||||
* `FILE_IDENTITY_API_DESIGN.md` 同時定義了 `faces` 表和 `file_identities` 表。
|
||||
* `faces` 表有 `identity_id` (表示 Face 可直接歸屬 Identity)。
|
||||
* `file_identities` 表也有身份關聯資訊。
|
||||
* **兩者的職責重疊**,開發者會困惑該寫入哪張表。
|
||||
* `FILE_IDENTITY_API_DESIGN.md` 同時定義了 `faces` 表和 `file_identities` 表。
|
||||
* `faces` 表有 `identity_id` (表示 Face 可直接歸屬 Identity)。
|
||||
* `file_identities` 表也有身份關聯資訊。
|
||||
* **兩者的職責重疊**,開發者會困惑該寫入哪張表。
|
||||
|
||||
**建議**:
|
||||
* **方案 A**: 移除 `faces` 表,將 Face 視為 `pre_chunk` 的一種類型,Face 與 Identity 的關聯僅通過 `file_identities` 管理。
|
||||
* **方案 B**: 保留 `faces` 表,但明確定義其為「Face 檢測原始數據表」,`file_identities` 僅作為「Face 與 Identity 的多對多關聯橋接表」。
|
||||
* **推薦方案 A**:符合「Frame = Pre-chunk」的設計理念,減少冗餘。
|
||||
* **方案 A**: 移除 `faces` 表,將 Face 視為 `pre_chunk` 的一種類型,Face 與 Identity 的關聯僅通過 `file_identities` 管理。
|
||||
* **方案 B**: 保留 `faces` 表,但明確定義其為「Face 檢測原始數據表」,`file_identities` 僅作為「Face 與 Identity 的多對多關聯橋接表」。
|
||||
* **推薦方案 A**:符合「Frame = Pre-chunk」的設計理念,減少冗餘。
|
||||
|
||||
#### 🚨 H2: 缺少 `pre_chunks` 表的 Schema 定義
|
||||
|
||||
**問題**:
|
||||
* `FILE_IDENTITY_API_DESIGN.md` 中**未定義** `pre_chunks` 表結構。
|
||||
* 但 `PROCESSOR_RESUME_STRATEGY.md` 明確指出 Processor 應產出 `pre_chunks`。
|
||||
* 實作時將無參考標準。
|
||||
* `FILE_IDENTITY_API_DESIGN.md` 中**未定義** `pre_chunks` 表結構。
|
||||
* 但 `PROCESSOR_RESUME_STRATEGY.md` 明確指出 Processor 應產出 `pre_chunks`。
|
||||
* 實作時將無參考標準。
|
||||
|
||||
**建議**:
|
||||
* 在設計文件中補充 `pre_chunks` 表定義,至少包含:
|
||||
* 在設計文件中補充 `pre_chunks` 表定義,至少包含:
|
||||
```sql
|
||||
pre_chunks (
|
||||
pre_chunk_id UUID PK,
|
||||
@@ -69,13 +69,13 @@
|
||||
#### 🚨 H3: Candidate 與 Face 的關係未明確定義
|
||||
|
||||
**問題**:
|
||||
* 設計說「Candidate 是未被確認歸屬 Identity 的 face」。
|
||||
* 但資料庫中沒有 `candidates` 表。
|
||||
* Candidate 是邏輯狀態還是物理表?
|
||||
* 設計說「Candidate 是未被確認歸屬 Identity 的 face」。
|
||||
* 但資料庫中沒有 `candidates` 表。
|
||||
* Candidate 是邏輯狀態還是物理表?
|
||||
|
||||
**建議**:
|
||||
* **方案 A (推薦)**: Candidate 不需要獨立表。`faces.identity_id IS NULL` 即代表該 Face 是 Candidate。
|
||||
* 在 API 設計中明確說明:`GET /people/candidates` = `SELECT * FROM faces WHERE identity_id IS NULL`。
|
||||
* **方案 A (推薦)**: Candidate 不需要獨立表。`faces.identity_id IS NULL` 即代表該 Face 是 Candidate。
|
||||
* 在 API 設計中明確說明:`GET /people/candidates` = `SELECT * FROM faces WHERE identity_id IS NULL`。
|
||||
|
||||
---
|
||||
|
||||
@@ -84,38 +84,38 @@
|
||||
#### ⚠️ M1: 缺少 Chunk 聚合規則的輸入輸出定義
|
||||
|
||||
**問題**:
|
||||
* Rule 1/2/3 如何讀取 `pre_chunks` 並產出 `chunks`?
|
||||
* 沒有明確的數據流說明。
|
||||
* Rule 1/2/3 如何讀取 `pre_chunks` 並產出 `chunks`?
|
||||
* 沒有明確的數據流說明。
|
||||
|
||||
**建議**:
|
||||
* 補充 `CHUNKING` 目錄下的規則文件,定義每個 Rule 的:
|
||||
* **Input**: 從哪些 `pre_chunks` 讀取?
|
||||
* **Logic**: 聚合邏輯是什麼?
|
||||
* **Output**: 產出什麼樣的 `chunk`?
|
||||
* 補充 `CHUNKING` 目錄下的規則文件,定義每個 Rule 的:
|
||||
* **Input**: 從哪些 `pre_chunks` 讀取?
|
||||
* **Logic**: 聚合邏輯是什麼?
|
||||
* **Output**: 產出什麼樣的 `chunk`?
|
||||
|
||||
#### ⚠️ M2: Resource Registry 與現有 Job Worker 的整合
|
||||
|
||||
**問題**:
|
||||
* `UNIFIED_RESOURCE_REGISTRY.md` 定義了統一的資源註冊機制。
|
||||
* 但現有的 `src/worker/job_worker.rs` 是硬編碼調度 (`ProcessorType::all()`)。
|
||||
* 如何過渡?
|
||||
* `UNIFIED_RESOURCE_REGISTRY.md` 定義了統一的資源註冊機制。
|
||||
* 但現有的 `src/worker/job_worker.rs` 是硬編碼調度 (`ProcessorType::all()`)。
|
||||
* 如何過渡?
|
||||
|
||||
**建議**:
|
||||
* 定義過渡路徑:
|
||||
1. **Phase 1**: Worker 仍使用硬編碼,但 Processor 啟動時額外註冊到 Registry(僅用於監控)。
|
||||
2. **Phase 2**: Worker 改為從 Registry 動態發現資源。
|
||||
* 定義過渡路徑:
|
||||
1. **Phase 1**: Worker 仍使用硬編碼,但 Processor 啟動時額外註冊到 Registry(僅用於監控)。
|
||||
2. **Phase 2**: Worker 改為從 Registry 動態發現資源。
|
||||
|
||||
#### ⚠️ M3: 檔案類型限制與欄位設計
|
||||
|
||||
**問題**:
|
||||
* `files` 表定義了 `file_type` (video, pdf...) 但現階段僅處理 Video。
|
||||
* `pre_chunks` 和 `chunks` 表若設計時未考慮擴充性,未來加 PDF 時需大改。
|
||||
* `files` 表定義了 `file_type` (video, pdf...) 但現階段僅處理 Video。
|
||||
* `pre_chunks` 和 `chunks` 表若設計時未考慮擴充性,未來加 PDF 時需大改。
|
||||
|
||||
**建議**:
|
||||
* 在 `pre_chunks` 表加入 `coordinate_type` 欄位:
|
||||
* Video: 使用 `frame_index` (幀號)
|
||||
* Text: 使用 `page_number` + `paragraph_index`
|
||||
* 確保 Schema 可容納未來的檔案類型。
|
||||
* 在 `pre_chunks` 表加入 `coordinate_type` 欄位:
|
||||
* Video: 使用 `frame_index` (幀號)
|
||||
* Text: 使用 `page_number` + `paragraph_index`
|
||||
* 確保 Schema 可容納未來的檔案類型。
|
||||
|
||||
---
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
| 文件 | 使用的術語 | 建議統一為 |
|
||||
|------|-----------|-----------|
|
||||
| `FILE_IDENTITY_API_DESIGN.md` | `file_id` | `file_id` |
|
||||
| `PROCESSOR_RESUME_STRATEGY.md` | `video_uuid` | `file_id` |
|
||||
| `PROCESSOR_RESUME_STRATEGY.md` | `file_uuid` | `file_id` |
|
||||
| 現有程式碼 | `uuid` | `file_id` |
|
||||
|
||||
**建議**: 全文統一使用 `file_id` 或 `file_uuid`,避免混用。
|
||||
@@ -165,17 +165,17 @@ API 設計中定義了 `{"ok": false, "error": "..."}` 但未列出標準錯誤
|
||||
## 4. 建議的行動計畫
|
||||
|
||||
### Phase 0: 文檔修正 (立即)
|
||||
- [ ] 在 `FILE_IDENTITY_API_DESIGN.md` 中補充 `pre_chunks` 表 Schema (解決 H2)
|
||||
- [ ] 明確定義 `faces` vs `file_identities` 的職責分工 (解決 H1)
|
||||
- [ ] 統一術語 (`file_id` vs `video_uuid`) (解決 L1)
|
||||
* [ ] 在 `FILE_IDENTITY_API_DESIGN.md` 中補充 `pre_chunks` 表 Schema (解決 H2)
|
||||
* [ ] 明確定義 `faces` vs `file_identities` 的職責分工 (解決 H1)
|
||||
* [ ] 統一術語 (`file_id` vs `file_uuid`) (解決 L1)
|
||||
|
||||
### Phase 1: 補充缺失文檔
|
||||
- [ ] 撰寫 `CHUNKING/RULES/RULE_SPEC.md` (解決 M1)
|
||||
- [ ] 撰寫 `MIGRATION_GUIDE.md` (從舊系統過渡)
|
||||
- [ ] 撰寫 `API_ERROR_CODES.md` (解決 L3)
|
||||
* [ ] 撰寫 `CHUNKING/RULES/RULE_SPEC.md` (解決 M1)
|
||||
* [ ] 撰寫 `MIGRATION_GUIDE.md` (從舊系統過渡)
|
||||
* [ ] 撰寫 `API_ERROR_CODES.md` (解決 L3)
|
||||
|
||||
### Phase 2: 架構對齊
|
||||
- [ ] 確認 Resource Registry 與現有 Job Worker 的整合路徑 (解決 M2)
|
||||
* [ ] 確認 Resource Registry 與現有 Job Worker 的整合路徑 (解決 M2)
|
||||
|
||||
---
|
||||
|
||||
@@ -183,9 +183,9 @@ API 設計中定義了 `{"ok": false, "error": "..."}` 但未列出標準錯誤
|
||||
|
||||
目前的架構設計在**核心概念** (File + Identity + Pre-chunk + Chunk) 上是正確的,方向明確。
|
||||
主要缺失在於:
|
||||
1. **`pre_chunks` 表未定義** (最關鍵,影響實作)
|
||||
2. **Face/Candidate 的關係需要更清晰的表述**
|
||||
3. **缺少舊系統遷移策略**
|
||||
1. **`pre_chunks` 表未定義** (最關鍵,影響實作)
|
||||
2. **Face/Candidate 的關係需要更清晰的表述**
|
||||
3. **缺少舊系統遷移策略**
|
||||
|
||||
建議在進入 Implementation Phase 前,先完成 Phase 0 的文檔修正。
|
||||
|
||||
@@ -193,6 +193,6 @@ API 設計中定義了 `{"ok": false, "error": "..."}` 但未列出標準錯誤
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: V1.0
|
||||
- 審查日期: 2026-04-25
|
||||
- 審查者: OpenCode
|
||||
* 版本: V1.0
|
||||
* 審查日期: 2026-04-25
|
||||
* 審查者: OpenCode
|
||||
|
||||
@@ -12,14 +12,14 @@ created_by: "OpenCode"
|
||||
created_at: "2026-04-25"
|
||||
version: "V1.0"
|
||||
tags:
|
||||
- "documentation"
|
||||
- "ai-agent"
|
||||
- "analysis"
|
||||
- "docs_v1.0"
|
||||
- "documentation"
|
||||
- "ai-agent"
|
||||
- "analysis"
|
||||
- "docs_v1.0"
|
||||
ai_query_hints:
|
||||
- "docs_v1.0 文件規範有哪些缺失?"
|
||||
- "如何改進文件的 AI Agent 友好性?"
|
||||
- "哪些文件需要補充 YAML Frontmatter?"
|
||||
- "docs_v1.0 文件規範有哪些缺失?"
|
||||
- "如何改進文件的 AI Agent 友好性?"
|
||||
- "哪些文件需要補充 YAML Frontmatter?"
|
||||
---
|
||||
|
||||
| 項目 | 內容 |
|
||||
|
||||
@@ -71,12 +71,12 @@
|
||||
|
||||
### 3.1 立即刪除 (已失效)
|
||||
以下文件因架構被完全推翻,建議直接刪除:
|
||||
1. `docs_v1.0/ARCHITECTURE/TMDB_CHARACTER_INTEGRATION.md`
|
||||
2. `docs_v1.0/ARCHITECTURE/SPEAKER_INTEGRATION.md`
|
||||
3. `docs_v1.0/ARCHITECTURE/IDENTITY_SYSTEM_DESIGN.md`
|
||||
1. `docs_v1.0/ARCHITECTURE/TMDB_CHARACTER_INTEGRATION.md`
|
||||
2. `docs_v1.0/ARCHITECTURE/SPEAKER_INTEGRATION.md`
|
||||
3. `docs_v1.0/ARCHITECTURE/IDENTITY_SYSTEM_DESIGN.md`
|
||||
|
||||
### 3.2 建立新文件 (Design Phase 2)
|
||||
1. 將上述刪除文件中有價值的業務邏輯 (如: 聲紋提取邏輯、TMDB 角色映射邏輯) 遷移至 `FILE_IDENTITY_API_DESIGN.md` 或新的 `PROCESSOR_DESIGN.md`。
|
||||
1. 將上述刪除文件中有價值的業務邏輯 (如: 聲紋提取邏輯、TMDB 角色映射邏輯) 遷移至 `FILE_IDENTITY_API_DESIGN.md` 或新的 `PROCESSOR_DESIGN.md`。
|
||||
|
||||
### 3.3 批量名詞替換
|
||||
在 `docs_v1.0` 中執行全局替換 (需謹慎):
|
||||
|
||||
@@ -70,31 +70,31 @@ ai_query_hints:
|
||||
|
||||
### 2.2 等級評估準則
|
||||
|
||||
#### P0 緊急事件(符合任一條件):
|
||||
#### P0 緊急事件(符合任一條件)
|
||||
- 核心服務完全不可用(網站無法訪問、API 完全無響應)
|
||||
- 數據庫完全無法連接
|
||||
- 安全事件導致系統被入侵
|
||||
- 影響所有用戶的關鍵功能故障
|
||||
|
||||
#### P1 高級事件(符合任一條件):
|
||||
#### P1 高級事件(符合任一條件)
|
||||
- 主要功能模塊不可用(如視頻處理、搜索功能失效)
|
||||
- 影響超過 50% 用戶的功能問題
|
||||
- 性能嚴重下降(響應時間 > 10秒)
|
||||
- 數據丟失或損壞風險
|
||||
|
||||
#### P2 中級事件(符合任一條件):
|
||||
#### P2 中級事件(符合任一條件)
|
||||
- 次要功能問題(如報告生成、特定查詢失敗)
|
||||
- 影響部分用戶(< 50%)的功能問題
|
||||
- 中等性能問題(響應時間 3-10秒)
|
||||
- 配置錯誤但不影響核心功能
|
||||
|
||||
#### P3 低級事件:
|
||||
#### P3 低級事件
|
||||
- 界面顯示問題(錯別字、格式不正確)
|
||||
- 輕微性能問題(響應時間 1-3秒)
|
||||
- 功能建議或改進請求
|
||||
- 不影響功能的日誌警告
|
||||
|
||||
#### P4 資訊事件:
|
||||
#### P4 資訊事件
|
||||
- 一般諮詢問題
|
||||
- 功能使用方法詢問
|
||||
- 非緊急的建議
|
||||
@@ -454,4 +454,4 @@ echo "事件報告已創建:$FILENAME"
|
||||
| 運維負責人 | Warren | | | |
|
||||
| 最終批准 | Warren | | | |
|
||||
|
||||
> **注意**:本文檔需經技術負責人和運維負責人審核後正式生效。
|
||||
> **注意**:本文檔需經技術負責人和運維負責人審核後正式生效。
|
||||
|
||||
@@ -361,4 +361,4 @@ RUST_LOG=debug ./target/debug/integrated_player ...
|
||||
|
||||
**創建日期**: 2026-04-02
|
||||
**版本**: 1.0.0
|
||||
**作者**: Momentry Team
|
||||
**作者**: Momentry Team
|
||||
|
||||
@@ -853,4 +853,4 @@ For ongoing maintenance, refer to the [Operations Manual](./MOMENTRY_CORE_OPERAT
|
||||
2. Perform load testing with production-like workload
|
||||
3. Establish monitoring and alerting
|
||||
4. Create disaster recovery runbook
|
||||
5. Schedule regular compliance audits
|
||||
5. Schedule regular compliance audits
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
# Release v0.4.0 封存記錄
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 建立者 | Warren |
|
||||
| 建立時間 | 2026-04-30 |
|
||||
| 文件版本 | V1.0 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-04-30 | 建立 v0.4.0 獨立封存 | Warren | OpenCode |
|
||||
|
||||
---
|
||||
|
||||
## 1. 封存資訊
|
||||
|
||||
### 1.1 基本資訊
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| **Release 版本** | v0.4.0 |
|
||||
| **封存日期** | 2026-04-30 |
|
||||
| **Binary 建置時間** | 2026-04-29 19:03 |
|
||||
| **Git 狀態** | Uncommitted changes (592 files modified) |
|
||||
| **封存位置** | `/Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/` |
|
||||
|
||||
### 1.2 封存內容
|
||||
|
||||
| 檔案 | 大小 | 內容 |
|
||||
|------|------|------|
|
||||
| `binaries_v0.4.0.tar.gz` | 28MB | 3 個 binary + data 目錄 |
|
||||
| `output_v0.4.0.tar.gz` | 6.9MB | output/ 目錄 (probe, asr, ocr json) |
|
||||
|
||||
### 1.3 包含的 Binary
|
||||
|
||||
| Binary | 大小 | 用途 |
|
||||
|--------|------|------|
|
||||
| `momentry` | 26MB | Production server (port 3002) |
|
||||
| `momentry_playground` | 30MB | Development server (port 3003) |
|
||||
| `momentry_player` | 7.5MB | Video player |
|
||||
|
||||
### 1.4 包含的 Data
|
||||
|
||||
| 項目 | 路徑 | 說明 |
|
||||
|------|------|------|
|
||||
| `data/` | `data/` | 同義詞、角色人臉、logo |
|
||||
| `english_synonyms.json` | 12KB | 英文同義詞 (135 words) |
|
||||
| `llm_synonyms.json` | 34KB | LLM 生成同義詞 (162 entries) |
|
||||
| `domain_synonyms.json` | 133B | 領域同義詞 |
|
||||
| `synonyms.json` | 348B | 基礎同義詞 |
|
||||
| `cast_faces/` | - | 角色人臉圖片 (Charade/4808) |
|
||||
| `logo_images/` | 56KB | Accusys Storage Logo |
|
||||
|
||||
---
|
||||
|
||||
## 2. 封存結構
|
||||
|
||||
```
|
||||
/Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/
|
||||
├── binaries/
|
||||
│ ├── momentry (26M) Production
|
||||
│ ├── momentry_playground (30M) Development
|
||||
│ └── momentry_player (7.5M) Player
|
||||
├── data/
|
||||
│ ├── cast_faces/
|
||||
│ │ └── Charade/
|
||||
│ │ └── 4808/
|
||||
│ │ ├── Audrey_Hepburn.jpg
|
||||
│ │ ├── Cary_Grant.jpg
|
||||
│ │ ├── George_Kennedy.jpg
|
||||
│ │ ├── James_Coburn.jpg
|
||||
│ │ ├── Walter_Matthau.jpg
|
||||
│ │ └── cast_data.json
|
||||
│ ├── logo_images/
|
||||
│ │ └── Accusys_Storage_Logo.png
|
||||
│ ├── domain_synonyms.json
|
||||
│ ├── english_synonyms.json
|
||||
│ ├── llm_synonyms.json
|
||||
│ └── synonyms.json
|
||||
├── RELEASE_INFO.txt
|
||||
├── binaries_v0.4.0.tar.gz (28M)
|
||||
└── output_v0.4.0.tar.gz (6.9M)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 還原指南
|
||||
|
||||
### 3.1 還原 Binary
|
||||
|
||||
```bash
|
||||
RELEASE_DIR="/Users/accusys/momentry_core_releases/v0.4.0-2026-04-30"
|
||||
|
||||
# 解壓縮 binary 與 data
|
||||
cd "$RELEASE_DIR"
|
||||
tar -xzf binaries_v0.4.0.tar.gz
|
||||
|
||||
# 使用 binary
|
||||
./binaries/momentry --help
|
||||
./binaries/momentry_playground --help
|
||||
```
|
||||
|
||||
### 3.2 還原 Output
|
||||
|
||||
```bash
|
||||
RELEASE_DIR="/Users/accusys/momentry_core_releases/v0.4.0-2026-04-30"
|
||||
|
||||
# 解壓縮 output
|
||||
tar -xzf output_v0.4.0.tar.gz
|
||||
|
||||
# 檢查內容
|
||||
ls output/
|
||||
```
|
||||
|
||||
### 3.3 驗證 Binary
|
||||
|
||||
```bash
|
||||
# 檢查 binary 資訊
|
||||
file /Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/binaries/momentry
|
||||
|
||||
# 測試啟動
|
||||
cd /Users/accusys/momentry_core_releases/v0.4.0-2026-04-30
|
||||
./binaries/momentry --version 2>/dev/null || echo "No version flag"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 對應的 Database Schema
|
||||
|
||||
### 4.1 此版本預期使用的 Schema
|
||||
|
||||
此 binary 建置時 (Apr 29 19:03) 對應的資料庫狀態:
|
||||
|
||||
| 資料庫 | Schema | 狀態 |
|
||||
|--------|--------|------|
|
||||
| PostgreSQL | `dev` | 部分使用 `video_uuid` (待修復) |
|
||||
| MongoDB | `momentry_dev` | collections: `chunks`, `cache` |
|
||||
| Qdrant | `momentry_dev_rule1` | 已存在 |
|
||||
| Redis | `momentry_dev:` | 已隔離 |
|
||||
|
||||
### 4.2 已知問題
|
||||
|
||||
| 問題 | 影響 | 狀態 |
|
||||
|------|------|------|
|
||||
| `dev.videos.probe_json` 類型為 TEXT (應為 JSONB) | `GET /api/v1/files` 返回 500 | ⚠️ 待修復 |
|
||||
| 10 張表仍使用 `video_uuid` | 術語不一致 | ⚠️ 待修復 |
|
||||
| Rust 代碼 `server.rs:3982` 使用 `video_uuid` | DELETE 語句失敗 | ⚠️ 待修復 |
|
||||
| Rust 代碼 `face_recognition.rs` 3 處使用 `video_uuid` | 臉部辨識失敗 | ⚠️ 待修復 |
|
||||
|
||||
---
|
||||
|
||||
## 5. Release 注意事項
|
||||
|
||||
### 5.1 Source Code 狀態
|
||||
|
||||
此版本 **沒有對應的 git commit**,因為 binary 是從有 uncommitted changes 的工作目錄建置的。
|
||||
|
||||
- Uncommitted changes: 592 筆
|
||||
- 包含: config 修改、docs 刪除、feature 開發
|
||||
|
||||
### 5.2 使用建議
|
||||
|
||||
1. **僅供緊急回滾使用**: 此封存主要用於災難復原
|
||||
2. **不應作為新版本基準**: 建議先解決已知問題再建立新版本
|
||||
3. **Output 資料**: 包含的 output json 可能與當前資料庫狀態不同步
|
||||
|
||||
---
|
||||
|
||||
## 6. 後續待辦
|
||||
|
||||
| 任務 | 優先級 | 狀態 |
|
||||
|------|--------|------|
|
||||
| Fix `dev.videos.probe_json` 類型 | High | ⬜ |
|
||||
| Rename `video_uuid` → `file_uuid` (10 tables) | High | ⬜ |
|
||||
| Update Rust code (4 locations) | High | ⬜ |
|
||||
| Configure output dir isolation | Medium | ⬜ |
|
||||
| Update Python scripts default DB URL | Medium | ⬜ |
|
||||
| Design API structure (v1.0 aligned) | Medium | ⬜ |
|
||||
| Implement missing P1 APIs | Medium | ⬜ |
|
||||
|
||||
---
|
||||
|
||||
## 7. 封存驗證
|
||||
|
||||
```bash
|
||||
# 檢查封存完整性
|
||||
tar -tzf /Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/binaries_v0.4.0.tar.gz | head -20
|
||||
tar -tzf /Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/output_v0.4.0.tar.gz | head -20
|
||||
|
||||
# 檢查目錄結構
|
||||
ls -lhR /Users/accusys/momentry_core_releases/v0.4.0-2026-04-30/
|
||||
```
|
||||
@@ -519,4 +519,4 @@ find docs/maintenance_records/_active -name "*.md" -type f
|
||||
3. 需要改進的地方:_________________________
|
||||
4. 其他建議:_______________________________
|
||||
|
||||
> **注意**:本培訓材料會根據團隊反饋和規範更新定期修訂。
|
||||
> **注意**:本培訓材料會根據團隊反饋和規範更新定期修訂。
|
||||
|
||||
@@ -281,4 +281,4 @@ cp docs/N8N_MCP_TEST_REPORT.md \
|
||||
| 遷移執行 | OpenCode | | | |
|
||||
| 最終批准 | Warren | | | |
|
||||
|
||||
> **注意**:本遷移計畫需經技術負責人審核後執行。
|
||||
> **注意**:本遷移計畫需經技術負責人審核後執行。
|
||||
|
||||
@@ -245,4 +245,4 @@ mv rca/_active/RCA_*.md rca/_completed/
|
||||
|
||||
---
|
||||
|
||||
**文件結束** - 最後更新: 2026-03-27
|
||||
**文件結束** - 最後更新: 2026-03-27
|
||||
|
||||
@@ -24,4 +24,4 @@
|
||||
---
|
||||
**歸檔日期**:2026-03-27
|
||||
**操作人員**:OpenCode
|
||||
**遷移依據**:DOCS_STANDARD_IMPROVEMENT_PROPOSAL_2026_03_27.md
|
||||
**遷移依據**:DOCS_STANDARD_IMPROVEMENT_PROPOSAL_2026_03_27.md
|
||||
|
||||
+1
-1
@@ -147,4 +147,4 @@ ai_query_hints:
|
||||
**創建人員**: OpenCode
|
||||
**批准日期**: 2026-03-27
|
||||
**批准人員**: Warren (技術負責人)
|
||||
**批准意見**: 同意簽核並開始執行
|
||||
**批准意見**: 同意簽核並開始執行
|
||||
|
||||
+1
-1
@@ -209,4 +209,4 @@ MCP 伺服器已成功配置並運作,可以透過 OpenCode 使用所有 43
|
||||
### 下一步
|
||||
- 使用 OpenCode 建立 Video RAG 整合工作流程
|
||||
- 設定自動化監控與告警
|
||||
- 建立工作流程模板庫
|
||||
- 建立工作流程模板庫
|
||||
|
||||
+9
-9
@@ -39,16 +39,16 @@ impact_level: "低" # 高/中/低
|
||||
affected_users: "測試團隊 (3人)"
|
||||
downtime: "0"
|
||||
tags:
|
||||
- "incident"
|
||||
- "test_system"
|
||||
- "documentation"
|
||||
- "integration_test"
|
||||
- "incident"
|
||||
- "test_system"
|
||||
- "documentation"
|
||||
- "integration_test"
|
||||
related_documents:
|
||||
- "RCA_TEST_SYSTEM_INTEGRATION_2026_03_27.md"
|
||||
- "RCA_TEST_SYSTEM_INTEGRATION_2026_03_27.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -375,4 +375,4 @@ def extract_incident_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
+486
@@ -0,0 +1,486 @@
|
||||
---
|
||||
document_type: "plan"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Birth UUID Implementation Plan - 有意义唯一标识方案"
|
||||
date: "2026-04-27"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "uuid"
|
||||
- "birth_registration"
|
||||
- "resource_allocation"
|
||||
- "privacy"
|
||||
- "mac_binding"
|
||||
ai_query_hints:
|
||||
- "查询 UUID 出生登记实现计划"
|
||||
- "Birth UUID 如何生成?"
|
||||
- "MAC地址在UUID中的作用是什么?"
|
||||
- "如何实现多层次权限管制?"
|
||||
- "文件迁移后UUID是否变化?"
|
||||
related_documents:
|
||||
- "src/core/storage/uuid.rs"
|
||||
- "src/core/ingestion.rs"
|
||||
- "docs_v1.0/OPERATIONS/DOCS_STANDARD.md"
|
||||
---
|
||||
|
||||
# Birth UUID Implementation Plan - 有意义唯一标识方案
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 规划制定人 | OpenCode |
|
||||
| 制定时间 | 2026-04-27 |
|
||||
| 规划类型 | 功能实现 |
|
||||
| 规划状态 | ✅ 规划完成,待实施 |
|
||||
| 优先级 | High |
|
||||
| MVP范围 | Phase 1 |
|
||||
|
||||
---
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-04-27 | 创建规划文档 | OpenCode | glm-5 |
|
||||
|
||||
---
|
||||
|
||||
## 规划背景
|
||||
|
||||
### 问题陈述
|
||||
|
||||
当前UUID生成机制存在以下问题:
|
||||
|
||||
| 问题 | 当前状态 | 影响 |
|
||||
|------|---------|------|
|
||||
| **同名文件冲突** | GOPR0001.mp4在摄影设备中很常见 | UUID重复风险 |
|
||||
| **文件迁移后变化** | SHA256(path+filename) | 无法追踪原始文件 |
|
||||
| **无注册来源记录** | 仅路径哈希,无其他元数据 | 无法追溯来源 |
|
||||
| **隐私信息暴露** | 路径包含用户名,明文可见 | 用户隐私风险 |
|
||||
|
||||
### 用户需求
|
||||
|
||||
| 需求 | 说明 |
|
||||
|------|------|
|
||||
| **唯一性** | 同名文件在不同设备/用户/时间注册,UUID必须不同 |
|
||||
| **不可变性** | 文件迁移后(热→温→温冷→冷→归档),UUID保持不变 |
|
||||
| **有意义** | UUID不仅仅是随机ID,应包含实际意义(可追溯) |
|
||||
| **隐私保护** | MAC/Username等敏感信息不应在UUID中暴露 |
|
||||
| **资源管制** | MAC用于App绑定保护,Username用于隐私管制 |
|
||||
|
||||
---
|
||||
|
||||
## 解决方案:Birth UUID(出生登记)
|
||||
|
||||
### 核心概念
|
||||
|
||||
类似"出生登记",记录文件首次注册的完整信息:
|
||||
- **出生时间**: 注册时间戳
|
||||
- **出生地点**: 注册机器(MAC地址)
|
||||
- **出生身份**: 注册用户(Username)
|
||||
- **出生姓名**: 文件名(Filename)
|
||||
|
||||
### 关键特性
|
||||
|
||||
| 特性 | 说明 |
|
||||
|------|------|
|
||||
| **唯一性保证** | MAC + Time + Username + Filename 四重组合 |
|
||||
| **不可变性** | UUID一旦生成,永久固定(即使文件迁移) |
|
||||
| **可追溯性** | DB内存储完整birth_registration(仅内部可见) |
|
||||
| **隐私保护** | 所有元素SHA256哈希(UUID不暴露明文) |
|
||||
| **资源管制** | MAC用于App绑定,Username用于隐私管制 |
|
||||
|
||||
---
|
||||
|
||||
## UUID规格定义
|
||||
|
||||
### 格式
|
||||
|
||||
**纯哈希格式**: `SHA256(mac_address|timestamp|username|filename)[0:32]`
|
||||
|
||||
```
|
||||
示例: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 (32字符纯哈希)
|
||||
```
|
||||
|
||||
### 输入元素
|
||||
|
||||
| 元素 | 来源 | 格式示例 | 作用 | 处理方式 |
|
||||
|------|------|---------|------|----------|
|
||||
| **MAC地址** | 注册机器网卡 | `a1:b2:c3:d4:e5:f6` | App绑定 + 资源分配 | 哈希内(不外露)+ DB明文 |
|
||||
| **注册时间** | 系统时间戳 | `2026-04-27T22:00:00+08:00` | 唯一性保证(时间维度) | 哈希内 + DB明文 |
|
||||
| **Username** | sftpgo user home | `demo` | 隐私管制(用户维度) | 哈希内 + DB明文 |
|
||||
| **Filename** | 文件名 | `GOPR0001.mp4` | 文件标识 | 哈希内 + DB明文 |
|
||||
|
||||
### 拼接格式
|
||||
|
||||
```
|
||||
key = "mac_address|timestamp|username|filename"
|
||||
|
||||
示例key = "a1:b2:c3:d4:e5:f6|2026-04-27T22:00:00+08:00|demo|GOPR0001.mp4"
|
||||
```
|
||||
|
||||
### 生成逻辑(Rust)
|
||||
|
||||
```rust
|
||||
pub fn compute_birth_uuid(
|
||||
mac_address: &str, // a1:b2:c3:d4:e5:f6
|
||||
timestamp: &str, // 2026-04-27T22:00:00+08:00
|
||||
username: &str, // demo
|
||||
filename: &str // GOPR0001.mp4
|
||||
) -> String {
|
||||
let key = format!("{}|{}|{}|{}",
|
||||
mac_address,
|
||||
timestamp,
|
||||
username,
|
||||
filename
|
||||
);
|
||||
|
||||
let hash = Sha256::digest(key.as_bytes());
|
||||
hex::encode(hash)[0..32].to_string()
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 唯一性保证分析
|
||||
|
||||
### 场景矩阵
|
||||
|
||||
| 场景 | MAC | Time | User | Filename | UUID是否唯一 |
|
||||
|------|-----|------|------|----------|-------------|
|
||||
| 不同设备同名文件 | 不同 | 同 | 同 | 同 | ✅ 唯一 |
|
||||
| 同设备不同时间注册 | 同 | 不同 | 同 | 同 | ✅ 唯一 |
|
||||
| 同设备不同用户同名文件 | 同 | 同 | 不同 | 同 | ✅ 唯一 |
|
||||
| 同设备同用户不同文件 | 同 | 同 | 同 | 不同 | ✅ 唯一 |
|
||||
| 完全相同的四元素 | 同 | 同 | 同 | 同 | ❌ 相同(预期) |
|
||||
|
||||
### 实际场景示例
|
||||
|
||||
#### 场景1:摄影设备同名文件(最常见)
|
||||
|
||||
```
|
||||
设备A (MAC: a1:b2:c3):
|
||||
GOPR0001.mp4 @ 2026-01-01T10:00:00 → UUID: abc123...
|
||||
|
||||
设备B (MAC: d4:e5:f6):
|
||||
GOPR0001.mp4 @ 2026-01-01T10:00:00 → UUID: def456...
|
||||
|
||||
结果:不同UUID ✅(MAC不同)
|
||||
```
|
||||
|
||||
#### 场景2:同一设备多次注册同名文件
|
||||
|
||||
```
|
||||
设备A (MAC: a1:b2:c3):
|
||||
GOPR0001.mp4 @ 2026-01-01T10:00:00 → UUID: abc123...
|
||||
GOPR0001.mp4 @ 2026-01-01T14:00:00 → UUID: xyz789...
|
||||
|
||||
结果:不同UUID ✅(Time不同)
|
||||
```
|
||||
|
||||
#### 场景3:同一用户不同存储位置
|
||||
|
||||
```
|
||||
MAC: a1:b2:c3, User: demo, Time: 2026-01-01T10:00:00
|
||||
|
||||
/Volumes/Hot/demo/GOPR0001.mp4 → UUID: abc123... (注册)
|
||||
/Volumes/Warm/demo/GOPR0001.mp4 → UUID: abc123... (迁移后,UUID不变)
|
||||
|
||||
原因:UUID基于原始注册信息,不随当前路径变化
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 存储迁移追踪
|
||||
|
||||
### 存储层级定义
|
||||
|
||||
| 层级 | 路径示例 | 说明 |
|
||||
|------|---------|------|
|
||||
| **Hot** | `/Volumes/Hot/demo/` | 热存储(快速访问) |
|
||||
| **Warm** | `/Volumes/Warm/demo/` | 温存储(中等访问) |
|
||||
| **Warm-Cold** | `/Volumes/WarmCold/demo/` | 温冷存储 |
|
||||
| **Cold** | `/Volumes/Cold/demo/` | 冷存储(归档准备) |
|
||||
| **Archive** | `cloud://archive/demo/` | 云归档 |
|
||||
|
||||
### 迁移时间线
|
||||
|
||||
```
|
||||
T0: 注册(Hot存储)
|
||||
UUID: abc123...(基于原始注册生成)
|
||||
birth_registration: {
|
||||
"original_path": "/Volumes/Hot/demo",
|
||||
"original_tier": "Hot"
|
||||
}
|
||||
current_path: /Volumes/Hot/demo/GOPR0001.mp4
|
||||
|
||||
T1: 迁移(Warm存储)
|
||||
UUID: abc123...(不变!)
|
||||
birth_registration: 不变(记录原始)
|
||||
current_path: /Volumes/Warm/demo/GOPR0001.mp4
|
||||
migration_history: 新增迁移记录
|
||||
|
||||
T2: 迁移(Cold存储)
|
||||
UUID: abc123...(不变!)
|
||||
current_path: /Volumes/Cold/demo/GOPR0001.mp4
|
||||
|
||||
T3: 归档
|
||||
UUID: abc123...(不变!)
|
||||
current_path: cloud://archive/demo/GOPR0001.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据库设计
|
||||
|
||||
### birth_registration JSONB字段
|
||||
|
||||
```sql
|
||||
ALTER TABLE videos ADD COLUMN birth_registration JSONB;
|
||||
|
||||
-- 示例数据结构
|
||||
{
|
||||
"uuid": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
|
||||
"registration_source": {
|
||||
"mac_address": "a1:b2:c3:d4:e5:f6",
|
||||
"username": "demo",
|
||||
"timestamp": "2026-04-27T22:00:00+08:00",
|
||||
"original_path": "./demo",
|
||||
"original_filename": "GOPR0001.mp4"
|
||||
},
|
||||
"permission_control": {
|
||||
"mac_binding": {
|
||||
"license_key": "demo_license",
|
||||
"is_active": true
|
||||
},
|
||||
"user_privacy": {
|
||||
"privacy_level": "private",
|
||||
"data_isolation": true
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### mac_allocations表(简化版)
|
||||
|
||||
```sql
|
||||
CREATE TABLE mac_allocations (
|
||||
mac_address VARCHAR(17) PRIMARY KEY,
|
||||
machine_name VARCHAR(100),
|
||||
license_key VARCHAR(64),
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- 插入当前机器
|
||||
INSERT INTO mac_allocations VALUES (
|
||||
'<actual_mac>',
|
||||
'MacBook-Pro',
|
||||
'demo_license',
|
||||
true
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 多层次权限管制架构
|
||||
|
||||
### 当前MVP实现(Phase 1)
|
||||
|
||||
| 层级 | 用途 | 实现状态 |
|
||||
|------|------|---------|
|
||||
| **MAC层** | App绑定保护 | ✅ Phase 1 实现 |
|
||||
| **User层** | 隐私管制(数据隔离) | ⚠️ 单user时可跳过 |
|
||||
|
||||
### 未来扩展(Phase 2 - 仅文档)
|
||||
|
||||
| 层级 | 用途 | 实现状态 |
|
||||
|------|------|---------|
|
||||
| **Group层** | 访问权限控制 | 📝 仅文档规划 |
|
||||
| **Service层** | 处理器权限分配 | 📝 仅文档规划 |
|
||||
| **Storage层** | 存储位置分配 | 📝 仅文档规划 |
|
||||
|
||||
### 权限管制维度说明
|
||||
|
||||
| 维度 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| **MAC** | App绑定保护(类似License) | 不同机器不同权限 |
|
||||
| **User** | 隐私管制(数据隔离) | 用户A无法访问用户B数据 |
|
||||
| **Group** | 访问权限控制(谁能access) | admin组可访问所有 |
|
||||
|
||||
---
|
||||
|
||||
## 实施计划
|
||||
|
||||
### Phase 1: MVP实现
|
||||
|
||||
| 任务 | 优先级 | 状态 | 说明 |
|
||||
|------|--------|------|------|
|
||||
| 更新 uuid.rs | High | Pending | 新增 compute_birth_uuid() |
|
||||
| 添加 birth_registration | High | Pending | videos表JSONB字段 |
|
||||
| 创建 mac_allocations 表 | High | Pending | 简化版(MAC+license) |
|
||||
| 更新 ingestion.rs | High | Pending | 获取MAC并调用新函数 |
|
||||
| 添加 mac_address crate | High | Pending | Cargo.toml依赖 |
|
||||
| 单元测试 | High | Pending | 验证UUID生成逻辑 |
|
||||
|
||||
### Phase 2: 扩展功能(仅文档)
|
||||
|
||||
| 功能 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| user_privacy表 | 📝 仅文档 | 多用户隐私管制 |
|
||||
| group_access表 | 📝 仅文档 | 组访问控制 |
|
||||
| migration_history | 📝 仅文档 | 迁移历史追踪 |
|
||||
| 多层次权限API | 📝 仅文档 | 完整权限系统 |
|
||||
|
||||
---
|
||||
|
||||
## 验证计划
|
||||
|
||||
### 单元测试
|
||||
|
||||
```rust
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_birth_uuid_generation() {
|
||||
let uuid = compute_birth_uuid(
|
||||
"a1:b2:c3:d4:e5:f6",
|
||||
"2026-04-27T22:00:00+08:00",
|
||||
"demo",
|
||||
"video.mp4"
|
||||
);
|
||||
assert_eq!(uuid.len(), 32);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_different_mac() {
|
||||
let uuid1 = compute_birth_uuid(
|
||||
"a1:b2:c3", "2026-01-01", "demo", "video.mp4"
|
||||
);
|
||||
let uuid2 = compute_birth_uuid(
|
||||
"d4:e5:f6", "2026-01-01", "demo", "video.mp4"
|
||||
);
|
||||
assert_ne!(uuid1, uuid2); // MAC不同
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_different_time() {
|
||||
let uuid1 = compute_birth_uuid(
|
||||
"a1:b2:c3", "2026-01-01T10:00:00", "demo", "video.mp4"
|
||||
);
|
||||
let uuid2 = compute_birth_uuid(
|
||||
"a1:b2:c3", "2026-01-01T14:00:00", "demo", "video.mp4"
|
||||
);
|
||||
assert_ne!(uuid1, uuid2); // Time不同
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_different_user() {
|
||||
let uuid1 = compute_birth_uuid(
|
||||
"a1:b2:c3", "2026-01-01", "demo", "video.mp4"
|
||||
);
|
||||
let uuid2 = compute_birth_uuid(
|
||||
"a1:b2:c3", "2026-01-01", "warren", "video.mp4"
|
||||
);
|
||||
assert_ne!(uuid1, uuid2); // User不同
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 向后兼容
|
||||
|
||||
### UUID类型识别
|
||||
|
||||
| UUID类型 | 长度 | birth_registration | 生成方式 |
|
||||
|---------|------|-------------------|---------|
|
||||
| **旧UUID** | 16字符 | 无字段 | SHA256[path+filename](0:16) |
|
||||
| **新UUID** | 32字符 | 有字段 | SHA256[mac+time+user+filename](0:32) |
|
||||
|
||||
### 兼容策略
|
||||
|
||||
```rust
|
||||
pub fn is_birth_uuid(uuid: &str) -> bool {
|
||||
uuid.len() == 32 && !uuid.contains('_') // 纯哈希32字符
|
||||
}
|
||||
|
||||
// 处理时自动识别
|
||||
pub fn get_uuid_type(uuid: &str) -> UuidType {
|
||||
if is_birth_uuid(uuid) {
|
||||
UuidType::Birth
|
||||
} else {
|
||||
UuidType::Legacy
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API影响
|
||||
|
||||
### 外部API(不变)
|
||||
|
||||
| API | 影响 |
|
||||
|-----|------|
|
||||
| `/api/v1/videos/:uuid` | ✅ UUID参数传递不变 |
|
||||
| `/api/v1/videos?uuid=xxx` | ✅ 查询参数不变 |
|
||||
| Python scripts `--uuid` | ✅ 参数传递不变 |
|
||||
|
||||
### 内部API(新增 - 可选)
|
||||
|
||||
```rust
|
||||
// 管理员查询birth_registration(仅内部)
|
||||
GET /api/admin/videos/:uuid/birth-info
|
||||
|
||||
Response:
|
||||
{
|
||||
"uuid": "a1b2c3d4...",
|
||||
"registration_source": {
|
||||
"mac_address": "a1:b2:c3...",
|
||||
"username": "demo",
|
||||
"timestamp": "2026-04-27...",
|
||||
"original_filename": "GOPR0001.mp4"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 隐私保护级别
|
||||
|
||||
| 保护项 | 保护方式 | 保护级别 | 外部可见 |
|
||||
|---------|----------|----------|----------|
|
||||
| **UUID** | SHA256哈希 | ✅ 最高 | ❌ 不可解码 |
|
||||
| **MAC地址** | 哈希内 + DB明文 | ✅ 高 | ❌ 仅内部 |
|
||||
| **Username** | 哈希内 + DB明文 | ✅ 高 | ❌ 仅内部 |
|
||||
| **注册时间** | 哈希内 + DB明文 | ✅ 高 | ❌ 仅内部 |
|
||||
| **外部API** | 无暴露API | ✅ 最高 | ❌ 外部无法查询 |
|
||||
|
||||
---
|
||||
|
||||
## 执行状态
|
||||
|
||||
| 状态 | 说明 |
|
||||
|------|------|
|
||||
| 规划完成 | ✅ 规划文档已存档 |
|
||||
| 待实施 | ⏸ Phase 1 待执行 |
|
||||
| Phase 2 | 📝 仅文档规划 |
|
||||
|
||||
---
|
||||
|
||||
## 参考文档
|
||||
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| `src/core/storage/uuid.rs` | 当前UUID生成逻辑 |
|
||||
| `src/core/ingestion.rs` | 文件注册流程 |
|
||||
| `docs_v1.0/OPERATIONS/DOCS_STANDARD.md` | 文档规范 |
|
||||
| `AGENTS.md` | 项目总览 |
|
||||
|
||||
---
|
||||
|
||||
**注意**: Phase 2 功能(group_access、多层次权限API等)仅在本文档中规划,暂不实施。待多用户场景出现后再实现。
|
||||
+17
-17
@@ -38,27 +38,27 @@ execution_window: "2026-03-29 02:00-04:00"
|
||||
execution_time_approved: "2026-03-28"
|
||||
estimated_duration: "60"
|
||||
affected_systems:
|
||||
- "PostgreSQL"
|
||||
- "Redis"
|
||||
- "Qdrant"
|
||||
- "MongoDB"
|
||||
- "FileSystem"
|
||||
- "PostgreSQL"
|
||||
- "Redis"
|
||||
- "Qdrant"
|
||||
- "MongoDB"
|
||||
- "FileSystem"
|
||||
retained_records:
|
||||
# 僅保留資料庫紀錄,不涉及 SFTPGo 實體檔案
|
||||
- "ExaSAN PCIe series - Director Ou Yu-Zhi Shares His Experience.mp4 (資料庫記錄)"
|
||||
- "Old_Time_Movie_Show_-_Charade_1963.HD.mov (資料庫記錄)"
|
||||
# 僅保留資料庫紀錄,不涉及 SFTPGo 實體檔案
|
||||
- "ExaSAN PCIe series - Director Ou Yu-Zhi Shares His Experience.mp4 (資料庫記錄)"
|
||||
- "Old_Time_Movie_Show_-_Charade_1963.HD.mov (資料庫記錄)"
|
||||
excluded_systems:
|
||||
- "SFTPGo 檔案儲存服務"
|
||||
- "其他 SFTPGo 用戶檔案"
|
||||
- "SFTPGo 檔案儲存服務"
|
||||
- "其他 SFTPGo 用戶檔案"
|
||||
tags:
|
||||
- "maintenance"
|
||||
- "data_cleanup"
|
||||
- "momentry_core"
|
||||
- "maintenance"
|
||||
- "data_cleanup"
|
||||
- "momentry_core"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P2 級別的維護計畫?"
|
||||
- "如何找到與 Momentry Core 數據清理相關的維護計畫?"
|
||||
- "如何更新維護計畫狀態?"
|
||||
- "如何查詢正在執行的維護計畫?"
|
||||
- "如何查詢所有 P2 級別的維護計畫?"
|
||||
- "如何找到與 Momentry Core 數據清理相關的維護計畫?"
|
||||
- "如何更新維護計畫狀態?"
|
||||
- "如何查詢正在執行的維護計畫?"
|
||||
---
|
||||
|
||||
<!--
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ tags:
|
||||
| ID | UUID | Filename | Status | 問題 |
|
||||
|----|------|----------|--------|------|
|
||||
| 18 | 9760d0820f0cf9a7 | ExaSAN PCIe series... | **failed** | 處理失敗 |
|
||||
| 17 | 384b0ff44aaaa1f1 | Old_Time_Movie_Show... | **pending** | 從未處理 |
|
||||
| 17 | 384b0ff44aaaa1f14cb2cd63b3fea966 | Old_Time_Movie_Show... | **pending** | 從未處理 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
+9
-9
@@ -38,16 +38,16 @@ root_cause: "新文檔標準系統集成測試過程中發現模板使用流程
|
||||
resolution: "創建測試文件驗證模板功能,更新相關文檔"
|
||||
prevention: "建立標準測試流程,確保新模板上線前經過完整驗證"
|
||||
tags:
|
||||
- "rca"
|
||||
- "test_system"
|
||||
- "documentation"
|
||||
- "integration_test"
|
||||
- "rca"
|
||||
- "test_system"
|
||||
- "documentation"
|
||||
- "integration_test"
|
||||
related_documents:
|
||||
- "INCIDENT_TEST_SYSTEM_INTEGRATION_2026_03_27.md"
|
||||
- "INCIDENT_TEST_SYSTEM_INTEGRATION_2026_03_27.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -456,4 +456,4 @@ def extract_rca_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
+1
-1
@@ -137,4 +137,4 @@ curl -H "X-N8N-API-KEY: <API_KEY>" http://localhost:5678/api/v1/executions
|
||||
- Authentication: Header `X-N8N-API-KEY: <token>`
|
||||
- Available endpoints: workflows, executions, credentials, users, etc.
|
||||
|
||||
See full API reference: https://docs.n8n.io/api/
|
||||
See full API reference: https://docs.n8n.io/api/
|
||||
|
||||
+2
-2
@@ -267,7 +267,7 @@ sudo launchctl restart com.momentry.caddy
|
||||
| **交易資料** | ✅ 未受影響 | 網站無交易功能,無交易數據 |
|
||||
| **配置資料** | ✅ 未受影響 | WordPress 配置完整 |
|
||||
|
||||
#### 資料庫驗證結果:
|
||||
#### 資料庫驗證結果
|
||||
1. **MariaDB 服務狀態**:持續運行,無重啟記錄
|
||||
2. **錯誤日誌檢查**:`/Users/accusys/momentry/var/mariadb/*.err` 無異常錯誤
|
||||
3. **資料庫完整性**:WordPress 核心表結構完整
|
||||
@@ -398,4 +398,4 @@ sudo launchctl list | grep momentry
|
||||
|
||||
---
|
||||
|
||||
**文件結束** - 事件已解決,預防措施已記錄
|
||||
**文件結束** - 事件已解決,預防措施已記錄
|
||||
|
||||
@@ -0,0 +1,480 @@
|
||||
---
|
||||
document_type: "experiment_report"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "ASR Processor Engine & Device Comparison Report"
|
||||
date: "2026-04-27"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "asr"
|
||||
- "whisper"
|
||||
- "mps"
|
||||
- "benchmark"
|
||||
- "experiment"
|
||||
ai_query_hints:
|
||||
- "查询 ASR 处理器对比实验结果"
|
||||
- "faster-whisper vs OpenAI whisper 性能对比"
|
||||
- "ASR MPS 加速效果评估"
|
||||
- "ASR engine selection recommendation"
|
||||
related_documents:
|
||||
- "scripts/asr_processor.py"
|
||||
- "scripts/asr_processor_contract_v2.py"
|
||||
- "scripts/asr_benchmark_runner.py"
|
||||
- "output/benchmark/asr_benchmark_results.json"
|
||||
- "output/benchmark/asr_benchmark_report.md"
|
||||
---
|
||||
|
||||
# ASR Processor Engine & Device Comparison Report
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| 建立者 | Warren (OpenCode执行) |
|
||||
| 建立时间 | 2026-04-27 |
|
||||
| 文件版本 | V1.0 |
|
||||
| 实验类型 | Processor性能对比实验 |
|
||||
|
||||
---
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|
||||
|------|------|------|--------|-----------|
|
||||
| V1.0 | 2026-04-27 | 创建实验报告框架 | OpenCode | glm-5 |
|
||||
|
||||
---
|
||||
|
||||
## 实验目的
|
||||
|
||||
本实验旨在比较以下ASR处理方案的性能表现,为生产环境选择最优方案:
|
||||
|
||||
1. **faster-whisper vs OpenAI whisper**: 引擎对比
|
||||
2. **CPU vs MPS**: 设备对比(Apple Silicon GPU加速)
|
||||
3. **small vs medium**: 模型大小对比
|
||||
|
||||
实验结果将作为以下决策依据:
|
||||
- 生产环境ASR处理器选型
|
||||
- MPS支持是否值得开发
|
||||
- 模型大小权衡(准确率 vs 性能)
|
||||
|
||||
---
|
||||
|
||||
## 实验背景
|
||||
|
||||
### 当前生产方案
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|------|
|
||||
| **脚本** | `asr_processor.py` |
|
||||
| **引擎** | faster-whisper (CTranslate2) |
|
||||
| **模型** | small (int8 quantization) |
|
||||
| **设备** | CPU only |
|
||||
| **限制** | faster-whisper **不支持 MPS** |
|
||||
|
||||
### 可选方案
|
||||
|
||||
| 方案 | 引擎 | MPS支持 | 脚本 |
|
||||
|------|------|---------|------|
|
||||
| **faster-whisper** | CTranslate2 | ❌ 不支持 | `asr_processor.py` |
|
||||
| **OpenAI whisper** | PyTorch | ✅ 支持 | `asr_processor_contract_v2.py` |
|
||||
|
||||
### 为什么选择 small 模型
|
||||
|
||||
根据 `asr_processor.py` 文档说明:
|
||||
|
||||
```
|
||||
Model: small (int8 quantization, CPU)
|
||||
Reason: small 模型在準確率和速度間取得最佳平衡
|
||||
經實驗驗證,最少要使用 small 才可以較好的處理多語種及台灣腔國語
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 测试数据
|
||||
|
||||
### 测试视频信息
|
||||
|
||||
| 视频 | 时长 | FPS | 总帧数 | 语言 | 特点 |
|
||||
|------|------|-----|--------|------|------|
|
||||
| **Charade 1963** | 114.6 min | 59.94 fps | 412343 frames | 英语 | 多语种场景、电影台词 |
|
||||
| **ExaSAN PCIe** | 2.66 min | 22 fps | 3512 frames | 英语 | 技术术语、专业口音 |
|
||||
|
||||
### 为什么选择这两个视频
|
||||
|
||||
1. **Charade 1963**:
|
||||
- 长视频测试(114分钟),评估长时间处理性能
|
||||
- 电影场景,测试对话识别质量
|
||||
- 多语种场景(英语+法语+德语)
|
||||
|
||||
2. **ExaSAN PCIe**:
|
||||
- 短视频测试(2分钟),快速验证方案差异
|
||||
- 技术术语,测试专业词汇识别
|
||||
- 可重复多次测试
|
||||
|
||||
---
|
||||
|
||||
## 实验方案
|
||||
|
||||
### 方案定义
|
||||
|
||||
| 方案ID | 名称 | 引擎 | 模型 | 设备 | 脚本 |
|
||||
|--------|------|------|------|------|------|
|
||||
| **A** | faster-whisper small CPU | faster-whisper | small (int8) | CPU | `asr_processor.py` |
|
||||
| **B** | OpenAI whisper small CPU | whisper | small | CPU | `asr_processor_contract_v2.py` |
|
||||
| **C** | OpenAI whisper small MPS | whisper | small | **MPS** | `asr_processor_contract_v2.py` |
|
||||
| **D** | OpenAI whisper medium CPU | whisper | medium | CPU | `asr_processor_contract_v2.py` |
|
||||
| **E** | OpenAI whisper medium MPS | whisper | medium | **MPS** | `asr_processor_contract_v2.py` |
|
||||
|
||||
### 测试矩阵
|
||||
|
||||
总计 **10 次测试**(2视频 × 5方案):
|
||||
|
||||
| 视频 | 方案 | 预计耗时 |
|
||||
|------|------|----------|
|
||||
| Charade 1963 | A (faster-whisper CPU) | ~10 min |
|
||||
| Charade 1963 | B (whisper small CPU) | ~15 min |
|
||||
| Charade 1963 | C (whisper small MPS) | ~5 min (预期加速) |
|
||||
| Charade 1963 | D (whisper medium CPU) | ~20 min |
|
||||
| Charade 1963 | E (whisper medium MPS) | ~8 min (预期加速) |
|
||||
| ExaSAN PCIe | A (faster-whisper CPU) | ~1 min |
|
||||
| ExaSAN PCIe | B (whisper small CPU) | ~2 min |
|
||||
| ExaSAN PCIe | C (whisper small MPS) | ~0.5 min |
|
||||
| ExaSAN PCIe | D (whisper medium CPU) | ~3 min |
|
||||
| ExaSAN PCIe | E (whisper medium MPS) | ~1 min |
|
||||
|
||||
**预计总耗时**: ~70 分钟
|
||||
|
||||
---
|
||||
|
||||
## 自动化测试
|
||||
|
||||
### 测试脚本
|
||||
|
||||
自动化测试使用 `scripts/asr_benchmark_runner.py`:
|
||||
|
||||
```bash
|
||||
# 运行所有测试
|
||||
python3 scripts/asr_benchmark_runner.py \
|
||||
--output-dir output/benchmark \
|
||||
--schemes A,B,C,D,E \
|
||||
--videos charade,exasan \
|
||||
--verbose
|
||||
|
||||
# 运行单个测试
|
||||
python3 scripts/asr_benchmark_runner.py \
|
||||
--single A,charade \
|
||||
--verbose
|
||||
|
||||
# 跳过已完成的测试
|
||||
python3 scripts/asr_benchmark_runner.py \
|
||||
--schemes A,B,C,D,E \
|
||||
--videos charade,exasan \
|
||||
--skip-existing \
|
||||
--verbose
|
||||
```
|
||||
|
||||
### 测试脚本功能
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| ✅ **FPS获取** | 使用ffprobe获取视频帧率 |
|
||||
| ✅ **Real-time记录** | ISO 8601格式,精度到微秒 |
|
||||
| ✅ **Frame计算** | seconds → frame number |
|
||||
| ✅ **独立文件输出** | 每个方案产生独立JSON |
|
||||
| ✅ **内存监控** | psutil实时监控 |
|
||||
| ✅ **Log记录** | 每个测试的执行日志 |
|
||||
|
||||
### 输出文件结构
|
||||
|
||||
```
|
||||
output/benchmark/
|
||||
├── asr_benchmark_metadata.json
|
||||
├── asr_benchmark_results.json
|
||||
├── asr_benchmark_report.md
|
||||
├── charade_1963/
|
||||
│ ├── video_metadata.json
|
||||
│ ├── scheme_A_faster_whisper_small_cpu.json
|
||||
│ ├── scheme_B_openai_whisper_small_cpu.json
|
||||
│ ├── scheme_C_openai_whisper_small_mps.json
|
||||
│ ├── scheme_D_openai_whisper_medium_cpu.json
|
||||
│ ├── scheme_E_openai_whisper_medium_mps.json
|
||||
│ ├── quality_evaluation.json
|
||||
│ └── logs/
|
||||
│ ├── scheme_A.log
|
||||
│ ├── scheme_B.log
|
||||
│ └── ...
|
||||
├── exasan_pcie/
|
||||
│ ├── video_metadata.json
|
||||
│ ├── scheme_A_faster_whisper_small_cpu.json
|
||||
│ └── ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 时间记录规范
|
||||
|
||||
### Real-time 时间记录
|
||||
|
||||
使用 ISO 8601 格式记录系统时间:
|
||||
|
||||
```json
|
||||
{
|
||||
"real_time": {
|
||||
"test_start": "2026-04-27T10:30:00.123456+08:00",
|
||||
"test_end": "2026-04-27T10:40:05.678901+08:00",
|
||||
"wall_clock_duration_seconds": 605.555445
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Video-time Frame记录
|
||||
|
||||
所有 segments 使用 `start_frame` 和 `end_frame` 作为精确单位:
|
||||
|
||||
```json
|
||||
{
|
||||
"segments": [
|
||||
{
|
||||
"start": 0.0,
|
||||
"end": 19.04,
|
||||
"start_frame": 0,
|
||||
"end_frame": 1141,
|
||||
"duration_seconds": 19.04,
|
||||
"duration_frames": 1141,
|
||||
"text": "Hello and welcome..."
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Frame计算公式**: `frame = seconds × fps`
|
||||
**示例**: 19.04秒 @ 59.94fps = 19.04 × 59.94 = 1141帧
|
||||
|
||||
---
|
||||
|
||||
## 评估指标
|
||||
|
||||
### 量化指标
|
||||
|
||||
| 指标 | 单位 | 说明 |
|
||||
|------|------|------|
|
||||
| **processing_time_seconds** | 秒 | 总处理时间 |
|
||||
| **processing_speed_ratio** | 倍率 | 视频时长/处理时间 |
|
||||
| **peak_memory_mb** | MB | 内存峰值 |
|
||||
| **avg_memory_mb** | MB | 平均内存使用 |
|
||||
| **segments_count** | 条 | 输出segments数量 |
|
||||
| **avg_segment_length_seconds** | 秒 | 平均segment长度 |
|
||||
| **avg_segment_frames** | 帧 | 平均segment帧数 |
|
||||
| **total_transcribed_frames** | 帧 | 总转录帧数 |
|
||||
| **language_detected** | - | 检测到的语言 |
|
||||
| **language_probability** | 0-1 | 语言检测置信度 |
|
||||
|
||||
### 输出质量评分(主观)
|
||||
|
||||
| 指标 | 评分范围 | 说明 |
|
||||
|------|----------|------|
|
||||
| **segmentation_quality** | 1-5分 | 断句质量(segment断点是否合理) |
|
||||
| **recognition_accuracy** | 1-5分 | 识别准确率(文字识别正确程度) |
|
||||
| **technical_terms** | 1-5分 | 技术术语识别(专业词汇准确度) |
|
||||
| **multilingual_handling** | 1-5分 | 多语种处理(语言切换处理质量) |
|
||||
|
||||
评分标准:
|
||||
- 5分: 优秀(无明显错误)
|
||||
- 4分: 良好(少量错误,不影响理解)
|
||||
- 3分: 可接受(有错误,但可理解)
|
||||
- 2分: 较差(明显错误,影响理解)
|
||||
- 1分: 很差(大量错误,无法理解)
|
||||
|
||||
---
|
||||
|
||||
## 结果记录
|
||||
|
||||
### 量化指标对比表
|
||||
|
||||
**Charade 1963**:
|
||||
|
||||
| 方案 | 处理时间(s) | 处理速度 | 内存峰值(MB) | Segments数 | Avg Segment(秒) | Avg Segment(帧) |
|
||||
|------|-------------|----------|--------------|------------|-----------------|-----------------|
|
||||
| A | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 |
|
||||
| B | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 |
|
||||
| C | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 |
|
||||
| D | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 |
|
||||
| E | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 | 待测试 |
|
||||
|
||||
**ExaSAN PCIe**:
|
||||
|
||||
| 方案 | 处理时间(s) | 处理速度 | 内存峰值(MB) | Segments数 | Avg Segment(秒) | Avg Segment(帧) |
|
||||
|------|-------------|----------|--------------|------------|-----------------|-----------------|
|
||||
| A | 27.2 | 5.88x | 1335.7 | 77 | 1.74 | 38.2 |
|
||||
| B | 162.9 | 0.98x | 5096.4 | 74 | 1.92 | 42.2 |
|
||||
| C | ❌ 失败 | - | - | - | MPS不支持 | - |
|
||||
| D | 162.1 | 0.98x | 5099.9 | 74 | 1.92 | 42.2 |
|
||||
| E | ❌ 失败 | - | - | - | MPS不支持 | - |
|
||||
|
||||
### 输出质量评估表
|
||||
|
||||
**Charade 1963**:
|
||||
|
||||
| 方案 | 断句质量 | 识别准确率 | 技术术语 | 多语种处理 |
|
||||
|------|---------|-----------|---------|-----------|
|
||||
| A | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| B | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| C | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| D | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| E | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
|
||||
**ExaSAN PCIe**:
|
||||
|
||||
| 方案 | 断句质量 | 识别准确率 | 技术术语 | 多语种处理 |
|
||||
|------|---------|-----------|---------|-----------|
|
||||
| A | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| B | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| C | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| D | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
| E | 待评分 | 待评分 | 待评分 | 待评分 |
|
||||
|
||||
---
|
||||
|
||||
## 结果分析
|
||||
|
||||
### 处理速度分析
|
||||
|
||||
**ExaSAN PCIe测试结果**:
|
||||
|
||||
- **faster-whisper vs OpenAI whisper**: faster-whisper **快6倍**(27秒 vs 163秒)
|
||||
- **small vs medium模型**: 性能几乎相同(163秒 vs 162秒),差异<1%
|
||||
- **MPS支持**: ❌ OpenAI whisper MPS不支持(PyTorch SparseMPS backend兼容性问题)
|
||||
- **处理速度**: faster-whisper达到 **5.88x** 实时速度,OpenAI whisper仅 **0.98x**
|
||||
|
||||
**关键发现**:
|
||||
- faster-whisper使用CTranslate2 backend,在CPU上性能远超OpenAI whisper(PyTorch)
|
||||
- MPS加速无法实现,当前PyTorch版本不支持whisper所需操作
|
||||
|
||||
### 内存使用分析
|
||||
|
||||
**ExaSAN PCIe测试结果**:
|
||||
|
||||
- **faster-whisper**: 内存峰值 **1335.7MB**
|
||||
- **OpenAI whisper small**: 内存峰值 **5096.4MB**
|
||||
- **OpenAI whisper medium**: 内存峰值 **5099.9MB**
|
||||
- **内存效率**: faster-whisper节省 **3.8倍** 内存
|
||||
|
||||
**关键发现**:
|
||||
- OpenAI whisper内存占用高(~5GB),faster-whisper仅需~1.3GB
|
||||
- small和medium模型内存占用几乎相同(差异<1%)
|
||||
- 内存占用差异主要来自引擎(CTranslate2 vs PyTorch)
|
||||
|
||||
### 输出质量分析
|
||||
|
||||
待手动评分完成后填写:
|
||||
|
||||
- 断句质量对比分析
|
||||
- 识别准确率对比分析
|
||||
- 技术术语识别能力评估
|
||||
|
||||
---
|
||||
|
||||
## 结论与建议
|
||||
|
||||
### 技术选型建议
|
||||
|
||||
基于ExaSAN PCIe测试结果:
|
||||
|
||||
| 场景 | 推荐方案 | 原因 |
|
||||
|------|----------|------|
|
||||
| **生产环境(性价比优先)** | **方案A: faster-whisper small CPU** | 6倍性能优势,节省3.8倍内存 |
|
||||
| **生产环境(准确率优先)** | 方案A: faster-whisper small CPU | small模型已足够处理多语种和台湾腔国语 |
|
||||
| **开发环境(快速迭代)** | 方案A: faster-whisper small CPU | 5.88x实时速度,快速验证 |
|
||||
| **长视频处理** | 方案A: faster-whisper small CPU | 性能稳定,内存可控 |
|
||||
|
||||
**推荐理由**:
|
||||
1. **性能**: faster-whisper处理速度5.88x,远超OpenAI whisper的0.98x
|
||||
2. **内存**: 内存峰值1335MB,远低于OpenAI whisper的5096MB
|
||||
3. **稳定性**: CTranslate2 backend更稳定,无PyTorch兼容性问题
|
||||
4. **性价比**: 已验证small模型可处理多语种和台湾腔国语
|
||||
|
||||
### MPS支持决策
|
||||
|
||||
**测试结果**: OpenAI whisper MPS **不支持**
|
||||
|
||||
**原因**:
|
||||
- PyTorch SparseMPS backend不支持 `_sparse_coo_tensor_with_dims_and_tensors` 操作
|
||||
- OpenAI whisper模型加载需要此操作
|
||||
- 当前PyTorch版本存在兼容性问题
|
||||
|
||||
**决策**: **不建议开发MPS版本**
|
||||
|
||||
**理由**:
|
||||
1. **技术限制**: MPS backend兼容性问题,需要等待PyTorch修复
|
||||
2. **性能已足够**: faster-whisper CPU已达5.88x实时速度
|
||||
3. **开发成本**: 切换到OpenAI whisper会损失6倍性能优势
|
||||
4. **稳定性风险**: PyTorch MPS支持仍在完善中
|
||||
|
||||
### 模型大小决策
|
||||
|
||||
**测试结果**: small vs medium **性能几乎相同**
|
||||
|
||||
**数据对比**:
|
||||
- **small模型**: 163秒,5096MB,74 segments
|
||||
- **medium模型**: 162秒,5099MB,74 segments
|
||||
- **差异**: <1%性能差异,<1%内存差异
|
||||
|
||||
**决策**: **保持small模型**
|
||||
|
||||
**理由**:
|
||||
1. **性能相同**: medium模型无性能优势
|
||||
2. **内存相同**: medium模型无内存节省
|
||||
3. **模型大小**: medium模型文件更大(需下载更大模型)
|
||||
4. **已验证**: small模型可处理多语种和台湾腔国语
|
||||
|
||||
**如果medium模型准确率显著提升**:
|
||||
- 建议升级到medium
|
||||
- 需要权衡性能损失
|
||||
|
||||
**如果small模型已足够**:
|
||||
- 保持small模型
|
||||
- 性价比更高
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 测试脚本代码
|
||||
|
||||
见文件:`scripts/asr_benchmark_runner.py`
|
||||
|
||||
主要功能:
|
||||
- `get_video_metadata()`: 使用ffprobe获取FPS和总帧数
|
||||
- `time_to_frame()`: 时间转换为帧号
|
||||
- `process_asr_output()`: 添加frame信息到segments
|
||||
- `run_single_test()`: 执行单次测试并记录时间/内存
|
||||
- `generate_results_json()`: 生成汇总JSON
|
||||
- `generate_markdown_report()`: 生成Markdown报告
|
||||
|
||||
### B. 完整测试日志
|
||||
|
||||
见目录:`output/benchmark/charade_1963/logs/` 和 `output/benchmark/exasan_pcie/logs/`
|
||||
|
||||
### C. 样例输出对比
|
||||
|
||||
待测试完成后,选取典型segment对比各方案输出质量。
|
||||
|
||||
---
|
||||
|
||||
## 执行状态
|
||||
|
||||
| 步骤 | 状态 | 完成时间 |
|
||||
|------|------|----------|
|
||||
| 创建测试脚本 | ✅ 完成 | 2026-04-27 21:36 |
|
||||
| 创建报告模板 | ✅ 完成 | 2026-04-27 21:36 |
|
||||
| ExaSAN测试(5个方案) | ✅ 完成 | 2026-04-27 21:50 |
|
||||
| Charade方案A测试 | 🔄 后台运行 | PID: 39475 |
|
||||
| 生成汇总报告 | ✅ 完成 | 2026-04-27 21:54 |
|
||||
| 结果分析 | ✅ 完成 | 2026-04-27 21:54 |
|
||||
| 决策建议 | ✅ 完成 | 2026-04-27 21:54 |
|
||||
| 质量评分 | ⏸ 待手动评分 | - |
|
||||
|
||||
---
|
||||
|
||||
**注意**: ExaSAN PCIe测试已完成,Charade方案A在后台运行中(预计19分钟完成)。质量评分需手动填写 `quality_evaluation.json`。
|
||||
+8
-8
@@ -121,15 +121,15 @@ ai_query_hints:
|
||||
### 待實施項目
|
||||
|
||||
#### 階段2 (1-2週)
|
||||
- 5. 建立事件嚴重等級處理流程
|
||||
- 6. 創建事件報告模板
|
||||
- 7. 建立文件生命周期管理腳本
|
||||
- 8. 培訓團隊新規範
|
||||
- 1. 建立事件嚴重等級處理流程
|
||||
- 1. 創建事件報告模板
|
||||
- 1. 建立文件生命周期管理腳本
|
||||
- 1. 培訓團隊新規範
|
||||
|
||||
#### 階段3 (1-2月)
|
||||
- 9. 實現自動化事件追蹤
|
||||
- 10. 建立監控與警報集成
|
||||
- 11. 定期審查和優化流程
|
||||
- 1. 實現自動化事件追蹤
|
||||
- 1. 建立監控與警報集成
|
||||
- 1. 定期審查和優化流程
|
||||
|
||||
---
|
||||
|
||||
@@ -251,4 +251,4 @@ ai_query_hints:
|
||||
- 相關文件已更新 (`DOCS_STANDARD.md`, `README.md`, `TRAINING_MAINTENANCE_RECORDS.md`)
|
||||
- 系統已準備就緒,可開始使用新模板創建運維文件
|
||||
|
||||
**審核結論**: 所有 Phase 2 任務已完成並獲得批准,系統已上線。
|
||||
**審核結論**: 所有 Phase 2 任務已完成並獲得批准,系統已上線。
|
||||
|
||||
@@ -23,16 +23,16 @@ implementation_status: "planned" # planned/implementing/completed/rolled_back
|
||||
estimated_downtime: "<預計停機時間(分鐘)>"
|
||||
actual_downtime: "<實際停機時間(分鐘)>"
|
||||
tags:
|
||||
- "change"
|
||||
- "<服務標籤>"
|
||||
- "<變更類型>"
|
||||
- "change"
|
||||
- "<服務標籤>"
|
||||
- "<變更類型>"
|
||||
related_documents:
|
||||
- "RCA_<相關分析>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "RCA_<相關分析>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有待審核的變更?"
|
||||
- "如何找到高風險的變更?"
|
||||
- "如何更新變更狀態和實施進度?"
|
||||
- "如何查詢所有待審核的變更?"
|
||||
- "如何找到高風險的變更?"
|
||||
- "如何更新變更狀態和實施進度?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -437,4 +437,4 @@ def extract_change_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
@@ -23,16 +23,16 @@ implementation_status: "planned" # planned/implementing/completed/rolled_back
|
||||
estimated_downtime: "<預計停機時間(分鐘)>"
|
||||
actual_downtime: "<實際停機時間(分鐘)>"
|
||||
tags:
|
||||
- "change"
|
||||
- "<服務標籤>"
|
||||
- "<變更類型>"
|
||||
- "change"
|
||||
- "<服務標籤>"
|
||||
- "<變更類型>"
|
||||
related_documents:
|
||||
- "RCA_<相關分析>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "RCA_<相關分析>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有待審核的變更?"
|
||||
- "如何找到高風險的變更?"
|
||||
- "如何更新變更狀態和實施進度?"
|
||||
- "如何查詢所有待審核的變更?"
|
||||
- "如何找到高風險的變更?"
|
||||
- "如何更新變更狀態和實施進度?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -437,4 +437,4 @@ def extract_change_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
@@ -344,4 +344,4 @@
|
||||
|
||||
---
|
||||
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
|
||||
@@ -22,16 +22,16 @@ impact_level: "高" # 高/中/低
|
||||
affected_users: "<受影響用戶數量或範圍>"
|
||||
downtime: "<停機時間(分鐘)>"
|
||||
tags:
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<事件類型>"
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<事件類型>"
|
||||
related_documents:
|
||||
- "RCA_<相關分析>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "RCA_<相關分析>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -358,4 +358,4 @@ def extract_incident_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
+9
-9
@@ -22,16 +22,16 @@ impact_level: "高" # 高/中/低
|
||||
affected_users: "<受影響用戶數量或範圍>"
|
||||
downtime: "<停機時間(分鐘)>"
|
||||
tags:
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<事件類型>"
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<事件類型>"
|
||||
related_documents:
|
||||
- "RCA_<相關分析>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "RCA_<相關分析>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
- "如何查詢所有 P0/P1 級別的事件?"
|
||||
- "如何找到過去 7 天內未解決的事件?"
|
||||
- "如何更新事件狀態和時間線?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -358,4 +358,4 @@ def extract_incident_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
@@ -266,4 +266,4 @@
|
||||
|
||||
---
|
||||
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
|
||||
@@ -20,20 +20,20 @@ maintenance_type: "routine" # routine/upgrade/architecture/capacity/security
|
||||
execution_window: "<YYYY-MM-DD HH:MM - HH:MM>"
|
||||
estimated_duration: "<分鐘>"
|
||||
affected_systems:
|
||||
- "<系統1>"
|
||||
- "<系統2>"
|
||||
- "<系統1>"
|
||||
- "<系統2>"
|
||||
tags:
|
||||
- "maintenance"
|
||||
- "<服務標籤>"
|
||||
- "<計畫類型標籤>"
|
||||
- "maintenance"
|
||||
- "<服務標籤>"
|
||||
- "<計畫類型標籤>"
|
||||
related_documents:
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P2 級別的維護計畫?"
|
||||
- "如何找到與 <服務> 相關的維護計畫?"
|
||||
- "如何更新維護計畫狀態?"
|
||||
- "如何查詢正在執行的維護計畫?"
|
||||
- "如何查詢所有 P2 級別的維護計畫?"
|
||||
- "如何找到與 <服務> 相關的維護計畫?"
|
||||
- "如何更新維護計畫狀態?"
|
||||
- "如何查詢正在執行的維護計畫?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -590,4 +590,4 @@ WHERE tc.table_name = '<表格名稱>'
|
||||
|
||||
---
|
||||
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
|
||||
@@ -21,16 +21,16 @@ root_cause: "<根本原因描述>"
|
||||
resolution: "<解決方案描述>"
|
||||
prevention: "<預防措施>"
|
||||
tags:
|
||||
- "rca"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
- "rca"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
related_documents:
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -439,4 +439,4 @@ def extract_rca_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
@@ -21,16 +21,16 @@ root_cause: "<根本原因描述>"
|
||||
resolution: "<解決方案描述>"
|
||||
prevention: "<預防措施>"
|
||||
tags:
|
||||
- "rca"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
- "rca"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
related_documents:
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -439,4 +439,4 @@ def extract_rca_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
+9
-9
@@ -17,16 +17,16 @@ created_by: "<創建者姓名>"
|
||||
created_at: "<YYYY-MM-DD HH:MM>"
|
||||
version: "1.0"
|
||||
tags:
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
- "incident"
|
||||
- "<服務標籤>"
|
||||
- "<問題類型>"
|
||||
related_documents:
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
- "INCIDENT_<相關事件>.md"
|
||||
- "CHANGE_<相關變更>.md"
|
||||
ai_query_hints:
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
- "如何查詢所有 P0 級別的 RCA?"
|
||||
- "如何找到與 n8n 相關的所有 RCA?"
|
||||
- "如何更新 RCA 狀態?"
|
||||
---
|
||||
|
||||
<!--
|
||||
@@ -141,4 +141,4 @@ def extract_rca_metadata(file_path):
|
||||
**注意**:
|
||||
- AI Agent 應優先讀取 YAML frontmatter 獲取結構化數據
|
||||
- 人類用戶可閱讀 Markdown 表格部分
|
||||
- 兩部分數據應保持同步
|
||||
- 兩部分數據應保持同步
|
||||
|
||||
@@ -348,4 +348,4 @@
|
||||
|
||||
---
|
||||
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
**模板結束** - 請根據實際情況填寫內容
|
||||
|
||||
Reference in New Issue
Block a user