# find_agent 优化迭代方案

> 文档版本：v3.0  
> 文档状态：待评审  
> 编制日期：2026-07-30  
> 适用范围：`agents/find_agent` 视频搜索、补证、筛选、分池与结果输出  
> 迭代目标：解决本轮寻找视频过程中暴露的时效、时长、内容理解、画像混用和准入规则不明确问题

## 1. 背景

当前 `find_agent` 已具备关键词搜索、详情获取、视频点赞用户画像、作者粉丝画像、年龄
标准化和候选分池能力，但候选是否进入 `primary` 仍主要由 Prompt 驱动，程序没有对关键
条件做强校验。

本轮结果暴露出以下问题：

1. 没有判断内容在当前日期和当前时段是否仍然有效。例如中午仍保留“早上好”内容，
   与当前日期不匹配的节日内容也可能被搜索或推荐。
2. 搜索召回和最终分池没有统一执行最短时长规则，小于 30 秒的视频仍可能保留。
3. 当前明确禁用视频理解，只能依赖标题、描述、标签和互动数据，容易出现标题符合但
   实际视频内容不符合需求的情况。
4. 视频点赞用户画像和账号粉丝画像虽然分别获取，但最终仍被压缩为同一个老年倾向
   判断，结果不够清晰。
5. 年龄判断混入了 40～50 岁代理信号，没有把 `50岁及以上占比` 作为核心准入指标。
6. 分享数、50+ 占比等关键内容指标只有软判断，没有程序级强制门槛。

## 2. 迭代目标

本次迭代将候选判断从“模型综合打分后自由分池”调整为“硬门槛过滤后再综合排序”。

目标结果：

- 与当前日期、节日和时段不一致的内容不能进入主推荐；
- 时长小于 30 秒的视频不能进入主推荐；
- 主推荐视频必须完成一次轻量视频内容核验；
- 视频画像与账号画像独立展示、独立判断，不做静默平均；
- 老年性判断以视频侧 `50岁及以上占比` 为核心；
- 分享数和视频侧 50+ 占比由代码强校验；
- 所有淘汰结果都有明确、可检索的原因码；
- 阈值可以按配置调整，并能通过历史样本回测。

本次不解决：

- 将点赞用户画像等同于真实转发用户画像；
- 预测视频未来一定会爆发；
- 仅凭视频画面中的人物年龄推断观众年龄；
- 用账号整体表现代替单条视频表现。

### 2.1 当前实现差距

| 目标能力 | 当前实现 | 主要差距 |
|---|---|---|
| 发布时间判断 | 搜索参数支持部分时间范围，详情返回字段未完整落候选表 | 无法在最终分池时稳定校验发布日期和语义有效期 |
| 30 秒时长门槛 | TikHub 和作者作品工具支持最短时长参数，但默认值为 0 | 不是全搜索源默认规则，保存 `primary` 时也不复核 |
| 视频理解 | 已有历史千问分析模块，但未注册给 Agent | 无正式调用链、结构化结果和持久化字段 |
| 双侧年龄画像 | 能分别获取视频与账号画像，并生成双侧标准化结果 | 最终仍收敛为一个 `E` 分，没有独立准入结果 |
| 50+ 老年判断 | 标准化逻辑能识别 50+，也保留 40+ 成熟代理信号 | 保存层不校验视频侧 50+ 占比 |
| 分享与画像硬门槛 | Prompt 要求模型综合判断分享和年龄证据 | 候选更新工具不校验阈值、分数或 `primary` 证据完整性 |

## 3. 核心设计原则

### 3.1 先准入，后评分

候选必须依次通过时效、时长、内容指标、视频理解和视频侧老年画像等门槛，才允许计算
综合价值并参与 `primary` 排序。评分不能补偿硬门槛失败。

### 3.2 内容证据与账号先验分离

- 视频画像回答“这条视频实际吸引了谁”，属于内容侧直接证据；
- 账号画像回答“这个账号通常触达谁”，属于账号侧先验；
- 两侧分别输出比例、结论和置信度；
- 不允许把两侧比例相加、平均后再判断；
- 两侧冲突时优先视频画像，并保留 `portrait_conflict` 标记；
- 只有账号画像偏老、视频画像缺失时，不允许进入主推荐。

### 3.3 时间有效性不等于发布时间新

时效判断同时包含：

