# 脚本元素提取Agent - 流程文档

## 概述

从视频内容中提取核心实质点（元素 + 概念）的8步流程，每步独立调用LLM。

**系统提示词**：
```
你是实质点提取专家，擅长从视频内容中识别和提取核心实质点（元素 + 概念）。

# 核心能力
1. 判断视频倾向：判断概念和元素谁更重要
2. 实质点识别：区分元素（具体实体）和概念（抽象名词）
3. 共性定量分析：定量分析实质点在段落中的出现情况（基础数据）
4. 多维度支撑性评分：评估对灵感点、目的点、关键点、段落的支撑（基于共性数据）
5. 分类整合：为实质点添加分类标签，确保同级正交

# 工作原则
- 名词化：所有实质点必须是名词形式
- 定量化：所有评分必须有客观依据和定量指标
- 同类去重：概念与概念去重，元素与元素去重，不做跨类型去重
- 结构化：使用方括号标记分类，确保同级正交
```

---

## Step 1: 判断视频倾向

**目标**：判断对于这个视频来说，概念更重要还是元素更重要

**Prompt**：
```
# 视频内容

{video_content}

# 选题描述

{topic_text}

# 任务

判断对于**这个视频**来说，**概念更重要**还是**元素更重要**。

## 定义

### 概念（Concept）
- 抽象的名词，不能是形式的

### 元素（Element）
- 具体的、客观存在的实体，视觉可见

## 判断标准

### 概念更重要
视频的核心价值在于**抽象的方法论、流程、原理**：
- 强调过程和方法
- 强调原理和知识传递
- 强调教学、指导、分享经验

### 元素更重要
视频的核心价值在于**具体的物品、实物展示**：
- 强调物品本身
- 强调视觉呈现和展示
- 强调具体实物的特征

## 判断流程

1. **分析视频核心价值**：这个视频的核心价值是什么？
2. **识别主要内容类型**：是方法论/流程/原理，还是物品/实物展示？
3. **评估抽象 vs 具体的比重**：哪个占主导地位？
4. **做出判断**：概念更重要 or 元素更重要

## 输出要求

- 必须明确给出判断结果
- 必须给出充分的理由
- 必须引用视频内容作为证据

# 输出（JSON）

{
  "判断结果": "概念更重要/元素更重要",
  "核心价值": "这个视频的核心价值是什么",
  "主要内容类型": "方法论/流程/原理/物品展示/实物介绍等",
  "抽象vs具体比重": "抽象内容占X%，具体内容占Y%（估算）",
  "判断理由": "为什么做出这个判断（引用视频内容作为证据）",
  "支撑证据": ["证据1：具体引用", "证据2：具体引用"]
}
```

---

## Step 2: 主视角提取

**目标**：从更重要的视角提取（概念 or 元素）

**Prompt**：
```
# 视频内容

{video_content}

# 选题描述（仅供参考理解视频方向）

{topic_text}

**重要约束**：选题描述仅用于帮助你理解视频的主题方向和定位，**不要从选题描述中提取实质点**。所有实质点必须从**视频实际内容**中提取。

# 视频倾向判断

{tendency_result.get("判断理由", "")}

# 任务

从**{primary_type}视角**提取视频中的核心**{primary_type}**。

## {primary_type}定义

### 概念（Concept）
**定义**：抽象的名词，不能是形式的

**特征**：
- ✅ 必须是名词
- ✅ 抽象的，非具象的
- ✅ 不能是形式的（不是风格、颜色、材质等形式特征）
- ✅ 虽然没有直接提到，但隐含在内容中
- ✅ 对理解视频核心价值至关重要

**原子名词约束**：
- ❌ 禁止形容词
- ❌ 禁止动词
- ✅ 只能是纯粹的名词形式

### 元素（Element）
**定义**：具体的、客观存在的实体，视觉可见

**特征**：
- ✅ 必须是名词
- ✅ 具体的物体，视觉可见
- ✅ 客观存在的实体
- ✅ 使用原子名词（最基础的名词形式，去除修饰语）
- ❌ 不是动作、状态、情绪
- ❌ 不是抽象概念

## 提取原则

1. **全面识别**：宁可多识别，后续会筛选
2. **名词化**：所有{primary_type}必须是名词形式
3. **原子化**：使用最基础的名词,去除修饰语
4. **聚焦主视角**：只提取{primary_type}，不提取另一种类型
5. **仅从视频内容提取**：只从视频中提取，**禁止从选题描述中提取**

## 输出要求

每个{primary_type}需要标注：
- 名称：原子名词
- 识别依据：为什么识别这个{primary_type}（简要说明）

# 输出（JSON）

{
  "实质点列表": [
    {
      "名称": "{primary_type}名称（原子名词）",
      "类型": "{primary_type}",
      "识别依据": "为什么识别这个{primary_type}"
    }
  ]
}
```

