---
document_type: "architecture_design"
service: "MOMENTRY_CORE"
title: "Momentry Core Chunk Rule 3: 場景聚合級檢索 (Scene Composite Chunk) (v1.0)"
date: "2026-04-21"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "momentry"
  - "core"
  - "rule"
  - "chunk"
ai_query_hints:
  - "查詢 Momentry Core Chunk Rule 3: 場景聚合級檢索 (Scene Composite Chunk) (v1.0) 的內容"
  - "Momentry Core Chunk Rule 3: 場景聚合級檢索 (Scene Composite Chunk) (v1.0) 的主要目的是什麼？"
  - "如何操作或實施 Momentry Core Chunk Rule 3: 場景聚合級檢索 (Scene Composite Chunk) (v1.0)？"
---

# Momentry Core Chunk Rule 3: 場景聚合級檢索 (Scene Composite Chunk) (v1.0)

| 項目 | 內容 |
|------|------|
| 建立者 | OpenCode |
| 建立時間 | 2026-04-21 |
| 文件版本 | V1.0 |

---

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|------|------|------|--------|-----------|
| V1.0 | 2026-04-21 | 定義 Rule 3: 基於 Cut 點的場景級父子聚合結構 | OpenCode | OpenCode / Qwen3.6-Plus |

---

## 0. 設計目標

**Rule 3** 的核心概念是**「場景理解」(Scene Understanding)**。利用 **Cut Processor** 偵測到的鏡頭切換點，將影片劃分為語意完整的場景區塊，並聚合內部的所有句子與視覺資訊。

- **核心原則**: 一個鏡頭/場景 (Cut) = 一個 Parent Chunk。
- **結構**: 採用 **Parent-Child (父子)** 架構。
  - **Parent (Rule 3)**: 代表整個場景，包含摘要 (Summary) 與聚合向量。
  - **Children (Rule 1/2)**: 場景內包含的具體句子與視覺幀。
- **優勢**: 支援跨句子的長語境搜尋 (例如搜尋整個情節的摘要，而非單一單詞)。

---

## 1. 數據源與聚合邏輯

Rule 3 不直接從原始影片產生，而是依賴 **Rule 1** 與 **Rule 2** 的產出。

1. **Cut Processor (Primary)**: 提供場景的邊界。
    - *定義*: `start_frame`, `end_frame` 為一個完整鏡頭。
2. **Rule 1 Chunks (Children)**: 收集該場景內所有的 ASR 語句 (Sentences)。
3. **Rule 2 Chunks (Children)**: 收集該場景內所有的視覺幀數據 (Visual Frames)。
4. **Summary Generation**:
    - 為了讓 Parent Chunk 具備搜尋能力，系統會將所有子 Chunk 的內容 (ASR 文本 + 物件標籤) 組合成一段「場景描述」，並由 LLM (選用) 或規則生成一段 **Summary**。

---

## 2. Chunk 結構定義

### 2.1 資料庫結構 (PostgreSQL)

採用 **Parent-Child** 設計，Rule 3 為 Parent，Rule 1/2 透過 `parent_id` 指向 Rule 3。

```sql
-- Parent Table (Rule 3: Scenes)
CREATE TABLE parent_chunks (
    id UUID PRIMARY KEY,
    asset_uuid UUID NOT NULL,
    chunk_type VARCHAR(20) DEFAULT 'scene',
    
    -- 時間軸 (幀為權威)
    start_frame INT NOT NULL,
    end_frame INT NOT NULL,
    start_time_sec DOUBLE PRECISION,
    end_time_sec DOUBLE PRECISION,
    
    -- 場景內容 (用於向量索引)
    summary TEXT NOT NULL,           -- 場景摘要 (由內部 ASR 聚合而成)
    
    -- 元數據聚合
    faces JSONB,                     -- 場景內所有出現過的人物 ID
    speakers JSONB,                  -- 場景內所有出現過的說話者 ID
    objects JSONB,                   -- 場景內出現過的高信心物件
    
    -- 向量索引
    embedding vector(768),           -- 摘要的向量
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Child Tables (Rule 1/2) 增加 parent_id
-- (需對 chunks_rule1 與 chunks_rule2 執行 ALTER TABLE 增加欄位)
ALTER TABLE chunks_rule1 ADD COLUMN parent_id UUID REFERENCES parent_chunks(id);
ALTER TABLE chunks_rule2 ADD COLUMN parent_id UUID REFERENCES parent_chunks(id);
```