1. **发布新鲜度**：视频发布距当前时间有多久；
2. **语义有效期**：视频中的日期、节日、问候时段、事件状态在当前是否成立。

一条刚发布的“早上好”视频在中午仍可能失效；一条较早发布但没有时间依赖的常青内容
仍可能有效。因此不能只用发布时间做单一判断。

### 3.4 视频理解不承担年龄画像职责

视频理解用于核验实际主题、关键信息、时间语义、需求相关性和分享动机，不用于推断
观众年龄。老年受众结论必须来自年龄画像。

## 4. 目标流程

```text
运行上下文
  -> 注入当前时间、日期、时区和阈值版本
  -> 按需求生成搜索词与时间类型
  -> 搜索召回
  -> 基础字段完整性检查
  -> 时长硬过滤（>= 30 秒）
  -> 分享数硬过滤
  -> 发布时间与时间语义初筛
  -> 获取详情和可播放地址
  -> 轻量视频理解
  -> 视频点赞用户画像判断
  -> 账号粉丝画像独立判断
  -> 统一质量门禁
  -> 对通过候选计算 R / S / V 并排序
  -> 保存分池、原因码和证据快照
  -> 完成守卫校验
  -> 输出结果
```

模型仍负责搜索策略、语义理解和结果解释；程序负责不可绕过的门槛、字段校验和完成
状态校验。

## 5. 规则设计

### 5.1 时效性规则

#### 5.1.1 运行上下文

每次运行必须向 Agent 和规则引擎提供：

- `current_datetime`：运行开始时间；
- `current_date`：当前业务日期；
- `timezone`：默认 `Asia/Shanghai`；
- `biz_dt`：调度业务日期；
- `rule_version`：本次使用的规则配置版本。

禁止只给 `biz_dt` 而不给当前具体时间。时段内容判断必须使用 `current_datetime`。

#### 5.1.2 时间类型

需求和候选分别标记以下时间类型：

| 类型 | 典型内容 | 默认有效规则 |
|---|---|---|
| `daypart` | 早上好、午安、晚安 | 当前时间必须处于对应时段 |
| `festival` | 春节、端午、中秋、国庆 | 当前日期必须处于该节日前置窗口或节日期间 |
| `event` | 新闻、比赛、政策、突发事件 | 事件仍在发生，或内容仍有明确回顾价值 |
| `seasonal` | 入伏、开学、换季 | 当前日期必须处于对应季节窗口 |
| `evergreen` | 健康常识、家庭技巧、怀旧内容 | 不设统一绝对过期日，但仍检查信息是否失效 |

建议首发时段配置：

| 内容 | 有效时段 |
|---|---|
| 早上好/晨间问候 | 05:00～10:30 |
| 午安/午间问候 | 11:00～14:00 |
| 晚上好/晚安 | 18:00～次日 01:00 |

建议首发节日配置：

- 普通节日内容：节日前 7 天至节日结束；
- 强当天语义内容，如“今天是中秋”：仅节日当天有效；
- 节后复盘、祝福回顾类内容：仅在视频理解明确识别为回顾时放行；
- 不在有效窗口内的节日词，不作为搜索扩展词；偶然召回后直接淘汰。

#### 5.1.3 发布时间策略

搜索时根据时间类型主动使用发布时间过滤：

- `daypart`、突发 `event`：优先“一天内”；
- 普通事件和强时效资讯：优先“一周内”；
- 季节性和阶段性内容：优先“半年内”，再做语义有效性判断；
- `evergreen`：可不限发布时间，但详情阶段必须取得发布时间并检查失效表述。

候选必须保存真实 `publish_at`，并计算 `content_age_hours`、`content_age_days`。若上游搜索
没有发布时间，候选只能处于待补证状态；详情仍无法获取时不得进入 `primary`。

#### 5.1.4 时间判断结果

每条候选输出：

- `temporal_type`；
- `publish_at`；
- `semantic_time_refs`：识别到的日期、节日、时段或事件；
- `temporal_status`：`pass / fail / unknown`；
- `temporal_reason`；
- `valid_from / valid_to`，能够确定时填写。

`fail` 或 `unknown` 均不能进入主推荐。`unknown` 表示证据不足，不应描述为内容错误。

### 5.2 时长规则