---

## Step 3: 辅视角提取

**目标**：从另一个视角提取，并与主视角去重

**Prompt**：
```
# 视频内容

{video_content}

# 选题描述（仅供参考理解视频方向）

{topic_text}

**重要约束**：选题描述仅用于帮助你理解视频的主题方向和定位，**不要从选题描述中提取实质点**。所有实质点必须从**视频实际内容**中提取。

# 主视角已提取的实质点

{primary_text}

# 任务

从**{secondary_type}视角**提取视频中的核心**{secondary_type}**，并与主视角提取的实质点去重。

## {secondary_type}定义

（同Step 2的定义，根据secondary_type选择概念或元素）

## 提取原则

1. **全面识别**：宁可多识别，后续会筛选
2. **名词化**：所有{secondary_type}必须是名词形式
3. **原子化**：使用最基础的名词，去除修饰语
4. **聚焦辅视角**：只提取{secondary_type}，不提取另一种类型
5. **仅从视频内容提取**：只从视频中提取，**禁止从选题描述中提取**

## 去重要求

**关键**：与主视角提取的实质点去重

- 如果{secondary_type}与主视角实质点存在语义关联，不要重复提取
- 只提取主视角中没有覆盖到的{secondary_type}

## 输出要求

每个{secondary_type}需要标注：
- 名称：原子名词
- 识别依据：为什么识别这个{secondary_type}（简要说明）

# 输出（JSON）

{
  "实质点列表": [
    {
      "名称": "{secondary_type}名称（原子名词）",
      "类型": "{secondary_type}",
      "识别依据": "为什么识别这个{secondary_type}"
    }
  ]
}
```

**代码逻辑**：合并主视角和辅视角的实质点列表。

---

## Step 4: 共性定量分析 + 段落支撑评分

**目标**：对所有实质点进行共性定量分析和段落支撑评分

**Prompt**：
```
# 视频内容

{video_content}

# 段落划分结果

{section_text}

段落总数: {total_sections}

# 实质点列表

{substantials_text}

# 任务

对每个实质点进行**共性定量分析 + 段落支撑评分**。

**重要**：只输出新增的分析数据和评分数据，不要重复输出名称、类型、识别依据等已有信息。

## 第一部分：共性分析（元素和概念统一指标）

1. **出现段落数**：该实质点在多少个段落中出现（整数）
2. **段落覆盖率**：出现段落数 / 总段落数（百分比，保留2位小数）
3. **出现频次**：该实质点总共出现多少次（整数）
4. **出现段落列表**：该实质点出现的段落ID列表

**关键约束 - 段落统计规则**：
- **只统计具体段落**（叶子节点），不统计抽象段落（父节点）
- 例如：段落1是段落1.1的父节点，如果元素出现在段落1.1中，只记录段落1.1，不记录段落1
- 判断方法：有子项的段落是抽象段落，没有子项的段落是具体段落
- 段落总数={total_sections}已经是具体段落的总数

**说明**：
- 元素：统计该元素在视频中出现的段落和频次
- 概念：统计该概念在视频中被提及或隐含的段落和频次

## 第二部分：段落支撑评分（每个段落0-10分）

评估该实质点在每个出现的段落中的权重/重要性

**关键约束 - 段落评分规则**：
- **只评估具体段落**（叶子节点），不评估抽象段落（父节点）
- 与第一部分的段落统计保持一致
- 段落ID必须与"出现段落列表"中的ID一致

**评分标准**：
- 9-10分：段落核心元素，不可或缺
- 7-8分：段落重要元素，有明显作用
- 5-6分：段落一般元素，有一定作用
- 3-4分：段落辅助元素，作用较小
- 0-2分：段落边缘元素或未出现

**依据要求**：
- 可以参考共性分析中的段落出现数据
- 必须逐个段落评分（只对出现的段落评分）
- 必须说明在该段落中的具体表现
- 必须提供客观的、直接的证据

## 输出要求

- 定量指标必须准确计算
- 所有评分必须有客观依据
- **只输出名称和对应的分析+评分数据，不要重复已有字段**

# 输出（JSON）

{
  "分析结果": [
    {
      "名称": "实质点名称",
      "出现段落数": 3,
      "段落覆盖率": 0.75,
      "出现频次": 5,
      "出现段落列表": ["段落1", "段落1.1", "段落2.1"],
      "支撑段落详情": [
        {
          "段落ID": "段落1",
          "得分": 8,
          "依据": "在该段落中的具体表现 + 客观证据"
        },
        {
          "段落ID": "段落1.1",
          "得分": 6,
          "依据": "在该段落中的具体表现 + 客观证据"
        }
      ]
    }
  ]
}

**注意**：
- 元素和概念使用统一的分析指标
- **出现段落列表**: 必须使用具体段落ID列表（只包含叶子节点，不包含父节点）
- **支撑段落详情**: 必须使用段落ID字段，包含得分和依据，只对具体段落评分（与"出现段落列表"一致）
- 不要输出类型、识别依据等字段，这些会由代码自动合并
```

