---
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 1 - Simple
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: 1
rule_name: Simple
collection: momentry_rule1
ai_agent_friendly: true
---

# Chunk Rule 1 - Simple

| 項目 | 內容 |
|------|------|
| 建立者 | OpenCode |
| 建立時間 | 2026-03-28 |
| 文件版本 | V1.0 |
| Rule ID | 1 |
| Rule 名稱 | Simple |
| Collection | `momentry_rule1` |

---

## 版本歷史

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

---

## 概述

Rule 1 (Simple) 是最基本的 Chunk 向量入庫規則。直接將 pre_chunk 轉換為 chunk，不包含父子關係和 frame objects。

---

## 設計原則

### 輸入

- pre_chunk（來自 ASR/Cut/TimeBased 的原始分段）

### 處理

- 直接轉換，無額外處理

### 輸出

- chunk（與 pre_chunk 邊界相同）

---

## Collection 定義

### 建立 Collection

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

### Collection 參數

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

---

## 嵌入模型

### 專用模型
Rule 1 專用 **`nomic-embed-text-v2-moe:latest`** 嵌入模型，提供完整多語言支持：

#### 模型特性
| 特性 | 說明 |
|------|------|
| **模型名稱** | `nomic-embed-text-v2-moe:latest` |
| **模型類型** | Mixture of Experts (MoE) 架構 |
| **向量維度** | 768 維 |
| **多語言支持** | ✅ 完整支持（英語、中文、日語、韓語等） |
| **模型大小** | 475.29 MB |
| **推理速度** | 快速，適合實時應用 |

#### 模型優勢
1. **完整多語言能力**: 原生支持多語言文本嵌入，無需語言檢測
2. **高效能架構**: MoE 架構提供高效推理
3. **統一向量空間**: 所有語言共享相同的 768 維向量空間
4. **Ollama 集成**: 通過標準 Ollama API 直接調用

### 模型配置
```rust
// Rust 代碼中使用
let embedder = Embedder::new("nomic-embed-text-v2-moe:latest".to_string());
let vector = embedder.embed_text("搜索文本").await?;
```

```bash
# 直接調用 Ollama API
curl -X POST "http://localhost:11434/api/embeddings" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nomic-embed-text-v2-moe:latest",
    "prompt": "需要嵌入的文本內容"
  }'
```

### 多語言示例
```rust
// 英語文本
let english_vector = embedder.embed_text("Hello world, this is a test").await?;

// 中文文本  
let chinese_vector = embedder.embed_text("你好世界，這是一個測試").await?;

// 日語文本
let japanese_vector = embedder.embed_text("こんにちは世界、これはテストです").await?;

// 韓語文本
let korean_vector = embedder.embed_text("안녕하세요 세계, 이것은 테스트입니다").await?;
```

---

## 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) |

### 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"
}
```

### Rust 結構

```rust
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorPayloadRule1 {
    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,
}
```

---

## 時間計算

### 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 秒
```

---

## 搜尋範例

### 語義搜尋（使用 nomic-embed-text-v2-moe:latest）

```rust
use crate::core::embedding::comic_embed::Embedder;

// 1. 初始化嵌入器
let embedder = Embedder::new("nomic-embed-text-v2-moe:latest".to_string());

// 2. 生成查詢向量（支持多語言）
let query_text = "找出有人在說話的片段";  // 中文查詢
// let query_text = "Find segments where someone is speaking";  // 英文查詢
// let query_text = "誰かが話しているセグメントを見つける";  // 日文查詢

let query_vector = embedder.embed_query(query_text).await?;

// 3. 在 Qdrant 中搜索
let results = qdrant.search(
    "momentry_rule1",
    &query_vector,
    10,
    None
).await?;

// 4. 處理結果
for result in results {
    println!("Score: {}, Chunk ID: {}", result.score, result.payload["chunk_id"]);
}
```

### 批量嵌入示例

```rust
// 批量嵌入多語言文本
let texts = vec![
    "Hello world, this is English text",
    "你好世界，這是中文文本",
    "こんにちは世界、これは日本語のテキストです",
    "안녕하세요 세계, 이것은 한국어 텍스트입니다"
];

let mut vectors = Vec::new();
for text in texts {
    let vector = embedder.embed_document(text).await?;
    vectors.push(vector);
}

// 批量存入 Qdrant
for (i, vector) in vectors.iter().enumerate() {
    qdrant.upsert(
        "momentry_rule1",
        i as u64,
        vector,
        Some(json!({
            "uuid": "test_uuid",
            "chunk_id": format!("test_{}", i),
            "chunk_type": "sentence",
            "chunk_index": i as u32,
            "original_text": texts[i]
        }))
    ).await?;
}
```

### 依賴 Qdrant Filter

```bash
curl -X POST "http://localhost:6333/collections/momentry_rule1/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": "uuid", "match": {"value": "1636719dc31f78ac"}},
        {"key": "chunk_type", "match": {"value": "sentence"}}
      ]
    }
  }'
```

---

## 使用場景

### 多語言搜索場景
| 場景 | 適用 | 多語言支持 |
|------|------|------------|
| 僅 ASR 文字語義搜尋 | ✅ 最佳 | ✅ 英語、中文、日語等 |
| 簡單問答系統 | ✅ 最佳 | ✅ 跨語言問答 |
| 基礎影片檢索 | ✅ 最佳 | ✅ 多語言檢索 |
| 多語言內容分析 | ✅ 適合 | ✅ 混合語言內容 |
| 跨語言相似度匹配 | ✅ 適合 | ✅ 語言無關嵌入 |
| 需要物體辨識結果 | ❌ 請用 Rule 2/3 | - |
| 需要父子層級關係 | ❌ 請用 Rule 3 | - |

### 多語言示例場景
1. **中文搜索英文內容**: 用戶用中文查詢，找到英文影片片段
2. **跨語言相似內容發現**: 不同語言描述相同概念的內容匹配
3. **混合語言影片處理**: 影片中包含多種語言對話的場景
4. **全球化內容檢索**: 支持多國用戶使用母語搜索

---

## 優點與限制

### 優點

#### 效能優點
- **資料量最小**: 僅包含基本 metadata，儲存效率高
- **搜尋速度最快**: 簡單結構提供最佳搜索性能
- **實作最簡單**: 易於開發和維護

#### 多語言優點
- **原生多語言支持**: 使用 `nomic-embed-text-v2-moe:latest` 模型，無需語言檢測
- **跨語言搜索**: 支持查詢語言與內容語言不同的場景
- **統一向量空間**: 所有語言共享相同的 768 維向量空間
- **語言無關相似度**: 不同語言描述相同概念的內容會被匹配

#### 模型優點
- **高效推理**: MoE 架構提供快速嵌入生成
- **統一維度**: 固定 768 維，與 Qdrant collection 完美匹配
- **Ollama 集成**: 通過標準 API 調用，部署簡單

### 限制

#### 功能限制
- **無法利用物體辨識結果**: 僅基於文本內容，不包含視覺信息
- **無法進行父子層級搜尋**: 不支持層級結構的複雜查詢

#### 模型限制
- **固定向量維度**: 僅支持 768 維向量，無法調整
- **模型依賴**: 依賴 Ollama 服務運行 `nomic-embed-text-v2-moe:latest` 模型
- **多語言精度**: 對於極少數語言可能精度較低

---

## 相關文件

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

---

**文件結束**