- 主推荐视频必须满足 `duration_seconds >= 30`；
- `29.999` 秒按不通过处理，`30.000` 秒按通过处理；
- 搜索接口支持客户端过滤时，统一传 `min_duration_seconds=30`；
- 作者作品扩展同样执行 30 秒过滤；
- 搜索结果没有时长时不得直接保留为正式候选，必须通过详情补齐；
- 详情仍无法获得时长时，标记 `DURATION_UNKNOWN`，不得进入 `primary`；
- 搜索侧过滤只用于节省成本，最终保存时必须再次由代码校验，防止其他搜索源绕过。

### 5.3 轻量视频理解

#### 5.3.1 使用范围

只对通过时长、分享数和初步时效检查的高潜候选执行，默认每个需求最多分析 8 条，降低
模型与视频处理成本。

现有 `qwen_video_analysis.py` 可作为实现基础，但需要从“历史未注册能力”改造成正式
批量工具或确定性服务步骤，并把分析结果写入候选证据。

#### 5.3.2 最小分析内容

视频理解至少返回以下结构化字段：

```json
{
  "content_summary": "视频实际讲了什么",
  "main_topics": ["主题1", "主题2"],
  "spoken_or_visual_time_refs": ["早上好", "2026年春节"],
  "demand_match": "pass|fail|unknown",
  "demand_match_reason": "实际内容与需求的关系",
  "share_motives": ["实用提醒", "情感共鸣"],
  "is_title_content_consistent": true,
  "temporal_risk": "none|daypart|festival|event|seasonal|unknown",
  "risk_flags": [],
  "confidence": 0.0
}
```

实现时可组合关键帧、OCR、ASR/字幕和多模态摘要。首版不要求深度剧情理解，只要求能
识别：

- 标题与实际内容是否一致；
- 视频是否真正回答需求；
- 是否出现“早上好”“今天”“某节日”等强时间表达；
- 是否为纯广告、搬运拼接、无信息量画面；
- 是否具备可解释的分享动机。

#### 5.3.3 分池约束

- `demand_match=fail`：淘汰；
- `demand_match=unknown`：不得进入主推荐；
- `temporal_risk` 命中后，交给时间规则结合当前时间复核；
- 视频理解失败可重试一次；仍失败时标记 `VIDEO_ANALYSIS_UNAVAILABLE`，不得进入
  `primary`；
- 视频理解结果不得生成或修改 50+ 占比。

### 5.4 视频画像规则

视频画像使用“视频点赞用户年龄画像”，单独生成内容侧结论：

- 核心指标：`content_50_plus_ratio`；
- 辅助指标：`content_50_plus_tgi`；
- `40～49` 或 `41～50` 只能记录为成熟人群辅助信息，不计入 50+ 准入占比；
- 画像桶含义必须先标准化，接口中的 `50-` 按已确认的“50岁以上”解析；
- 视频侧画像缺失时，标记 `CONTENT_PORTRAIT_MISSING`，不得由账号画像代替；
- 视频侧 50+ 占比是主推荐的硬门槛。

建议首发配置：

```text
min_content_50_plus_ratio = 0.20
```

即视频侧 50+ 占比至少为 20%。这是首轮试运行阈值，不代表永久业务常量；上线前应使用
近期人工标注样本回测。

### 5.5 账号画像规则

账号画像使用“作者粉丝年龄画像”，单独生成账号侧结论：

- 核心指标：`account_50_plus_ratio`；
- 辅助指标：`account_50_plus_tgi`；
- 输出 `account_portrait_status=pass / fail / missing`；
- 首发参考线可同样配置为 `min_account_50_plus_ratio=0.20`；
- 账号侧 `pass` 只增强置信度，不可使视频侧失败候选通过；
- 账号侧 `fail` 不自动否决视频侧明确通过的单条内容，但必须标记画像冲突；
- 账号侧缺失不等于年轻，只记录证据缺失。

示例：

| 视频侧 50+ | 账号侧 50+ | 结论 |
|---:|---:|---|
| 28% | 35% | 视频通过、账号通过、画像一致 |
| 28% | 8% | 视频通过、账号不通过、画像冲突；仍可继续其他门禁 |
| 缺失 | 55% | 视频证据不足，不得进入主推荐 |
| 12% | 55% | 视频门槛失败，不得由账号画像补偿 |

### 5.6 内容指标强制规则

建议首发配置：

```text
min_duration_seconds = 30
min_share_count = 1000
min_content_50_plus_ratio = 0.20
```

主推荐必须同时满足：