**代码逻辑**：将LLM返回的分析数据与原始实质点数据合并。

---

## Step 5: 多维度支撑评分

**目标**：对所有实质点进行3个维度的支撑性评分（并行评估）

### 5.1 支撑灵感点评分

**Prompt**：
```
# 视频内容

{video_content}

# 实质点列表（含共性分析数据和段落支撑评分）

{items_text}

# 灵感点

{inspiration_text}

# 任务

对每个实质点进行**支撑灵感点评分**（0-10分）。

**重要**：只输出实质点名称和灵感点评分，不要输出其他已有信息。

## 评分维度：支撑灵感点（0-10分）

评估该实质点如何支撑灵感点（触发创作者的灵感）

**评分标准**：
- 9-10分：核心支撑，直接触发创作灵感
- 7-8分：重要支撑，对灵感有明显作用
- 5-6分：一定支撑，有一定触发作用
- 3-4分：辅助支撑，间接相关
- 0-2分：弱支撑或无关

**依据要求**：
- 必须引用具体的灵感点
- 必须说明实质点如何支撑该灵感点
- 必须提供客观的、直接的证据（引用视频内容）
- 可以利用共性分析数据和段落支撑评分辅助判断

## 输出要求

- 所有评分必须有客观依据
- 所有依据必须引用视频内容
- **只输出名称和灵感点评分数据**

# 输出（JSON）

{
  "评分结果": [
    {
      "名称": "实质点名称",
      "支撑灵感点得分": 8,
      "支撑灵感点依据": "引用具体灵感点 + 如何支撑 + 客观证据"
    }
  ]
}

**注意**：
- 只输出名称和支撑灵感点的评分数据
- 不要输出类型、识别依据、共性分析、段落支撑等字段
```

### 5.2 支撑目的点评分

**Prompt**：
```
# 视频内容

{video_content}

# 实质点列表（含共性分析数据和段落支撑评分）

{items_text}

# 目的点

{purpose_text}

# 任务

对每个实质点进行**支撑目的点评分**（0-10分）。

**重要**：只输出实质点名称和目的点评分，不要输出其他已有信息。

## 评分维度：支撑目的点（0-10分）

评估该实质点如何支撑目的点（帮助达成创作目的）

**评分标准**：
- 9-10分：核心支撑，直接承载创作目的
- 7-8分：重要支撑，对目的达成有明显作用
- 5-6分：一定支撑，有一定帮助
- 3-4分：辅助支撑，间接相关
- 0-2分：弱支撑或无关

**依据要求**：
- 必须引用具体的目的点
- 必须说明实质点如何支撑该目的点
- 必须提供客观的、直接的证据（引用视频内容）
- 可以利用共性分析数据和段落支撑评分辅助判断

## 输出要求

- 所有评分必须有客观依据
- 所有依据必须引用视频内容
- **只输出名称和目的点评分数据**

# 输出（JSON）

{
  "评分结果": [
    {
      "名称": "实质点名称",
      "支撑目的点得分": 7,
      "支撑目的点依据": "引用具体目的点 + 如何支撑 + 客观证据"
    }
  ]
}

**注意**：
- 只输出名称和支撑目的点的评分数据
- 不要输出类型、识别依据、共性分析、段落支撑等字段
```

### 5.3 支撑关键点评分

**Prompt**：
```
# 视频内容

{video_content}

# 实质点列表（含共性分析数据和段落支撑评分）

{items_text}

# 关键点

{key_text}

# 任务

对每个实质点进行**支撑关键点评分**（0-10分）。

**重要**：只输出实质点名称和关键点评分，不要输出其他已有信息。

## 评分维度：支撑关键点（0-10分）

评估该实质点如何支撑关键点（吸引消费者）

**评分标准**：
- 9-10分：核心支撑，直接吸引消费者
- 7-8分：重要支撑，有明显吸引力
- 5-6分：一定支撑，有一定吸引作用
- 3-4分：辅助支撑，间接相关
- 0-2分：弱支撑或无关

**依据要求**：
- 必须引用具体的关键点
- 必须说明实质点如何支撑该关键点
- 必须提供客观的、直接的证据（引用视频内容）
- 可以利用共性分析数据和段落支撑评分辅助判断

## 输出要求

- 所有评分必须有客观依据
- 所有依据必须引用视频内容
- **只输出名称和关键点评分数据**

# 输出（JSON）

{
  "评分结果": [
    {
      "名称": "实质点名称",
      "支撑关键点得分": 9,
      "支撑关键点依据": "引用具体关键点 + 如何支撑 + 客观证据"
    }
  ]
}

**注意**：
- 只输出名称和支撑关键点的评分数据
- 不要输出类型、识别依据、共性分析、段落支撑等字段
```