### 2.2 JSON 產出範例 (嵌套結構)

Rule 3 的 API 返回應包含聚合後的子項目。

```json
{
  "chunk_id": "550e...0003",
  "type": "scene",
  "summary": "Peter Joshua 和 Regina 在車上討論關於金錢的危機。畫面顯示兩人在車內，背景為夜間街道。",
  "start_frame": 1000,
  "end_frame": 1500,
  "children": [
    {
      "type": "sentence",
      "content": "我們必須在那之前找到那筆錢。",
      "speaker": "SPEAKER_00",
      "start_frame": 1100,
      "end_frame": 1200
    },
    {
      "type": "visual_frame",
      "content": "car, person, night, street",
      "frame_objects": [ ... ]
    }
  ],
  "metadata": {
    "faces": ["cary_grant", "audrey_hepburn"],
    "speakers": ["SPEAKER_00", "SPEAKER_01"]
  }
}
```

---

## 3. 搜尋能力定義

Rule 3 專為**宏觀理解**與**摘要檢索**設計。

### 3.1 場景摘要搜尋 (Summary Search)
- **場景**: "尋找他們討論分贓的場景" (可能包含多句對話)。
- **邏輯**: 
    1. Query: "Discussion about splitting the money".
    2. Match: 搜尋 `parent_chunks.summary` 的向量。
    3. 結果：直接返回整個場景 (Parent)，而非零碎的句子。

### 3.2 混合檢索 (Hybrid Retrieval)
- **場景**: 使用者搜尋 "槍戰"。
- **策略**:
    1. **Hit**: Rule 2 (Visual) 命中 (偵測到 "gun")。
    2. **Expand**: 系統自動向上查找該 Rule 2 所屬的 Rule 3 Parent。
    3. **Return**: 返回該場面的完整上下文 (包含槍戰前後的對話)。

---

## 4. 處理流程 (Aggregation Pipeline)

Rule 3 是在 Rule 1 與 Rule 2 完成後執行的「後處理」步驟。

### 4.1 演算法邏輯 (Pseudocode)

```python
# 輸入: cuts (List of boundaries), rule1_chunks, rule2_chunks

for cut in cuts:
    scene_start = cut.start_frame
    scene_end = cut.end_frame
    
    # 1. 收集子元素 (Children)
    children_sentences = get_children_in_range(scene_start, scene_end, rule1_chunks)
    children_visuals = get_children_in_range(scene_start, scene_end, rule2_chunks)
    
    # 2. 聚合元數據
    scene_faces = aggregate_unique_ids(children_sentences, "face_ids")
    scene_faces.update(aggregate_unique_ids(children_visuals, "face_ids"))
    
    scene_speakers = aggregate_unique_ids(children_sentences, "speaker_id")
    
    # 3. 生成 Summary
    # 組合所有 ASR 文本
    full_text = " ".join([c.content for c in children_sentences])
    # 組合所有視覺標籤
    visual_context = ", ".join(get_top_objects(children_visuals))
    
    summary = f"[Scene] {full_text}. Visuals: {visual_context}."
    
    # 4. 建立 Parent Chunk
    parent = {
        "start_frame": scene_start,
        "end_frame": scene_end,
        "summary": summary,
        "faces": list(scene_faces),
        "speakers": list(scene_speakers)
    }
    
    # 5. 儲存 Parent，並將子元素關聯到此 Parent ID
    parent_id = store_parent_chunk(parent)
    link_children_to_parent(children_sentences + children_visuals, parent_id)
```

---

## 5. 總結

Rule 3 是 Momentry 檢索架構的**頂層視角**。

| 特性 | 實作方式 |
|------|----------|
| **粒度** | 場景/鏡頭 (Scene/Cut) |
| **資料來源** | Rule 1 (Text) + Rule 2 (Visual) |
| **核心內容** | 場景摘要 (Summary) + 聚合元數據 |
| **向量內容** | 僅對 Summary 進行 Embedding，確保向量代表宏觀語意 |
| **適用場景** | 尋找特定情節、理解長段落上下文、場景過濾 |

透過 Rule 1/2/3 的三層架構，系統能同時滿足**微觀精確檢索** (Rule 1) 與 **宏觀場景理解** (Rule 3) 的需求。