1. `share_count >= min_share_count`；
2. `content_50_plus_ratio >= min_content_50_plus_ratio`；
3. `duration_seconds >= min_duration_seconds`。

分享数使用最新详情数据，不使用搜索页中的旧快照做最终判断。若详情没有分享数，标记
`SHARE_COUNT_UNKNOWN`，不得进入主推荐。

分享效率继续作为排序指标，不代替分享数门槛：

- 有可靠播放数：`share_rate = share_count / play_count`；
- 没有播放数但有点赞数：使用平滑后的 `share_count / like_count` 作为替代指标；
- 分母过小的样本设置最小样本量保护；
- 分享率再高，只要分享数未达到硬门槛，仍不能进入主推荐。

`min_share_count=1000` 是用于阻止低传播规模内容进入主推荐的试运行值。应在上线后
按需求类型、搜索来源和近 7～14 天样本分布校准，但任何配置都必须保留绝对分享数下限。

### 5.7 统一质量门禁

程序新增统一门禁函数，候选只有全部通过才可保存为 `primary`：

| 门禁 | 通过条件 | 失败原因码 |
|---|---|---|
| 字段完整性 | ID、详情、发布时间等关键字段可用 | `REQUIRED_FIELD_MISSING` |
| 时间有效性 | `temporal_status=pass` | `TEMPORAL_EXPIRED` / `TEMPORAL_UNKNOWN` |
| 视频时长 | `duration_seconds >= 30` | `DURATION_TOO_SHORT` / `DURATION_UNKNOWN` |
| 分享规模 | `share_count >= 1000` | `SHARE_COUNT_TOO_LOW` / `SHARE_COUNT_UNKNOWN` |
| 视频理解 | 分析成功且需求匹配 | `CONTENT_MISMATCH` / `VIDEO_ANALYSIS_UNAVAILABLE` |
| 视频侧画像 | 50+ 占比至少 20% | `CONTENT_50_PLUS_TOO_LOW` / `CONTENT_PORTRAIT_MISSING` |
| 相关性 | 满足需求真实意图 | `LOW_RELEVANCE` |

门禁阈值必须从版本化配置读取，表中的 30 秒、1000 次分享和 20% 为首发建议值。

`batch_update_video_discovery_candidates` 保存 `primary` 时必须调用门禁函数。若模型请求
将未通过候选设为 `primary`，程序应拒绝该条更新并返回具体失败字段，不应静默改写。

## 6. 评分与排序调整

硬门槛通过后再计算排序分。建议将原来的老年综合分拆开：

- `R`：需求相关性；
- `C50`：视频侧 50+ 占比归一化得分；
- `S`：分享规模、分享效率和分享动机；
- `Q`：视频理解置信度与内容质量；
- `A50`：账号侧 50+ 先验，只作为小权重增强项。

示例排序公式：

```text
V = R^0.35 × C50^0.30 × S^0.25 × Q^0.10
V_final = V × account_adjustment
account_adjustment ∈ [0.95, 1.05]
```

账号画像最多做小幅调整，不能改变任何硬门槛结果。首版也可以不启用
`account_adjustment`，只展示冲突标记，待回测后再决定。

## 7. 数据与接口改造

### 7.1 候选表新增字段

建议为 `video_discovery_candidate` 增加：

| 字段 | 说明 |
|---|---|
| `publish_at` | 视频真实发布时间 |
| `duration_seconds` | 视频时长，统一使用秒 |
| `evaluated_at` | 本次候选评估时间 |
| `content_age_hours_at_evaluation` | 评估时的视频年龄，避免被误解为实时值 |
| `temporal_type` | 时间类型 |
| `temporal_status` | `pass / fail / unknown` |
| `temporal_evidence_json` | 时间表达、有效窗口和判断理由 |
| `video_analysis_status` | 视频理解执行状态 |
| `video_analysis_json` | 结构化视频理解结果 |
| `video_analysis_version` | 模型、Prompt 和解析版本 |
| `content_50_plus_ratio` | 视频侧 50+ 占比 |
| `content_50_plus_tgi` | 视频侧 50+ TGI |
| `content_portrait_status` | 视频侧画像独立结论 |
| `account_50_plus_ratio` | 账号侧 50+ 占比 |
| `account_50_plus_tgi` | 账号侧 50+ TGI |
| `account_portrait_status` | 账号侧画像独立结论 |
| `portrait_conflict` | 两侧是否冲突 |
| `share_rate` | 分享效率 |
| `gate_status` | `pass / fail / pending` |
| `gate_results_json` | 每项门禁结果和使用阈值 |
| `reject_reason_code` | 主要淘汰原因码 |
| `rule_version` | 评估使用的规则版本 |