**代码逻辑**：并行调用3次LLM，然后将3个维度的评分结果合并到实质点数据中。

---

## Step 6: 筛选

**目标**：基于评分筛选核心实质点

**代码逻辑**：根据以下筛选标准进行代码筛选（不依赖LLM）：

1. **综合得分 > 6.0**：综合得分 = (支撑灵感点得分 + 支撑目的点得分 + 支撑关键点得分 + 平均段落得分) / 4
2. **或任一单项得分 > 8.0**：最高单项得分（灵感点/目的点/关键点/段落）
3. **或共性得分 > 7.0**：共性得分 = (段落覆盖率 × 0.7 + 频次归一化 × 0.3) × 10

满足任意一个条件即通过筛选。

---

## Step 7: 去重（同类去重）

**目标**：对筛选后的实质点进行同类去重（概念与概念，元素与元素）

**Prompt**：
```
# 筛选后的实质点列表

{items_text}

# 任务

对筛选后的实质点进行**同类去重**。

**重要**：只输出去重决策和保留的实质点名称列表，不要输出完整的实质点数据。

## 去重规则

**核心原则**：只进行同类去重，概念与概念去重，元素与元素去重，不做跨类型去重。

### 规则1: 概念 vs 概念
- 如果两个概念语义相似或有包含关系，保留**综合得分更高**的那个

### 规则2: 元素 vs 元素
- 如果两个元素是同一类物体的不同表述，保留**综合得分更高**的那个

**重要约束**：
- ✅ 概念只与概念比较去重
- ✅ 元素只与元素比较去重
- ❌ 概念与元素之间**不进行**去重比较

## 去重流程

1. **分组**：将实质点按类型分为概念组和元素组
2. **概念组内去重**：找出概念组内语义相似的概念，保留得分更高的
3. **元素组内去重**：找出元素组内同类物体，保留得分更高的
4. **合并结果**：将去重后的概念和元素合并

# 输出（JSON）

{
  "去重决策": [
    {
      "冲突组": ["实质点1", "实质点2"],
      "冲突类型": "概念vs概念/元素vs元素",
      "应用规则": "规则1/规则2",
      "保留": "实质点1",
      "去除": ["实质点2"],
      "决策理由": "为什么保留实质点1，去除实质点2"
    }
  ],
  "保留列表": ["实质点名称1", "实质点名称2", ...]
}

**注意**：
- 只输出去重决策和保留的实质点名称
- 不要输出完整的实质点数据（类型、识别依据、评分等）
- 这些完整数据会由代码自动填充
```

**代码逻辑**：根据LLM返回的保留列表，从筛选结果中提取对应的完整实质点数据。

---

## Step 8: 整合

**目标**：为实质点添加分类标签（用字典表示层级关系）

**Prompt**：
```
# 去重后的实质点列表

{items_text}

# 任务

为每个实质点分配分类，分类用字典表示层级关系。

**重要**：只输出实质点名称和对应的分类字典，不要输出完整的实质点数据。

## 分类规则

**核心原则**：分类基于实质点本身的 What 维度（本质属性）

- **What 维度**：回答"这是什么类型的东西"
- **分类来源**：从实质点本身的本质属性中抽象出分类
- **同级正交**：同一分类下的节点应该具有相同的 What 维度

**MECE分类视角**：
- 物理维度：基于物理属性
- 化学维度：基于化学成分
- 生物维度：基于生物分类
- 功能维度：基于客观功能

**禁止**：
- ❌ 从"对其他事物的影响/效果"角度分类
- ❌ 从"目的/价值"角度分类

## 分类层级

- 根据实际情况灵活确定层级深度

## 输出要求

- 同级正交：同一分类下的实质点应该具有相同的 What 维度
- **只输出实质点名称和对应的分类字典**

# 输出（JSON）

{
  "分类结果": [
    {
      "名称": "实质点名称",
      "分类": {"一级": "分类名", "二级": "子分类名"}
    }
  ]
}

**注意**：
- 只输出名称和分类字典
- 分类字典的key必须是"一级"、"二级"、"三级"等
- 不要输出类型、识别依据、评分等字段
- 这些完整数据会由代码自动填充
```

**代码逻辑**：将LLM返回的分类结果合并到去重后的实质点数据中，生成最终的元素列表。

---

## 输出结果

最终返回：
- `元素列表`：包含所有历史数据（名称、类型、识别依据、共性分析、评分、分类等）的实质点列表
- `视频倾向判断`：Step 1的判断结果

