cleanup: remove dead code and duplicate docs
- Remove session-ses_2f27.md (161KB raw session log) - Remove 49 ROOT_* duplicate files across REFERENCE/ - Remove 14 duplicate files between REFERENCE/ root and history/ - Remove asr_legacy.rs (dead code, replaced by asr.rs) - Remove src/core/worker/ (duplicate JobWorker) - Remove src/core/layers/ (empty directory) - Remove 4 .bak files in src/ - Remove 7 dead private methods in worker/processor.rs - Remove backup directory from git tracking
This commit is contained in:
@@ -1,378 +0,0 @@
|
||||
---
|
||||
document_type: "test_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Playground 功能測試計畫"
|
||||
date: "2026-03-31"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "功能測試計畫"
|
||||
- "playground"
|
||||
ai_query_hints:
|
||||
- "查詢 Playground 功能測試計畫 的內容"
|
||||
- "Playground 功能測試計畫 的主要目的是什麼?"
|
||||
- "如何操作或實施 Playground 功能測試計畫?"
|
||||
---
|
||||
|
||||
# Playground 功能測試計畫
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 建立者 | Warren |
|
||||
| 建立時間 | 2026-03-31 |
|
||||
| 文件版本 | V1.0 |
|
||||
| 測試類型 | 功能測試、隔離測試、整合測試 |
|
||||
|
||||
---
|
||||
|
||||
## 版本歷史
|
||||
|
||||
| 版本 | 日期 | 目的 | 操作人 |
|
||||
|------|------|------|--------|
|
||||
| V1.0 | 2026-03-31 | 創建測試計畫 | Warren |
|
||||
|
||||
---
|
||||
|
||||
## 測試目標
|
||||
|
||||
1. **功能測試**:驗證 Playground 基本功能正常運作
|
||||
2. **隔離測試**:確保 Development 與 Production 數據完全隔離
|
||||
3. **整合測試**:驗證完整視頻處理流程在 Playground 環境中正常運行
|
||||
|
||||
---
|
||||
|
||||
## 測試環境
|
||||
|
||||
### 硬體/軟體需求
|
||||
|
||||
| 項目 | 規格 |
|
||||
|------|------|
|
||||
| 測試影片 | 1 個短視頻(< 1 分鐘)|
|
||||
| PostgreSQL | 已啟動,Schema `dev` 已創建 |
|
||||
| MongoDB | 已啟動 |
|
||||
| Qdrant | 已啟動 |
|
||||
| Redis | 已啟動 |
|
||||
|
||||
### 環境配置
|
||||
|
||||
| 服務 | Production | Playground |
|
||||
|------|-----------|------------|
|
||||
| Port | 3002 | 3003 |
|
||||
| PostgreSQL Schema | `public` | `dev` |
|
||||
| MongoDB Database | `momentry` | `momentry_dev` |
|
||||
| Qdrant Collection | `momentry_rule1` | `momentry_dev_rule1` |
|
||||
| Redis Prefix | `momentry:` | `momentry_dev:` |
|
||||
| Output Directory | `/output` | `/output_dev` |
|
||||
|
||||
---
|
||||
|
||||
## 測試案例
|
||||
|
||||
### Phase 1: 連接性測試
|
||||
|
||||
#### TC-01: PostgreSQL Schema 隔離驗證
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Playground 使用 `dev` schema |
|
||||
| 前置條件 | PostgreSQL `dev` schema 已創建 |
|
||||
| 測試步驟 | 1. 啟動 Playground Server (port 3003)<br>2. 執行 SQL: `SELECT current_schema()`<br>3. 檢查結果為 `dev` |
|
||||
| 預期結果 | current_schema = `dev` |
|
||||
| 驗證方式 | API 或直接查詢 |
|
||||
|
||||
```bash
|
||||
# 測試指令
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" -c "SET search_path TO dev; SELECT current_schema();"
|
||||
```
|
||||
|
||||
#### TC-02: MongoDB Database 隔離驗證
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Playground 使用 `momentry_dev` database |
|
||||
| 前置條件 | MongoDB `momentry_dev` database 已創建 |
|
||||
| 測試步驟 | 1. 啟動 Playground Server<br>2. 檢查 MongoDB 連線使用的資料庫名稱 |
|
||||
| 預期結果 | 使用 `momentry_dev` database |
|
||||
|
||||
```bash
|
||||
# 測試指令
|
||||
curl -s "http://localhost:27017/momentry_dev/_/command" | jq
|
||||
```
|
||||
|
||||
#### TC-03: Qdrant Collection 隔離驗證
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Playground 使用 `momentry_dev_rule1` collection |
|
||||
| 前置條件 | Qdrant collection 已創建 |
|
||||
| 測試步驟 | 1. 列出所有 collections<br>2. 確認 `momentry_dev_rule1` 存在 |
|
||||
| 預期結果 | Collection 列表包含 `momentry_dev_rule1` |
|
||||
|
||||
```bash
|
||||
# 測試指令
|
||||
curl -s -H "api-key: Test3200Test3200Test3200" \
|
||||
"http://localhost:6333/collections" | jq '.result[].name'
|
||||
```
|
||||
|
||||
#### TC-04: Redis Prefix 隔離驗證
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Playground 使用 `momentry_dev:` prefix |
|
||||
| 前置條件 | Redis 運行中 |
|
||||
| 測試步驟 | 1. 啟動 Playground Server<br>2. 執行任何 API 調用<br>3. 檢查 Redis keys 使用 `momentry_dev:` prefix |
|
||||
| 預期結果 | 所有 keys 以 `momentry_dev:` 開頭 |
|
||||
|
||||
```bash
|
||||
# 測試指令
|
||||
redis-cli KEYS "momentry_dev:*"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: 功能測試
|
||||
|
||||
#### TC-05: 視頻註冊功能
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 驗證 Playground 可以註冊視頻 |
|
||||
| 前置條件 | Playground Server 運行中 |
|
||||
| 測試步驟 | 1. 調用 `/api/v1/videos/register` API<br>2. 傳入測試視頻路徑<br>3. 檢查響應 |
|
||||
| 預期結果 | 返回視頻 UUID,數據存入 `dev.videos` |
|
||||
|
||||
```bash
|
||||
# 測試指令
|
||||
curl -X POST "http://localhost:3003/api/v1/videos/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"file_path": "/path/to/test/video.mp4"}'
|
||||
```
|
||||
|
||||
#### TC-06: 視頻查詢功能
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 驗證可以查詢已註冊的視頻 |
|
||||
| 前置條件 | TC-05 成功 |
|
||||
| 測試步驟 | 1. 調用 `/api/v1/videos/{uuid}` API<br>2. 檢查返回的視頻信息 |
|
||||
| 預期結果 | 返回視頻詳細信息,schema 為 `dev` |
|
||||
|
||||
#### TC-07: Chunk 存儲功能
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 驗證 Chunk 數據存入正確的隔離存儲 |
|
||||
| 前置條件 | Playground Server 運行中 |
|
||||
| 測試步驟 | 1. 處理視頻生成 chunks<br>2. 檢查 PostgreSQL `dev.chunks`<br>3. 檢查 MongoDB `momentry_dev.chunks`<br>4. 檢查 Qdrant `momentry_dev_rule1` |
|
||||
| 預期結果 | 所有存儲位置正確隔離 |
|
||||
|
||||
```bash
|
||||
# 驗證 PostgreSQL
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SELECT COUNT(*) FROM dev.chunks;"
|
||||
|
||||
# 驗證 MongoDB
|
||||
curl -s "http://localhost:27017/momentry_dev/chunks/count" | jq
|
||||
|
||||
# 驗證 Qdrant
|
||||
curl -s -H "api-key: Test3200Test3200Test3200" \
|
||||
"http://localhost:6333/collections/momentry_dev_rule1/points/count" | jq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: 隔離完整性測試
|
||||
|
||||
#### TC-08: 數據不交叉污染測試
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Production 和 Playground 數據完全隔離 |
|
||||
| 前置條件 | 兩個環境都在運行 |
|
||||
| 測試步驟 | 1. 在 Production 環境註冊視頻 A<br>2. 在 Playground 環境註冊視頻 B<br>3. 分別查詢兩個環境<br>4. 確認數據不互通 |
|
||||
| 預期結果 | Production 只能看到 A,Playground 只能看到 B |
|
||||
|
||||
#### TC-09: Redis Key 隔離測試
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 確認 Redis keys 完全隔離 |
|
||||
| 前置條件 | 兩個環境都在運行 |
|
||||
| 測試步驟 | 1. 在 Production 執行操作<br>2. 在 Playground 執行操作<br>3. 檢查 keys 分離 |
|
||||
| 預期結果 | `momentry:*` 和 `momentry_dev:*` 分開 |
|
||||
|
||||
```bash
|
||||
# 驗證 keys 分離
|
||||
redis-cli KEYS "momentry:*" # 應該只有 production keys
|
||||
redis-cli KEYS "momentry_dev:*" # 應該只有 playground keys
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: 完整流程測試
|
||||
|
||||
#### TC-10: 端到端視頻處理流程
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試目標 | 驗證完整視頻處理流程在 Playground 正常運行 |
|
||||
| 前置條件 | 所有服務正常,測試視頻準備完成 |
|
||||
| 測試步驟 | 1. 註冊測試視頻<br>2. 觸發處理(ASR, OCR, YOLO 等)<br>3. 檢查 chunks 生成<br>4. 檢查向量存入 Qdrant<br>5. 驗證搜尋功能 |
|
||||
| 預期結果 | 完整流程正常,數據存入隔離存儲 |
|
||||
|
||||
```bash
|
||||
# 完整流程測試指令序列
|
||||
|
||||
# 1. 註冊視頻
|
||||
curl -X POST "http://localhost:3003/api/v1/videos/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"file_path": "/path/to/test_video.mp4"}'
|
||||
|
||||
# 2. 獲取 UUID (假設為 test-uuid)
|
||||
VIDEO_UUID="test-uuid"
|
||||
|
||||
# 3. 觸發處理
|
||||
curl -X POST "http://localhost:3003/api/v1/videos/${VIDEO_UUID}/process" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"processors": ["asr", "ocr", "yolo"]}'
|
||||
|
||||
# 4. 等待處理完成 (輪詢狀態)
|
||||
curl "http://localhost:3003/api/v1/videos/${VIDEO_UUID}"
|
||||
|
||||
# 5. 驗證數據存入隔離存儲
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SELECT COUNT(*) FROM dev.chunks WHERE uuid = '${VIDEO_UUID}';"
|
||||
|
||||
# 6. 驗證向量存入 Qdrant
|
||||
curl -s -H "api-key: Test3200Test3200Test3200" \
|
||||
"http://localhost:6333/collections/momentry_dev_rule1/points/count" | jq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 測試檢查清單
|
||||
|
||||
### 測試前檢查
|
||||
|
||||
| 項目 | 狀態 | 備註 |
|
||||
|------|------|------|
|
||||
| PostgreSQL 運行中 | [ ] | |
|
||||
| `dev` schema 已創建 | [ ] | |
|
||||
| MongoDB 運行中 | [ ] | |
|
||||
| `momentry_dev` database 已創建 | [ ] | |
|
||||
| Qdrant 運行中 | [ ] | |
|
||||
| `momentry_dev_rule1` collection 已創建 | [ ] | |
|
||||
| Redis 運行中 | [ ] | |
|
||||
| 測試視頻準備完成 | [ ] | |
|
||||
| 防火牆/端口 3003 開放 | [ ] | |
|
||||
|
||||
### 測試後檢查
|
||||
|
||||
| 項目 | 狀態 | 備註 |
|
||||
|------|------|------|
|
||||
| TC-01: PostgreSQL Schema 隔離 | [ ] | |
|
||||
| TC-02: MongoDB Database 隔離 | [ ] | |
|
||||
| TC-03: Qdrant Collection 隔離 | [ ] | |
|
||||
| TC-04: Redis Prefix 隔離 | [ ] | |
|
||||
| TC-05: 視頻註冊功能 | [ ] | |
|
||||
| TC-06: 視頻查詢功能 | [ ] | |
|
||||
| TC-07: Chunk 存儲功能 | [ ] | |
|
||||
| TC-08: 數據不交叉污染 | [ ] | |
|
||||
| TC-09: Redis Key 隔離 | [ ] | |
|
||||
| TC-10: 端到端流程 | [ ] | |
|
||||
|
||||
---
|
||||
|
||||
## 測試數據準備
|
||||
|
||||
### 測試視頻要求
|
||||
|
||||
| 項目 | 規格 |
|
||||
|------|------|
|
||||
| 時長 | 30 秒 - 1 分鐘 |
|
||||
| 解析度 | 720p 或以上 |
|
||||
| 格式 | MP4 |
|
||||
| 內容 | 包含說話人形體、場景變化 |
|
||||
|
||||
### 測試用影片路徑
|
||||
|
||||
```
|
||||
# 請選擇一個測試影片
|
||||
/Users/accusys/momentry/test_videos/sample_video.mp4
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 預期測試結果
|
||||
|
||||
### 成功標準
|
||||
|
||||
| 項目 | 標準 |
|
||||
|------|------|
|
||||
| 功能測試 | 所有 API 調用成功返回正確響應 |
|
||||
| 隔離測試 | 兩個環境數據完全隔離,無交叉 |
|
||||
| 整合測試 | 完整流程正常運行,數據正確存儲 |
|
||||
|
||||
### 常見問題
|
||||
|
||||
| 問題 | 原因 | 解決方案 |
|
||||
|------|------|---------|
|
||||
| 連接失敗 | 服務未啟動 | 檢查 PostgreSQL/MongoDB/Qdrant/Redis 狀態 |
|
||||
| Schema 錯誤 | `dev` schema 未創建 | 執行 `CREATE SCHEMA dev;` |
|
||||
| Collection 錯誤 | Qdrant collection 未創建 | 使用 Qdrant API 創建 collection |
|
||||
| 數據交叉 | Schema 切換失敗 | 檢查 `search_path` 配置 |
|
||||
|
||||
---
|
||||
|
||||
## 測試報告模板
|
||||
|
||||
```
|
||||
# Playground 功能測試報告
|
||||
|
||||
## 測試環境
|
||||
- 日期: YYYY-MM-DD
|
||||
- 測試人員:
|
||||
- 系統版本:
|
||||
|
||||
## 測試結果
|
||||
|
||||
| 測試案例 | 狀態 | 備註 |
|
||||
|----------|------|------|
|
||||
| TC-01 | PASS/FAIL | |
|
||||
| TC-02 | PASS/FAIL | |
|
||||
| ... | ... | |
|
||||
|
||||
## 問題記錄
|
||||
|
||||
### 問題 1
|
||||
- 描述:
|
||||
- 影響:
|
||||
- 解決方案:
|
||||
|
||||
## 總結
|
||||
|
||||
- 總測試數: X
|
||||
- 通過: X
|
||||
- 失敗: X
|
||||
- 通過率: X%
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 相關文件
|
||||
|
||||
| 文件 | 說明 |
|
||||
|------|------|
|
||||
| `PLAYGROUND_ARCHITECTURE.md` | Playground 隔離架構規劃 |
|
||||
| `SERVICES.md` | 服務端口分配 |
|
||||
| `MOMENTRY_CORE_REDIS_KEYS.md` | Redis Key 設計規範 |
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: V1.0
|
||||
- 建立日期: 2026-03-31
|
||||
- 文件更新: 2026-03-31
|
||||
@@ -1,275 +0,0 @@
|
||||
---
|
||||
document_type: "test_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Playground 功能測試報告"
|
||||
date: "2026-03-31"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "功能測試報告"
|
||||
- "playground"
|
||||
ai_query_hints:
|
||||
- "查詢 Playground 功能測試報告 的內容"
|
||||
- "Playground 功能測試報告 的主要目的是什麼?"
|
||||
- "如何操作或實施 Playground 功能測試報告?"
|
||||
---
|
||||
|
||||
# Playground 功能測試報告
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 測試人員 | Warren (OpenCode) |
|
||||
| 測試日期 | 2026-03-31 |
|
||||
| 文件版本 | V1.0 |
|
||||
|
||||
---
|
||||
|
||||
## 測試環境
|
||||
|
||||
| 服務 | 隔離目標 | 狀態 |
|
||||
|------|---------|------|
|
||||
| PostgreSQL | `dev` schema | 🔶 部分運作 |
|
||||
| MongoDB | `momentry_dev` database | ✅ 完成 |
|
||||
| Qdrant | `momentry_dev_rule1` collection | ✅ 完成 |
|
||||
| Redis | `momentry_dev:` prefix | ✅ 已隔離 |
|
||||
| File System | `/output_dev` | ✅ 已隔離 |
|
||||
|
||||
---
|
||||
|
||||
## 測試結果摘要
|
||||
|
||||
| 測試階段 | 通過 | 失敗 | 總計 |
|
||||
|----------|------|------|------|
|
||||
| Phase 1: 連接性測試 | 2 | 2 | 4 |
|
||||
| Phase 2: 功能測試 | 1 | 1 | 2 |
|
||||
| Phase 3: 隔離測試 | 1 | 1 | 2 |
|
||||
| Phase 4: 流程測試 | 0 | 1 | 1 |
|
||||
| **總計** | **4** | **5** | **9** |
|
||||
|
||||
---
|
||||
|
||||
## 詳細測試結果
|
||||
|
||||
### Phase 1: 連接性測試
|
||||
|
||||
#### TC-01: PostgreSQL Schema 隔離驗證
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | 🔶 部分通過 |
|
||||
| 測試步驟 | 1. 啟動 Playground Server<br>2. 檢查日誌中的 schema 設置 |
|
||||
| 實際結果 | - 日誌顯示 `Database schema configuration: dev` ✅<br>- 日誌顯示 `after_connect: setting search_path to dev` ✅<br>- Tables created in `dev` schema ✅ |
|
||||
| 問題 | Runtime queries 仍使用 `public` schema(連接池連接重用問題)|
|
||||
|
||||
#### TC-02: MongoDB Database 隔離驗證
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | ✅ 通過 |
|
||||
| 測試步驟 | 1. 創建 `momentry_dev` database<br>2. 檢查 collections |
|
||||
| 實際結果 | - `momentry_dev.chunks` ✅<br>- `momentry_dev.cache` ✅ |
|
||||
|
||||
#### TC-03: Qdrant Collection 隔離驗證
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | ✅ 通過 |
|
||||
| 測試步驟 | 1. 創建 collection<br>2. 列出所有 collections |
|
||||
| 實際結果 | `momentry_dev_rule1` collection 已創建 ✅ |
|
||||
|
||||
#### TC-04: Redis Prefix 隔離驗證
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | 🔶 未完整測試 |
|
||||
| 備註 | 伺服器運行時認證問題導致無法完整測試 |
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: 功能測試
|
||||
|
||||
#### TC-05: 視頻註冊功能
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | 🔶 部分通過 |
|
||||
| 測試步驟 | 調用 `/api/v1/videos/register` API |
|
||||
| 實際結果 | API 返回成功 ✅,但數據寫入 `public.videos` 而非 `dev.videos` |
|
||||
|
||||
#### TC-06: 視頻查詢功能
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | ❌ 失敗 |
|
||||
| 原因 | API Key 認證失敗 (401 Unauthorized) |
|
||||
|
||||
#### TC-07: Chunk 存儲功能
|
||||
| 項目 | 結果 |
|
||||
|------|------|
|
||||
| 狀態 | ❌ 失敗 |
|
||||
| 原因 | 依賴 TC-05/TC-06 成功 |
|
||||
|
||||
---
|
||||
|
||||
### Phase 3 & 4
|
||||
|
||||
| 測試案例 | 狀態 | 原因 |
|
||||
|----------|------|------|
|
||||
| TC-08: 數據不交叉污染 | ❌ | PostgreSQL schema 問題 |
|
||||
| TC-09: Redis Key 隔離 | ❌ | 認證問題 |
|
||||
| TC-10: 端到端流程 | ❌ | 前置測試失敗 |
|
||||
|
||||
---
|
||||
|
||||
## 問題分析
|
||||
|
||||
### 問題 1: PostgreSQL Schema 隔離不完全
|
||||
|
||||
**嚴重程度**: 高
|
||||
|
||||
**現象**:
|
||||
- 伺服器啟動時,`search_path` 正確設置為 `dev`
|
||||
- Tables 在 `dev` schema 中創建
|
||||
- 但運行時的 INSERT/SELECT 查詢使用 `public` schema
|
||||
|
||||
**根本原因**:
|
||||
- sqlx 連接池使用 `after_connect`鉤子設置 `search_path`
|
||||
- 當連接被重用時,`search_path` 設置不持久
|
||||
- 需要使用 `after_pool_acquire` 或自定義連接器
|
||||
|
||||
**嘗試的解決方案**:
|
||||
1. 使用 `after_connect` 鉤子 - 部分運作(啟動時)
|
||||
2. 嘗試使用 `after_pool_acquire` - 方法不存在於當前 sqlx 版本
|
||||
|
||||
**建議的長期解決方案**:
|
||||
1. 使用 PostgreSQL 會話級別預設設置
|
||||
2. 或者在每個查詢中明確指定 schema(如 `dev.videos`)
|
||||
3. 或者實現自定義 sqlx 連接器
|
||||
|
||||
### 問題 2: API Key 認證
|
||||
|
||||
**嚴重程度**: 中
|
||||
|
||||
**現象**: API 返回 401 Unauthorized
|
||||
|
||||
**可能原因**: API Key 格式或權限問題
|
||||
|
||||
---
|
||||
|
||||
## 已完成的隔離配置
|
||||
|
||||
### ✅ Redis 隔離
|
||||
- 配置: `MOMENTRY_REDIS_PREFIX=momentry_dev:`
|
||||
- 狀態: 已在 `.env.development` 中配置
|
||||
|
||||
### ✅ 文件系統隔離
|
||||
- 配置: `MOMENTRY_OUTPUT_DIR=/Users/accusys/momentry/output_dev`
|
||||
- 狀態: 已在 `.env.development` 中配置
|
||||
|
||||
### ✅ MongoDB 隔離
|
||||
- 配置: `MOMENTRY_DATABASE=momentry_dev`
|
||||
- 實現: `src/core/db/mongodb_db.rs` 已修改使用配置
|
||||
|
||||
### ✅ Qdrant 隔離
|
||||
- 配置: `QDRANT_COLLECTION=momentry_dev_rule1`
|
||||
- 實現: 已在代碼中使用環境變數
|
||||
|
||||
### 🔶 PostgreSQL 隔離
|
||||
- 配置: `DATABASE_SCHEMA=dev`
|
||||
- 實現: 部分完成 - schema 在啟動時創建 tables,但运行时查询有問題
|
||||
|
||||
---
|
||||
|
||||
## 代碼變更記錄
|
||||
|
||||
| 文件 | 變更 |
|
||||
|------|------|
|
||||
| `.env.development` | 添加 `DATABASE_SCHEMA=dev`, `MONGODB_DATABASE=momentry_dev`, `QDRANT_COLLECTION=momentry_dev_rule1` |
|
||||
| `src/core/config.rs` | 添加 `DATABASE_SCHEMA`, `MONGODB_DATABASE`, `QDRANT_COLLECTION` 靜態配置 |
|
||||
| `src/core/db/postgres_db.rs` | 添加 schema 初始化邏輯,使用 `after_connect` 鉤子 |
|
||||
| `src/core/db/mongodb_db.rs` | 添加 `database` 字段,使用 `MONGODB_DATABASE` 配置 |
|
||||
|
||||
---
|
||||
|
||||
## 數據庫創建記錄
|
||||
|
||||
```sql
|
||||
-- PostgreSQL
|
||||
CREATE SCHEMA IF NOT EXISTS dev;
|
||||
|
||||
-- MongoDB
|
||||
db.createCollection('momentry_dev.chunks')
|
||||
db.createCollection('momentry_dev.cache')
|
||||
|
||||
-- Qdrant
|
||||
curl -X PUT 'http://localhost:6333/collections/momentry_dev_rule1' \
|
||||
-H 'api-key: Test3200Test3200Test3200' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"vectors": {"size": 1024, "distance": "Cosine"}}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 測試檢查清單
|
||||
|
||||
### 測試前檢查
|
||||
|
||||
| 項目 | 狀態 | 備註 |
|
||||
|------|------|------|
|
||||
| PostgreSQL 運行中 | ✅ | |
|
||||
| `dev` schema 已創建 | ✅ | |
|
||||
| MongoDB 運行中 | ✅ | |
|
||||
| `momentry_dev` database 已創建 | ✅ | |
|
||||
| Qdrant 運行中 | ✅ | |
|
||||
| `momentry_dev_rule1` collection 已創建 | ✅ | |
|
||||
| Redis 運行中 | ✅ | |
|
||||
|
||||
### 測試後檢查
|
||||
|
||||
| 項目 | 狀態 | 備註 |
|
||||
|------|------|------|
|
||||
| TC-01: PostgreSQL Schema 隔離 | 🔶 | 啟動時正確,運行時有問題 |
|
||||
| TC-02: MongoDB Database 隔離 | ✅ | |
|
||||
| TC-03: Qdrant Collection 隔離 | ✅ | |
|
||||
| TC-04: Redis Prefix 隔離 | 🔶 | 未完整測試 |
|
||||
| TC-05: 視頻註冊功能 | 🔶 | API 成功但寫入錯誤 schema |
|
||||
| TC-06: 視頻查詢功能 | ❌ | API Key 認證失敗 |
|
||||
| TC-07: Chunk 存儲功能 | ❌ | 依賴失敗 |
|
||||
| TC-08: 數據不交叉污染 | ❌ | PostgreSQL schema 問題 |
|
||||
| TC-09: Redis Key 隔離 | ❌ | 認證問題 |
|
||||
| TC-10: 端到端流程 | ❌ | 前置測試失敗 |
|
||||
|
||||
---
|
||||
|
||||
## 總結
|
||||
|
||||
| 指標 | 數值 |
|
||||
|------|------|
|
||||
| 總測試數 | 9 |
|
||||
| 通過 | 4 |
|
||||
| 失敗 | 5 |
|
||||
| 通過率 | 44% |
|
||||
|
||||
### 主要發現
|
||||
|
||||
1. **隔離架構已建立**: Redis、MongoDB、Qdrant 的隔離配置已完成
|
||||
2. **PostgreSQL Schema 有待修復**: 這是最大的阻塞問題
|
||||
3. **API 認證需要調查**: 401 錯誤需要進一步調研
|
||||
|
||||
### 後續建議
|
||||
|
||||
1. **修復 PostgreSQL Schema 隔離**(高優先級)
|
||||
- 方案 A: 在每個 SQL 查詢中明確指定 schema 前綴
|
||||
- 方案 B: 實現自定義連接器
|
||||
- 方案 C: 使用 PostgreSQL 角色/數據庫級別設置
|
||||
|
||||
2. **調查 API Key 認證問題**(中優先級)
|
||||
- 檢查 API Key 格式
|
||||
- 驗證權限配置
|
||||
|
||||
3. **完成剩餘測試案例**(低優先級)
|
||||
- 待 PostgreSQL 問題修復後
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: V1.0
|
||||
- 建立日期: 2026-03-31
|
||||
- 更新日期: 2026-03-31
|
||||
@@ -1,281 +0,0 @@
|
||||
---
|
||||
document_type: "test_doc"
|
||||
service: "POSTGRESQL"
|
||||
title: "PostgreSQL Schema 隔離改善計畫"
|
||||
date: "2026-03-31"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "schema"
|
||||
- "postgresql"
|
||||
- "隔離改善計畫"
|
||||
ai_query_hints:
|
||||
- "查詢 PostgreSQL Schema 隔離改善計畫 的內容"
|
||||
- "PostgreSQL Schema 隔離改善計畫 的主要目的是什麼?"
|
||||
- "如何操作或實施 PostgreSQL Schema 隔離改善計畫?"
|
||||
---
|
||||
|
||||
# PostgreSQL Schema 隔離改善計畫
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 建立者 | Warren |
|
||||
| 建立時間 | 2026-03-31 |
|
||||
| 文件版本 | V1.0 |
|
||||
|
||||
---
|
||||
|
||||
## 問題分析
|
||||
|
||||
### 現象
|
||||
- 伺服器啟動時,`search_path` 正確設置為 `dev`
|
||||
- Tables 在 `dev` schema 中成功創建
|
||||
- 但運行時的 INSERT/SELECT 查詢仍使用 `public` schema
|
||||
|
||||
### 根本原因
|
||||
```
|
||||
sqlx 連接池工作原理:
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Connection Pool │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ Conn 1 │ │ Conn 2 │ │ Conn 3 │ ... │
|
||||
│ │ (fresh) │ │ (reused) │ │ (reused) │ │
|
||||
│ │ search_path │ │ ? │ │ ? │ │
|
||||
│ │ = dev ✅ │ │ = public ❌│ │ = public ❌│ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │
|
||||
│ after_connect 鉤子只在「新建連接」時執行 │
|
||||
│ 連接池重用連接時,search_path 不持久 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 解決方案比較
|
||||
|
||||
| 方案 | 優點 | 缺點 | 推薦度 |
|
||||
|------|------|------|--------|
|
||||
| A. 明確 Schema 前綴 | 簡單直接,精確控制 | 需要改大量 SQL 查詢 | ⭐⭐⭐⭐⭐ |
|
||||
| B. 自定義連接器 | 一勞永逸 | 實現複雜,需要深入 sqlx | ⭐⭐⭐ |
|
||||
| C. PostgreSQL 會話預設 | 無需改代碼 | 需要 DB 管理權限 | ⭐⭐⭐ |
|
||||
| D. 兩個資料庫 | 完全隔離 | 需要雙倍資源 | ⭐⭐ |
|
||||
|
||||
---
|
||||
|
||||
## 推薦方案: 明確 Schema 前綴
|
||||
|
||||
### 實作策略
|
||||
|
||||
在所有 SQL 查詢中明確指定 schema 前綴,格式:`{schema}.{table}`
|
||||
|
||||
#### 1. 創建 Schema 前綴工具函數
|
||||
|
||||
```rust
|
||||
// src/core/db/schema.rs
|
||||
|
||||
use crate::core::config::DATABASE_SCHEMA;
|
||||
|
||||
pub fn table_name(table: &str) -> String {
|
||||
let schema = DATABASE_SCHEMA.as_str();
|
||||
if schema == "public" {
|
||||
table.to_string()
|
||||
} else {
|
||||
format!("{}.{}", schema, table)
|
||||
}
|
||||
}
|
||||
|
||||
// 使用範例
|
||||
let videos_table = table_name("videos"); // "dev.videos" 或 "videos"
|
||||
```
|
||||
|
||||
#### 2. 修改 PostgresDb 方法
|
||||
|
||||
```rust
|
||||
// register_video 方法改造範例
|
||||
|
||||
// 改造前
|
||||
sqlx::query("INSERT INTO videos ...")
|
||||
|
||||
# 改造後
|
||||
let table = table_name("videos");
|
||||
sqlx::query(&format!("INSERT INTO {} ...", table))
|
||||
```
|
||||
|
||||
#### 3. 需要修改的文件清單
|
||||
|
||||
| 文件 | 需要修改的函數/方法 |
|
||||
|------|---------------------|
|
||||
| `postgres_db.rs` | register_video, get_video, list_videos, delete_video, register_chunk, get_chunks, 等所有 DB 操作 |
|
||||
| `sync_db.rs` | 調用 postgres 的方法 |
|
||||
|
||||
---
|
||||
|
||||
## 實施步驟
|
||||
|
||||
### Step 1: 創建 Schema 工具模組
|
||||
|
||||
**目標**: 創建統一的 schema 前綴處理函數
|
||||
|
||||
**檔案**: `src/core/db/schema.rs`
|
||||
|
||||
```rust
|
||||
use once_cell::sync::Lazy;
|
||||
use std::env;
|
||||
|
||||
pub static DATABASE_SCHEMA: Lazy<String> = Lazy::new(|| {
|
||||
env::var("DATABASE_SCHEMA").unwrap_or_else(|_| "public".to_string())
|
||||
});
|
||||
|
||||
pub fn table_name(table: &str) -> String {
|
||||
let schema = DATABASE_SCHEMA.as_str();
|
||||
if schema == "public" {
|
||||
table.to_string()
|
||||
} else {
|
||||
format!("{}.{}", schema, table)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn qualified_table(table: &str) -> String {
|
||||
table_name(table)
|
||||
}
|
||||
```
|
||||
|
||||
### Step 2: 重構 PostgresDb 方法
|
||||
|
||||
**目標**: 將所有 SQL 查詢改為使用明確的 schema 前綴
|
||||
|
||||
**範例 - register_video**:
|
||||
|
||||
```rust
|
||||
// 改造前
|
||||
pub async fn register_video(&self, record: &VideoRecord) -> Result<i64> {
|
||||
let result = sqlx::query(
|
||||
r#"
|
||||
INSERT INTO videos (uuid, file_path, ...)
|
||||
"#
|
||||
)
|
||||
}
|
||||
|
||||
// 改造後
|
||||
pub async fn register_video(&self, record: &VideoRecord) -> Result<i64> {
|
||||
let table = table_name("videos");
|
||||
let result = sqlx::query(
|
||||
&format!(
|
||||
r#"
|
||||
INSERT INTO {} (uuid, file_path, ...)
|
||||
"#,
|
||||
table
|
||||
)
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
### Step 3: 測試驗證
|
||||
|
||||
**目標**: 確保數據正確寫入 `dev` schema
|
||||
|
||||
```bash
|
||||
# 1. 重啟 Playground Server
|
||||
pkill -f momentry_playground
|
||||
cargo run --bin momentry_playground -- server --port 3003 &
|
||||
|
||||
# 2. 註冊測試視頻
|
||||
curl -X POST "http://localhost:3003/api/v1/videos/register" \
|
||||
-H "Authorization: Bearer <API_KEY>" \
|
||||
-d '{"file_path": "/path/to/video.mp4"}'
|
||||
|
||||
# 3. 驗證數據寫入 dev schema
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SET search_path TO dev; SELECT uuid, file_name FROM videos;"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 工作量估計
|
||||
|
||||
### 需要修改的函數數量
|
||||
|
||||
| 類別 | 數量 |
|
||||
|------|------|
|
||||
| Videos 相關 | ~8 |
|
||||
| Chunks 相關 | ~12 |
|
||||
| Frames 相關 | ~5 |
|
||||
| Pre_chunks 相關 | ~4 |
|
||||
| Monitor_jobs 相關 | ~6 |
|
||||
| API Keys 相關 | ~8 |
|
||||
| 其他 | ~5 |
|
||||
| **總計** | **~48** |
|
||||
|
||||
### 預估時間
|
||||
- 修改: 2-3 小時
|
||||
- 測試: 1 小時
|
||||
- 總計: 3-4 小時
|
||||
|
||||
---
|
||||
|
||||
## 替代方案: 使用 ConnectionInitializer
|
||||
|
||||
如果不想修改所有 SQL 查詢,可以嘗試自定義 sqlx 的連接初始化器:
|
||||
|
||||
```rust
|
||||
// 使用 sqlx::postgres::PgPoolOptions 的連接初始化
|
||||
// 注意:這需要 sqlx 0.7+ 版本
|
||||
|
||||
use sqlx::postgres::{PgPoolOptions, Postgres};
|
||||
|
||||
let pool = PgPoolOptions::new()
|
||||
.max_connections(10)
|
||||
.connect_with(
|
||||
connection_options
|
||||
.after_connect(|conn, _| {
|
||||
Box::pin(async move {
|
||||
// 在這裡設置 session 參數
|
||||
conn.execute("SET search_path TO dev").await?;
|
||||
Ok(())
|
||||
})
|
||||
})
|
||||
)
|
||||
.await?;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 驗收標準
|
||||
|
||||
改造完成後,以下測試必須通過:
|
||||
|
||||
```bash
|
||||
# TC-01: PostgreSQL Schema 隔離驗證
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SET search_path TO dev; SELECT COUNT(*) FROM videos;"
|
||||
# 預期: 能夠查到數據
|
||||
|
||||
# TC-02: 數據隔離驗證
|
||||
# 在 Playground 註冊視頻後
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SET search_path TO dev; SELECT COUNT(*) FROM videos;"
|
||||
# 預期: > 0
|
||||
|
||||
psql "postgres://accusys:accusys@localhost:5432/momentry" \
|
||||
-c "SET search_path TO public; SELECT COUNT(*) FROM videos;"
|
||||
# 預期: 不包含 Playground 註冊的數據
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 風險與緩解
|
||||
|
||||
| 風險 | 影響 | 緩解措施 |
|
||||
|------|------|---------|
|
||||
| 漏改某些查詢 | 數據寫入錯誤 schema | 全面測試覆蓋 |
|
||||
| Schema 前綴語法錯誤 | SQL 執行失敗 | 先在 psql 測試確認語法 |
|
||||
| 效能輕微下降 | 需要字符串格式化 | 影響可忽略 |
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: V1.0
|
||||
- 建立日期: 2026-03-31
|
||||
@@ -1,195 +0,0 @@
|
||||
---
|
||||
document_type: "test_doc"
|
||||
service: "MOMENTRY_CORE"
|
||||
title: "Release 到正式版分析"
|
||||
date: "2026-03-31"
|
||||
version: "V1.0"
|
||||
status: "active"
|
||||
owner: "Warren"
|
||||
created_by: "OpenCode"
|
||||
tags:
|
||||
- "到正式版分析"
|
||||
- "release"
|
||||
ai_query_hints:
|
||||
- "查詢 Release 到正式版分析 的內容"
|
||||
- "Release 到正式版分析 的主要目的是什麼?"
|
||||
- "如何操作或實施 Release 到正式版分析?"
|
||||
---
|
||||
|
||||
# Release 到正式版分析
|
||||
|
||||
| 項目 | 內容 |
|
||||
|------|------|
|
||||
| 建立者 | Warren |
|
||||
| 建立時間 | 2026-03-31 |
|
||||
| 文檔版本 | V1.0 |
|
||||
|
||||
---
|
||||
|
||||
## 當前狀態摘要
|
||||
|
||||
### 已完成的隔離功能
|
||||
|
||||
| 功能 | 狀態 | 說明 |
|
||||
|------|------|------|
|
||||
| Redis 隔離 | ✅ 完成 | `momentry:` vs `momentry_dev:` prefix |
|
||||
| MongoDB 隔離 | ✅ 完成 | `momentry` vs `momentry_dev` database |
|
||||
| Qdrant 隔離 | ✅ 完成 | `momentry_rule1` vs `momentry_dev_rule1` collection |
|
||||
| PostgreSQL Schema 隔離 | 🔶 部分完成 | schema 會在啟動時創建 tables,但運行時有連接池問題 |
|
||||
|
||||
### 代碼變更清單
|
||||
|
||||
| 文件 | 變更 |
|
||||
|------|------|
|
||||
| `.env.development` | 新增 `DATABASE_SCHEMA=dev`, `MONGODB_DATABASE=momentry_dev`, `QDRANT_COLLECTION=momentry_dev_rule1` |
|
||||
| `src/core/config.rs` | 新增 `DATABASE_SCHEMA`, `MONGODB_DATABASE`, `QDRANT_COLLECTION` 靜態配置 |
|
||||
| `src/core/db/postgres_db.rs` | 新增 schema 初始化邏輯(`after_connect` 鉤子)|
|
||||
| `src/core/db/mongodb_db.rs` | 新增 `database` 字段,使用配置 |
|
||||
|
||||
---
|
||||
|
||||
## Release 所需動作
|
||||
|
||||
### 🔴 阻塞問題
|
||||
|
||||
#### 1. PostgreSQL Schema 隔離修復
|
||||
|
||||
**問題**: 運行時查詢使用 `public` schema 而非 `dev` schema
|
||||
|
||||
**狀態**: 🔶 需要修復
|
||||
|
||||
**修復方案**: 採用「明確 Schema 前綴」方案
|
||||
- 預估工作量: 3-4 小時
|
||||
- 影響範圍: ~48 個 SQL 查詢函數
|
||||
|
||||
**詳細計畫**: 參考 `docs_v1.0/TESTING/POSTGRESQL_ISOLATION_FIX_PLAN.md`
|
||||
|
||||
---
|
||||
|
||||
### 🟡 必要動作(Release 前必須完成)
|
||||
|
||||
#### 2. 添加 Production 環境變數到 `.env`
|
||||
|
||||
**當前 `.env` 缺少必要變數**:
|
||||
|
||||
```bash
|
||||
# 建議添加到 .env
|
||||
DATABASE_SCHEMA=public # 明確指定 production 使用 public schema
|
||||
MONGODB_DATABASE=momentry # 明確指定 production 使用 momentry
|
||||
```
|
||||
|
||||
#### 3. 完整測試覆蓋
|
||||
|
||||
| 測試項目 | 狀態 |
|
||||
|----------|------|
|
||||
| PostgreSQL Schema 隔離 | 🔶 需修復後重新測試 |
|
||||
| MongoDB Database 隔離 | ✅ 需重新測試 |
|
||||
| Qdrant Collection 隔離 | ✅ 需重新測試 |
|
||||
| Redis Prefix 隔離 | ✅ 需重新測試 |
|
||||
| API 功能正常 | ✅ 需重新測試 |
|
||||
|
||||
#### 4. Code Review
|
||||
|
||||
- [ ] `cargo clippy --lib` 通過
|
||||
- [ ] `cargo test --lib` 通過
|
||||
- [ ] `cargo fmt -- --check` 通過
|
||||
|
||||
---
|
||||
|
||||
### 🟢 已確認無需動作
|
||||
|
||||
| 項目 | 說明 |
|
||||
|------|------|
|
||||
| PostgreSQL 資料庫 | 無需變更 - 繼續使用 `momentry` 資料庫 |
|
||||
| MongoDB | 無需變更 - 繼續使用 `momentry` database |
|
||||
| Qdrant | 無需變更 - 繼續使用 `momentry_rule1` collection |
|
||||
| Redis | 無需變更 - prefix 已正確配置 |
|
||||
| File System | 無需變更 - output 目錄已正確配置 |
|
||||
|
||||
---
|
||||
|
||||
## Release 檢查清單
|
||||
|
||||
### Release 前檢查
|
||||
|
||||
| # | 項目 | 狀態 | 負責人 |
|
||||
|---|------|------|--------|
|
||||
| 1 | PostgreSQL Schema 隔離修復 | 🔶 TODO | Developer |
|
||||
| 2 | 更新 `.env` 配置 | 🔶 TODO | DevOps |
|
||||
| 3 | 執行完整隔離測試 | 🔶 TODO | QA |
|
||||
| 4 | Code Review (clippy/test/fmt) | ✅ N/A | CI |
|
||||
| 5 | 更新文件版本 | 🔶 TODO | Docs |
|
||||
|
||||
### Release 後驗證
|
||||
|
||||
| # | 項目 | 狀態 |
|
||||
|---|------|------|
|
||||
| 1 | Production Server 啟動正常 | - |
|
||||
| 2 | Playground Server 啟動正常 | - |
|
||||
| 3 | 數據寫入正確 schema | - |
|
||||
| 4 | 兩環境數據完全隔離 | - |
|
||||
|
||||
---
|
||||
|
||||
## 風險評估
|
||||
|
||||
### Release 風險矩陣
|
||||
|
||||
| 風險 | 概率 | 影響 | 等級 | 緩解措施 |
|
||||
|------|------|------|------|----------|
|
||||
| PostgreSQL Schema 隔離失敗 | 高 | 高 | 🔴 | 修復後再 Release |
|
||||
| 向量數據混入 | 低 | 高 | 🟡 | Qdrant 已隔離 |
|
||||
| Redis 數據混入 | 低 | 中 | 🟢 | Prefix 已隔離 |
|
||||
| API 功能異常 | 低 | 高 | 🟡 | 完整測試覆蓋 |
|
||||
|
||||
### 不建議立即 Release 的原因
|
||||
|
||||
1. **PostgreSQL Schema 隔離不完全**: 這是核心問題
|
||||
- 可能導致 Playground 測試數據污染 Production 數據
|
||||
- 違背隔離架構設計目標
|
||||
|
||||
2. **未經完整測試驗證**:
|
||||
- 現有測試有 44% 失敗率
|
||||
- 需要修復後重新測試
|
||||
|
||||
---
|
||||
|
||||
## Release 決策建議
|
||||
|
||||
### 選項 A: 立即 Release(不建議)
|
||||
|
||||
**條件**:
|
||||
- 忽略 Schema 隔離問題
|
||||
- 接受測試失敗
|
||||
|
||||
**風險**:
|
||||
- 數據污染風險
|
||||
- 違背設計目標
|
||||
|
||||
**不建議理由**:
|
||||
- Playground 可能污染 Production 數據
|
||||
|
||||
---
|
||||
|
||||
### 選項 B: 修復後 Release(建議)
|
||||
|
||||
**條件**:
|
||||
- 完成 PostgreSQL Schema 隔離修復
|
||||
- 通過完整測試驗證
|
||||
|
||||
**時間**:
|
||||
- 修復: 3-4 小時
|
||||
- 測試: 1-2 小時
|
||||
- 總計: ~6 小時
|
||||
|
||||
**優點**:
|
||||
- 確保數據隔離正確
|
||||
- 符合設計目標
|
||||
- 測試通過率 100%
|
||||
|
||||
---
|
||||
|
||||
## 版本資訊
|
||||
|
||||
- 版本: V1.0
|
||||
- 建立日期: 2026-03-31
|
||||
@@ -1,104 +0,0 @@
|
||||
# Momentry 搜尋 API 統一與多維度搜尋改善計畫
|
||||
|
||||
> **日期**: 2026-04-17
|
||||
> **發起原因**:
|
||||
> 1. 目前各搜尋 API 回傳的 JSON 結構不一致,缺乏 `start_frame` / `end_frame` 等關鍵定位資訊。
|
||||
> 2. 目前的 Vector Search 僅搜尋 ASR Collection,忽略了 YOLO、Face、Pose 等視覺維度的資料。
|
||||
|
||||
---
|
||||
|
||||
## 1. 問題分析
|
||||
|
||||
### A. JSON 回應不一致
|
||||
| API | 欄位名稱 | 時間精度 | 定位精度 |
|
||||
|-----|----------|----------|----------|
|
||||
| `/api/v1/search` | `uuid`, `chunk_id`, `start_time` | `start_time` | ❌ 無 |
|
||||
| `/api/v1/n8n/search` | `vid`, `id`, `start_time` | `start_time`, `end_time` | ✅ `start_frame`, `end_frame` |
|
||||
| `/api/v1/search/hybrid` | `uuid`, `chunk_id`, `start_time` | `start_time`, `end_time` | ✅ `start_frame`, `end_frame` |
|
||||
|
||||
**改善方向**: 所有 API 應統一回傳 `start_time`, `end_time`, `start_frame`, `end_frame`, `fps`,以確保前端或自動化腳本能精確 Seek。
|
||||
|
||||
### B. 向量搜尋僅限 ASR
|
||||
目前 `/api/v1/search` 使用 `QdrantDb` 進行搜尋,但該 Collection (momentry_rule1) 僅包含語音轉錄 (ASR) 的向量。這導致搜尋「穿紅衣服的人」或「開車的場景」等視覺內容時,結果不理想。
|
||||
|
||||
---
|
||||
|
||||
## 2. 改善目標
|
||||
|
||||
### 目標一:統一搜尋回應結構 (Unified Schema)
|
||||
建立一個標準的 `SearchHit` 結構,供所有 `/search` 系列 API 使用。
|
||||
|
||||
**新標準欄位**:
|
||||
- **id**: Chunk ID
|
||||
- **vid**: Video UUID
|
||||
- **chunk_type**: 類型 (asr, yolo, face, story, etc.)
|
||||
- **start_time / end_time**: 時間 (秒)
|
||||
- **start_frame / end_frame**: 幀號 (精確定準則)
|
||||
- **fps**: 幀率
|
||||
- **text**: 內容文字
|
||||
- **score**: 分數
|
||||
- **file_path**: 影片路徑
|
||||
- **metadata**: 額外資訊 (如 5W1H)
|
||||
|
||||
### 目標二:多維度向量搜尋 (Multi-Modal Vector Search)
|
||||
在 Qdrant 中區分不同類型的 Collection,搜尋時可同時或分層查詢:
|
||||
- `asr`: 語音內容 (已有)
|
||||
- `face`: 臉部特徵 (Face Embedding)
|
||||
- `object`: 物件偵測 (YOLO Embedding)
|
||||
- `scene`: 場景描述 (Scene Classification)
|
||||
|
||||
**搜尋策略**:
|
||||
1. **全域搜尋 (Global Search)**: 同時查詢 `asr`, `face`, `object`, `scene` 四個 Collection。
|
||||
2. **權重融合 (Reranking)**: 將不同 Collection 的結果依據相關性進行合併與重排。
|
||||
|
||||
---
|
||||
|
||||
## 3. 執行計畫
|
||||
|
||||
### Phase 1: 結構統一 (Struct Unification)
|
||||
| 任務 | 說明 |
|
||||
|------|------|
|
||||
| **1.1** | 建立 `UnifiedSearchHit` struct (取代現有的 `SearchResult` 與部分 `N8nSearchHit`) |
|
||||
| **1.2** | 修改 `/api/v1/search` 實作,補齊 `start_frame`, `end_frame`, `fps` 欄位 |
|
||||
| **1.3** | 修改 `/api/v1/search/hybrid` 實作,確保欄位與新結構一致 |
|
||||
| **1.4** | 統一命名規範:`uuid` → `vid`, `chunk_id` → `id` (維持 API 向後相容或明確版本區分) |
|
||||
|
||||
### Phase 2: Qdrant 多維度擴充 (Multi-Modal Qdrant)
|
||||
| 任務 | 說明 |
|
||||
|------|------|
|
||||
| **2.1** | 修改 `QdrantDb`,支援動態 Collection 參數或同時搜尋多個 Collection |
|
||||
| **2.2** | 確認 `face`, `object`, `scene` 等 Collection 的向量維度是否一致 |
|
||||
| **2.3** | 實作 `/api/v1/search/multimodal` 或擴充現有 `/api/v1/search` 支援多 Collection 搜尋 |
|
||||
| **2.4** | 在 `search_bm25` 中補強視覺資料搜尋 (如物件標籤的關鍵字匹配) |
|
||||
|
||||
### Phase 3: 智慧路由 (Smart Routing)
|
||||
| 任務 | 說明 |
|
||||
|------|------|
|
||||
| **3.1** | 開發 `/api/v1/search/smart`:自動判斷 Query 是屬於語意、視覺或混合意圖 |
|
||||
| **3.2** | 根據意圖自動選擇最佳的 Collection 組合 (ASR-only 或 ASR+Face+Object) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 預期效益
|
||||
|
||||
1. **開發者體驗提升**: 只需處理一套 JSON 格式,降低串接成本。
|
||||
2. **影片定位精確化**: `start_frame` / `end_frame` 成為所有搜尋的標準配置,減少前端計算誤差。
|
||||
3. **搜尋準確度躍升**: 解決「只聽不看」的盲點,真正實現多模態 RAG (Retrieval-Augmented Generation)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 風險評估
|
||||
|
||||
| 風險 | 影響 | 應對策略 |
|
||||
|------|------|----------|
|
||||
| Qdrant Collection 維度不一致 | 無法合併搜尋 | 檢查並重新 Embedding 以確保維度統一 (如 768 dim) |
|
||||
| API 欄位更名導致前端失效 | 前端崩潰 | 保留舊欄位為 Deprecated,於 V2 API 中移除 |
|
||||
| 多 Collection 搜尋效能下降 | 延遲增加 | 使用非同步平行查詢 (`tokio::join!`) |
|
||||
|
||||
---
|
||||
|
||||
## 6. 版本歷史
|
||||
|
||||
| 版本 | 日期 | 內容 |
|
||||
|------|------|------|
|
||||
| V1.0 | 2026-04-17 | 建立初步改善計畫 |
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user