可播放地址只需在分析阶段短期使用，避免长期保存可能失效或带鉴权参数的原始地址；持久化
分析结果、输入视频 ID和分析版本即可。

### 7.2 搜索与详情接口

需要补齐：

- TikHub 搜索标准化结果保留视频 `create_time`；
- 所有召回工具统一支持并默认传入 `min_duration_seconds=30`；
- 内部搜索没有时长或发布时间时，候选明确标记为待补证；
- `douyin_detail` 明确保留视频真实发布时间，而不是只保存抓取系统的
  `modify_timestamp/update_timestamp`；
- 详情结果写回候选表，不再只返回给模型；
- 详情写回和最终分池前都执行一次字段单位标准化。

### 7.3 视频理解接口

建议新增批量工具：

```text
batch_analyze_candidate_videos(run_id, candidate_ids, analysis_version)
```

工具内部负责：

1. 按候选 ID 读取详情和临时播放地址；
2. 校验时长、URL 和批量上限；
3. 调用轻量视频理解；
4. 校验结构化输出；
5. 写回分析状态与结果；
6. 返回每条候选的成功、失败和可重试状态。

不建议让 Agent 自由拼接任意视频 URL 调用分析模型，以免分析对象与候选记录不一致。

### 7.4 运行级配置

新增版本化配置示例：

```json
{
  "rule_version": "find-agent-gate-v1",
  "timezone": "Asia/Shanghai",
  "min_duration_seconds": 30,
  "min_share_count": 1000,
  "min_content_50_plus_ratio": 0.2,
  "min_account_50_plus_ratio": 0.2,
  "max_video_analysis_candidates": 8,
  "festival_lead_days": 7
}
```

运行记录保存完整配置快照，防止配置变更后无法解释历史结果。

## 8. Prompt 调整

Prompt 保留搜索策略与语义判断，但删除或改写以下内容：

- 删除“当前流程明确不使用视频理解”；
- 增加当前日期、具体时间和时区的使用要求；
- 明确 30 秒、分享数和视频侧 50+ 占比是程序硬门槛；
- 明确视频理解是主推荐必需证据；
- 将 `E` 拆成视频侧结论和账号侧结论；
- 明确 40～49 岁不计入 50+ 准入占比；
- 明确账号画像不能补偿视频画像缺失或失败；
- 要求最终理由分别陈述视频侧画像、账号侧画像和冲突情况；
- 要求引用时间有效性结论，不能只写“近期发布”。

Prompt 中不再让模型自行决定阈值，也不再让模型手工计算是否通过门禁。工具返回
`gate_results` 后，模型负责解释，不负责改写。

## 9. 完成守卫

当前“存在任意候选即成功”的判定过弱。本次同步调整为：

运行标记 `finished` 前必须满足：

- 所有需要最终判断的候选均不再是 `pending_evaluation`；
- 每条 `primary` 均通过统一质量门禁；
- 每条 `primary` 都有详情、时效判断、视频理解和视频侧画像证据；
- `primary_count` 与数据库实际数量一致；
- 没有主推荐也可以正常完成，但必须保存“无候选通过硬门槛”的停止原因；
- 数据库写入或门禁执行失败时不得标记 `finished`。

## 10. 实施拆分

### P0：基础硬门槛

- 补齐发布时间、时长和分享数持久化；
- 所有搜索源统一 30 秒过滤；
- 增加时间上下文和基础时效规则；
- 拆分视频画像与账号画像字段及结论；
- 增加视频侧 50+ 占比、分享数硬门槛；
- 在候选保存层增加统一门禁；
- 增加原因码与规则配置快照；
- 更新 Prompt 和完成守卫。

交付标准：短于 30 秒、分享数不足、视频侧 50+ 不足、时间失效的候选无法被保存为
`primary`。

### P1：轻量视频理解

- 将现有千问视频分析能力正式接入；
- 定义结构化输出协议；
- 增加批量分析工具、结果持久化和失败策略；
- 将内容匹配和时间语义结果接入统一门禁；
- 增加分析版本与成本监控。

