---
document_type: "reference_doc"
service: "MOMENTRY_CORE"
title: "Unknown"
date: "2026-03-28"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "unknown"
ai_query_hints:
  - "查詢 Unknown 的內容"
  - "Unknown 的主要目的是什麼？"
  - "如何操作或實施 Unknown？"
---

---
title: Chunk Rule 2 - Frame Objects
description: 涵蓋 frames，conf > 0.8 的物件加入字串
version: 1.0
created: 2026-03-28
updated: 2026-03-28
service: MOMENTRY_CORE
topic: chunk_rule
document_type: spec
rule_id: 2
rule_name: Frame Objects
collection: momentry_rule2
confidence_threshold: 0.8
ai_agent_friendly: true
---

# Chunk Rule 2 - Frame Objects

| 項目 | 內容 |
|------|------|
| 建立者 | OpenCode |
| 建立時間 | 2026-03-28 |
| 文件版本 | V1.0 |
| Rule ID | 2 |
| Rule 名稱 | Frame Objects |
| Collection | `momentry_rule2` |
| Confidence Threshold | > 0.8 |

---

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 |
|------|------|------|--------|
| V1.0 | 2026-03-28 | 創建 Rule 2 規範 | OpenCode |

---

## 概述

Rule 2 (Frame Objects) 將 chunk 時間範圍內的 frame objects 進行聚合，僅保留 confidence > 0.8 的物件，轉化為文字描述存入 payload。

---

## 設計原則

### 輸入

- pre_chunk（來自 ASR/Cut/TimeBased 的原始分段）
- frames（chunk 時間範圍內的所有 frames）

### 處理

1. 找出 chunk 時間範圍內的所有 frames
2. 收集每個 frame 的物件識別結果（YOLO/Face/Pose）
3. 過濾 confidence > 0.8 的物件
4. 聚合物件名稱和數量

### 輸出

- chunk + frame_objects 字串

---

## Collection 定義

### 建立 Collection

```bash
curl -X PUT "http://localhost:6333/collections/momentry_rule2" \
  -H "Content-Type: application/json" \
  -H "api-key: <API_KEY>" \
  -d '{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    }
  }'
```

### Collection 參數

| 參數 | 值 |
|------|-----|
| Name | `momentry_rule2` |
| Vector Size | 768 |
| Distance | Cosine |
| HNSW | m=16, ef_construct=100 |

---

## Payload 結構

### 欄位定義

| 欄位 | 類型 | 必填 | 說明 |
|------|------|------|------|
| `uuid` | String | ✅ | 影片 UUID (16 字元) |
| `chunk_id` | String | ✅ | Chunk 唯一 ID |
| `chunk_type` | String | ✅ | 類型：sentence/cut/time_based |
| `chunk_index` | u32 | ✅ | Chunk 索引 (從 0 開始) |
| `start_frame` | i64 | ✅ | 開始幀編號 |
| `end_frame` | i64 | ✅ | 結束幀編號 |
| `fps` | f64 | ✅ | 幀率 |
| `original_text` | String | ✅ | 產生 vector 的原始文字 (ASR) |
| `frame_objects` | String | ✅ | 涵蓋 frames 的物件描述 (conf > 0.8) |

### JSON 範例

```json
{
  "uuid": "1636719dc31f78ac",
  "chunk_id": "sentence_0001",
  "chunk_type": "sentence",
  "chunk_index": 1,
  "start_frame": 252,
  "end_frame": 378,
  "fps": 24.0,
  "original_text": "Hello world, this is a test message",
  "frame_objects": "person:3, car:1, dog:2"
}
```

### Rust 結構

```rust
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorPayloadRule2 {
    pub uuid: String,
    pub chunk_id: String,
    pub chunk_type: String,
    pub chunk_index: u32,
    pub start_frame: i64,
    pub end_frame: i64,
    pub fps: f64,
    pub original_text: String,
    pub frame_objects: String,
}
```

---

## frame_objects 生成規則

### 輸入數據（Frame 範例）

```json
// Frame 252
{
  "frame_number": 252,
  "yolo_objects": [
    {"class": "person", "confidence": 0.95, "count": 2},
    {"class": "car", "confidence": 0.85, "count": 1}
  ],
  "face_count": 0,
  "pose_count": 0
}

// Frame 300
{
  "frame_number": 300,
  "yolo_objects": [
    {"class": "person", "confidence": 0.92, "count": 3},
    {"class": "dog", "confidence": 0.88, "count": 2}
  ],
  "face_count": 1,
  "pose_count": 1
}
```

### 處理邏輯

1. **收集所有物件**：person, car, dog, face, pose
2. **過濾 confidence > 0.8**：
   - person: 0.95 ✅, 0.92 ✅ → 保留
   - car: 0.85 ✅ → 保留
   - dog: 0.88 ✅ → 保留
   - (其他低於 0.8 的過濾掉)
3. **聚合數量**：
   - person: max(2, 3) = 3
   - car: 1
   - dog: 2

### 輸出字串

```
"person:3, car:1, dog:2"
```

### 物件類型前綴

| 來源 | 前綴 | 範例 |
|------|------|------|
| YOLO | (class name) | "person:3, car:1" |
| Face | "face:" | "face:2" |
| Pose | "pose:" | "pose:1" |

---

## 時間計算

### Frame 轉時間

```
start_time = start_frame / fps
end_time = end_frame / fps
```

### 範例

```
- fps = 24.0
- start_frame = 252
- end_frame = 378
- start_time = 252 / 24.0 = 10.5 秒
- end_time = 378 / 24.0 = 15.75 秒
```

---

## 搜尋範例

### 語義搜尋（包含物件）

```rust
let query_vector = embed_text("找出有人在開車的片段").await?;
let results = qdrant.search(
    "momentry_rule2",
    &query_vector,
    10,
    None
).await?;
```

### 依賴 Frame Objects Filter

```bash
curl -X POST "http://localhost:6333/collections/momentry_rule2/points/search" \
  -H "Content-Type: application/json" \
  -H "api-key: <API_KEY>" \
  -d '{
    "vector": [0.123, -0.456, ...],
    "limit": 10,
    "with_payload": true,
    "filter": {
      "should": [
        {"key": "frame_objects", "match": {"value": "car"}},
        {"key": "frame_objects", "match": {"value": "person"}}
      ]
    }
  }'
```

---

## 使用場景

| 場景 | 適用 |
|------|------|
| 需要物體辨識結果輔助搜尋 | ✅ 最佳 |
| 根據影片中的物件（人、車、動物）搜尋 | ✅ 最佳 |
| 簡單問答系統 + 物件辨識 | ✅ 最佳 |
| 需要父子層級關係 | ❌ 請用 Rule 3 |

---

## 優點與限制

### 優點

- 結合 ASR + 物件辨識結果
- 可根據物件進行搜尋
- 資料量適中

### 限制

- 無法進行父子層級搜尋
- frame_objects 是聚合後的字串，無法取得詳細位置

---

## 相關文件

| 文件 | 用途 |
|------|------|
| CHUNK_RULES_SPEC.md | 規則總覽 |
| CHUNK_RULE_1_SIMPLE.md | Rule 1 規範 |
| CHUNK_RULE_3_COMPOSITE.md | Rule 3 規範 |
| CHUNK_SPEC.md | Chunk 基礎規範 |

---

**文件結束**
