---
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 3 - Composite
description: 父子關係 + frame_objects
version: 1.0
created: 2026-03-28
updated: 2026-03-28
service: MOMENTRY_CORE
topic: chunk_rule
document_type: spec
rule_id: 3
rule_name: Composite
collection: momentry_rule3
confidence_threshold: 0.8
ai_agent_friendly: true
---

# Chunk Rule 3 - Composite

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

---

## 版本歷史

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

---

## 概述

Rule 3 (Composite) 是最完整的 Chunk 向量入庫規則。包含父子層級關係、frame_objects，以及所有可用資訊。

---

## 設計原則

### 輸入

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

### 處理

1. 同 Rule 2：收集 frame_objects (conf > 0.8)
2. 建立父子層級關係
3. 存入完整資訊

### 輸出

- chunk + frame_objects + parent_chunk_id + child_chunk_ids

---

## Collection 定義

### 建立 Collection

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

### Collection 參數

| 參數 | 值 |
|------|-----|
| Name | `momentry_rule3` |
| 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) |
| `parent_chunk_id` | Option<String> | - | 父 Chunk ID |
| `child_chunk_ids` | Vec<String> | - | 子 Chunk IDs |

### JSON 範例

```json
{
  "uuid": "1636719dc31f78ac",
  "chunk_id": "sentence_parent_0001",
  "chunk_type": "sentence",
  "chunk_index": 1,
  "start_frame": 0,
  "end_frame": 2400,
  "fps": 24.0,
  "original_text": "Chapter 1: Introduction to the topic",
  "frame_objects": "person:5, car:2, building:3",
  "parent_chunk_id": null,
  "child_chunk_ids": ["sentence_0001", "sentence_0002", "sentence_0003"]
}
```

### Rust 結構

```rust
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorPayloadRule3 {
    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,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub parent_chunk_id: Option<String>,
    pub child_chunk_ids: Vec<String>,
}
```

---

## 父子層級關係

### 層級結構

```
Parent Chunk (Story/Caption)
    |
    +-- Child Chunk 1 (sentence/cut/time_based)
    |
    +-- Child Chunk 2 (sentence/cut/time_based)
    |
    +-- Child Chunk 3 (sentence/cut/time_based)
```

### chunk_id 命名規範

| 類型 | chunk_id 格式 | 範例 |
|------|--------------|------|
| Parent | `story_XXXX` | `story_0001` |
| Parent | `caption_XXXX` | `caption_0001` |
| Child | `sentence_XXXX` | `sentence_0001` |
| Child | `cut_XXXX` | `cut_0001` |
| Child | `time_based_XXXX` | `time_based_0001` |

### 範例

```json
{
  "chunk_id": "story_0001",
  "chunk_type": "story",
  "parent_chunk_id": null,
  "child_chunk_ids": ["sentence_0001", "sentence_0002", "sentence_0003"]
}
```

---

## frame_objects 生成規則

（同 Rule 2，請參閱 CHUNK_RULE_2_FRAME_OBJECTS.md）

### 處理邏輯

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

### 輸出字串

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

---

## 時間計算

### Frame 轉時間

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

### 範例

```
- fps = 24.0
- start_frame = 0
- end_frame = 2400
- start_time = 0 / 24.0 = 0 秒
- end_time = 2400 / 24.0 = 100 秒
```

---

## 搜尋範例

### 語義搜尋（完整資訊）

```rust
let query_vector = embed_text("找出有人在開車的相關場景").await?;
let results = qdrant.search(
    "momentry_rule3",
    &query_vector,
    10,
    None
).await?;
```

### 父子層級搜尋

```bash
# 搜尋 parent chunk 並取得所有 child chunks
curl -X POST "http://localhost:6333/collections/momentry_rule3/points/search" \
  -H "Content-Type: application/json" \
  -H "api-key: <API_KEY>" \
  -d '{
    "vector": [0.123, -0.456, ...],
    "limit": 10,
    "with_payload": true,
    "filter": {
      "must": [
        {"key": "chunk_type", "match": {"value": "story"}}
      ]
    }
  }'
```

### 根據 Child Chunk 找 Parent

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

---

## 使用場景

| 場景 | 適用 |
|------|------|
| 需要父子層級關係搜尋 | ✅ 最佳 |
| 需要完整資訊（ASR + 物件 + 層級） | ✅ 最佳 |
| 跨層級分析 | ✅ 最佳 |
| 僅 ASR 搜尋 | ❌ 請用 Rule 1 |
| 僅需物件輔助搜尋 | ❌ 請用 Rule 2 |

---

## 優點與限制

### 優點

- 最完整的資訊
- 支援父子層級搜尋
- 可進行跨層級分析

### 限制

- 資料量最大
- 搜尋速度相對較慢
- 實作複雜度最高

---

## 相關文件

| 文件 | 用途 |
|------|------|
| CHUNK_RULES_SPEC.md | 規則總覽 |
| CHUNK_RULE_1_SIMPLE.md | Rule 1 規範 |
| CHUNK_RULE_2_FRAME_OBJECTS.md | Rule 2 規範 |
| CHUNK_SPEC.md | Chunk 基礎規範 |
| CHUNK_DESIGN.md | Chunk 設計架構 |

---

**文件結束**