交付标准：所有 `primary` 均有成功的视频理解记录，标题与实际内容不一致的候选被淘汰。

### P2：阈值校准与运营监控

- 使用近期历史结果建立人工标注集；
- 分析分享数、分享率、50+ 占比阈值对准确率和召回率的影响；
- 按需求类型评估是否需要不同阈值；
- 建立门禁淘汰分布、画像缺失率、分析失败率和主推荐人工通过率看板；
- 根据回测结果发布 `rule_version=v2`，不直接覆盖历史配置。

## 11. 验收用例

| 场景 | 输入 | 期望结果 |
|---|---|---|
| 时段失效 | 当前 12:00，视频内容为“早上好” | `TEMPORAL_EXPIRED`，不得主推荐 |
| 节日失效 | 当前不在中秋窗口，视频为当年中秋祝福 | `TEMPORAL_EXPIRED` |
| 常青内容 | 较早发布但内容无过期信息 | 可继续后续门禁 |
| 发布时间缺失 | 搜索、详情均无真实发布时间 | `TEMPORAL_UNKNOWN` |
| 时长边界失败 | 29.999 秒 | `DURATION_TOO_SHORT` |
| 时长边界通过 | 30.000 秒 | 通过时长门禁 |
| 时长缺失 | 详情仍无法取得时长 | `DURATION_UNKNOWN` |
| 分享数不足 | 分享 999，其他指标均通过 | `SHARE_COUNT_TOO_LOW` |
| 分享数边界 | 分享 1000 | 通过分享数门禁 |
| 视频侧占比不足 | 视频侧 50+ 为 19.9% | `CONTENT_50_PLUS_TOO_LOW` |
| 视频侧占比边界 | 视频侧 50+ 为 20% | 通过视频画像门禁 |
| 仅账号偏老 | 视频画像缺失，账号侧 50+ 为 55% | `CONTENT_PORTRAIT_MISSING` |
| 双侧冲突 | 视频侧 28%，账号侧 8% | 视频通过、账号失败、记录冲突，不做平均 |
| 题文不符 | 标题符合需求，视频理解显示实际为无关广告 | `CONTENT_MISMATCH` |
| 分析失败 | 视频理解重试后仍失败 | `VIDEO_ANALYSIS_UNAVAILABLE` |
| 模型绕过 | 模型请求把门禁失败候选保存为 `primary` | 保存层拒绝并返回失败项 |

## 12. 监控指标

上线后至少监控：

- 搜索召回量；
- 30 秒时长过滤率；
- 时间失效率及其类型分布；
- 分享数门槛淘汰率；
- 视频侧画像缺失率；
- 账号侧画像缺失率；
- 视频侧 50+ 门槛淘汰率；
- 双侧画像冲突率；
- 视频理解成功率、平均耗时和单次成本；
- 标题与内容不一致率；
- 各原因码数量；
- 每个需求最终主推荐数；
- 人工审核通过率；
- 因硬门槛造成的误杀率和漏放率。

## 13. 风险与处理

| 风险 | 影响 | 处理方式 |
|---|---|---|
| 分享数阈值过高 | 新视频和小众优质内容召回下降 | 用标注集回测，阈值配置化 |
| 50+ 画像覆盖率低 | 主推荐数量下降 | 提升画像接口覆盖；不允许账号画像冒充内容画像 |
| 视频理解成本和耗时增加 | 单需求运行时间变长 | 只分析基础门槛后的前 8 条，批量并发并缓存 |
| 视频播放地址失效 | 分析失败 | 详情阶段即时获取，不长期依赖原始地址 |
| 节日历法复杂 | 时间误判 | 使用版本化节日日历，保留人工可配置窗口 |
| 模型输出结构不稳定 | 门禁无法判断 | JSON Schema 校验，失败一次修复重试 |
| 过度依赖固定阈值 | 不同需求类型表现不一致 | 保留绝对底线，分需求类型做二阶段校准 |

## 14. 上线判定

满足以下条件后才进入全量运行：

1. P0、P1 验收用例全部通过；
2. 历史样本回放中不存在硬门槛绕过；
3. 随机抽检能够看到视频画像和账号画像的独立结论；
4. “早上好”和非当前节日等时间失效样本被稳定识别；
5. 人工审核确认主推荐准确率较现状提升；
6. 视频理解失败不会导致运行被误标成功；
7. 规则配置、分析版本和淘汰原因可完整追溯。
