文档版本:v1.0
基线日期:2026-07-23
文档状态:基于当前代码整理的产品基线,包含目标态要求
Agent 定位:老年受众高潜抖音视频发现 Agent
本文定义 find_agent 为什么存在、接收什么输入、如何搜索与判断、必须遵守哪些公理、
如何保存过程与输出结果,以及如何验收。
本文以当前代码为事实基线,同时将以下两类内容明确分开:
相关实现入口:
平台已经拥有按需求分级的内容需求、参考视频和需求拓展点,但仍需要从抖音海量内容中 找到真正可以承接需求的视频。
单纯按关键词或分享数排序无法回答三个关键问题:
find_agent 的任务是同时验证这三个问题,并保留完整的搜索、证据、评分和分池过程。
针对一条 S/A 级需求,自动完成:
优先产出至少 5 条质量可靠的保留视频;5 条是探索目标,不是降低准入质量的硬指标。
| 用户/系统 | 需要解决的问题 |
|---|---|
| 内容供给运营 | 针对高优需求快速获得可用视频及推荐理由 |
| 业务分析人员 | 查看某条需求搜过什么、遗漏什么、为何保留或淘汰 |
| SupplyAgent 调度任务 | 批量处理每日 S/A 需求并持久化结果 |
| 下游内容系统 | 消费结构化主推荐和补充推荐 |
| 开发与运维人员 | 定位外部接口、模型、持久化或流程提前结束问题 |
demand_grade_id 或强制重跑某条需求;run_id 查询已执行搜索和候选分池,继续未完成的探索;R / E / S / V 评分、解释与分池;| 概念 | 定义 |
|---|---|
demand_word |
原始需求词,定义意图边界,但不强制成为实际搜索词 |
seed_video_title |
已知相关视频标题,用于消除语义歧义 |
relevant_points |
参考视频中与需求相关的灵感、目的或关键点 |
reference_videos |
同一需求下的全部参考视频及各自点位 |
run_id |
一次找片任务的稳定标识,贯穿所有搜索、候选和结果 |
| 搜索根节点 | 由需求、参考标题、相关点或混合语义形成的独立搜索假设 |
| 搜索扩展节点 | 由翻页、标签或作者形成的子搜索 |
| 候选 | 任一搜索页召回并按 aweme_id 幂等合并的视频 |
| 双侧画像 | 视频点赞用户年龄画像与作者粉丝年龄画像 |
| 主推荐 | 需求相关性、老年倾向、分享价值均有可靠证据的候选 |
| 补充推荐 | 相关性较弱或不成立,但老年倾向和分享价值同时很强的候选 |
| 淘汰候选 | 证据显示不应保留,或补证后仍不能满足任一保留池的候选 |
对候选视频 v,定义三个互相独立的命题:
R(v):需求相关性,取值 0~1;E(v):老年受众倾向,取值 0~1;S(v):分享价值,取值 0~1。主推荐寻找的是联合事件:
G(v) = R(v) ∩ E(v) ∩ S(v)
综合价值使用加权几何关系:
V(v) = 100 × R(v)^0.40 × E(v)^0.35 × S(v)^0.25
V 用于保持候选排序一致,但不替代证据说明,也不应制造虚假精确性。最终报告以整数
展示 R / E / S / V,数据库可保留更高精度。
相关性是主推荐的准入条件,不是普通加分项。
E 与 S 均强,应保留到补充推荐,而不是直接丢弃;demand_word 不是必须原样提交搜索接口的命令。
搜索是可生长、可追踪的探索图,不是一次接口调用。
demand / seed / point / mixed;tag / author / pagination;has_more=true 且本页产生有效新增候选时,下一页是仍存在的信息前沿;parent_search_id,扩展节点应记录父节点。分享证据与年龄证据不能相互替代。
share_count 只说明内容已发生传播;老年倾向证据按以下优先级使用:
第 4 层不能单独形成结论。视频画像与作者画像冲突时,优先视频画像并降低置信度, 不能静默平均。
明确覆盖 50 岁及以上的桶才是直接老年信号;40+ 只能作为成熟人群代理信号。
50- / 50+ / 50岁以上 / >=50 / 41-50 等表达必须先标准化。
分享价值同时考虑规模、效率和动机:
log(1 + share_count) 在同类候选中的相对位置;share_count / play_count;share_count / like_count,并标明其局限;禁止跨不同题材机械比较原始分享数,也不能让低样本高比率候选自动排到最前。
R / E / S 任一维度接近零都会显著压低 V。三个弱证据不能通过简单相加伪装成一个
强结论。
R / E / S 的证据判断;E / S 双强的独立池;一个强反证比多个弱正向线索更重要。
E;推荐集合应提供新增价值。
只有当额外搜索、详情、画像或内容解析可能改变准入、排序或置信度时,才继续调用。
run_id 从数据库恢复,而不依赖单次模型上下文;(run_id, aweme_id) 唯一,同一搜索页重复保存不新增候选;flowchart TD
A["读取业务日 S/A 需求"] --> B["聚合同一需求下全部参考视频与相关点"]
B --> C{"是否已有 running / finished 运行"}
C -->|"是且非强制重跑"| C1["跳过并记录原因"]
C -->|"否或强制重跑"| D["预创建 video_discovery_run"]
D --> E["Agent 复用 run_id 并解释真实需求意图"]
E --> F["生成 2~3 个语义不同的根搜索词"]
F --> G["内部搜索 / TikHub 搜索"]
G --> H["保存搜索页并按 aweme_id 幂等并入候选"]
H --> I["候选状态 pending_evaluation"]
I --> J["按相关性、分享规模/效率、补充潜力廉价预筛"]
J --> K["批量拉取详情,默认最多 8 条"]
K --> L["批量获取视频点赞画像 + 作者粉丝画像"]
L --> M["标准化年龄桶并识别一致、冲突或缺失"]
M --> N["对最可能改变决策的候选做视频内容解析,默认最多 3 条"]
N --> O["计算 R / E / S / V,形成证据理由与置信度"]
O --> P{"分池判断"}
P -->|"三维共同成立"| P1["primary"]
P -->|"E/S 双强但 R 弱"| P2["backup"]
P -->|"不满足保留条件"| P3["rejected"]
P1 --> Q["保存候选证据与分池"]
P2 --> Q
P3 --> Q
Q --> R{"是否仍有高信息价值前沿"}
R -->|"翻页"| G
R -->|"标签扩展"| G
R -->|"作者扩展"| G
R -->|"没有"| S["保存 finished 与停止原因"]
S --> T["查询最终数据库状态"]
T --> U["输出主推荐、补充推荐、淘汰候选、搜索树和缺失数据"]
U --> V["按最终报告再次同步主/补充分池"]
demand_grade;demand_video_expansion;inspiration / purpose / key 三类有效点位;FindDemandContext,而不是一个参考视频形成一条任务。(biz_dt, demand_grade_id) 检查已有运行;running / finished;video_discovery_run;run_id。demand_word、全部参考视频和全部相关点;cursor / search_id / backtrace;search_results;aweme_id 做跨词、跨页、跨供应方幂等合并;pending_evaluation;douyin_detail 核验标题、作者、互动数据、话题、页面链接和播放地址;batch_fetch_portraits(fetch_account_portrait=true) 同时获取双侧画像;R / E / S;V 并给出置信度;primary / backup / rejected;finished;aweme_id,再次同步数据库分池。running ──正常完成──> finished
│
└────异常中止──> failed
同一业务日与 demand_grade_id 只保留一条调度运行身份。--force 允许重新执行。
搜索召回
↓
pending_evaluation
↓ 详情、画像、内容、评分
├── primary
├── backup
└── rejected
pending_evaluation 不能直接作为最终推荐;source_type |
类型 | 父节点规则 |
|---|---|---|
demand |
需求语义根搜索 | 无父节点 |
seed |
参考标题根搜索 | 无父节点 |
point |
相关点根搜索 | 无父节点 |
mixed |
多证据混合根搜索 | 无父节点 |
tag |
标签扩展 | 记录父搜索 |
author |
作者作品扩展 | 记录父搜索 |
pagination |
同一搜索翻页 | 记录父搜索 |
demand_word,参考标题或相关点缺失时应明确降低意图置信度。run_id;run_id;run_id;(biz_dt, demand_grade_id) 和 (run_id, aweme_id) 必须保持唯一;query_reason;pending_evaluation;E 置信度必须受限;R / E / S / V;primary:R / E / S 三个命题均成立;backup:不满足主推荐,但 E / S 同时强,并明确相关性限制;rejected:不满足任一保留池,或强反证足以否定;backup 不得在报告中伪装成主推荐;最终报告必须按以下顺序输出:
每条主推荐或补充推荐必须包含:
aweme_id;share_count;R / E / S / V 整数分;primary;backup;| 工具 | 产品用途 | 关键约束 |
|---|---|---|
douyin_search |
内部关键词召回 | 支持筛选与游标翻页;结果不是最终事实 |
douyin_search_tikhub |
独立 TikHub 召回 | 翻页必须复用 cursor/search_id/backtrace |
douyin_user_videos |
扩展高潜作者作品 | 作者优秀不代表作品自动合格 |
douyin_detail |
批量核验详情与播放地址 | 单次最多 8 条 |
get_content_fans_portrait |
单条视频点赞用户画像 | 不是分享用户画像 |
get_account_fans_portrait |
单条作者粉丝画像 | 只作为账号受众先验 |
batch_fetch_portraits |
批量获取双侧画像 | 单次最多 8 条;正式候选设置作者画像为真 |
normalize_age_portraits |
确定性标准化年龄桶 | 不替代业务评分 |
qwen_video_analyze |
核验真实内容与分享动机 | 默认最多 3 条;不能替代年龄画像 |
create_video_discovery_run |
创建或复用运行 | 调度场景必须复用预创建 run_id |
record_video_search_page |
保存搜索页并合并候选 | 所有搜索页都必须保存 |
batch_save_video_candidate_evaluations |
保存证据、评分和分池 | 原样保存,不重算、不改池 |
query_video_discovery_state |
恢复和检查运行状态 | 可选择是否包含淘汰候选 |
当前共享基础工具还会注册 load_skill,但它不是本 Agent 的核心业务链路。
video_discovery_run一次需求找片运行,保存:
demand_word、参考视频和相关点输入快照;running / finished / failed 状态;video_discovery_search搜索图中的一个具体页面,保存:
video_discovery_candidate一次运行中的一条视频,保存:
R / E / S / V、置信度和各维理由;primary / backup / rejected / pending_evaluation 分池。| 项目 | 默认约束 |
|---|---|
| Agent 最大迭代 | 60 |
| 搜索类工具调用 | 最多 10 次 |
| 详情工具调用 | 最多 2 次,每次最多 8 条 |
| 画像工具调用 | 最多 3 次,每批最多 8 条 |
| 视频内容解析 | 最多 3 次 |
| 候选评估保存 | 最多 6 次 |
| 状态查询 | 最多 8 次,且无状态变化时禁止无意义重复 |
| 根搜索词 | 默认 2~3 个 |
| 生产性首页翻页 | 默认继续 1 页 |
| 正式补证候选 | 默认最多 8 条 |
| 视频解析候选 | 默认最多 3 条 |
| 异常 | 处理要求 |
|---|---|
| TikHub Key 缺失 | 保存错误,切换内部关键词搜索,不重复相同失败调用 |
| 某搜索源失败 | 保留失败页,尝试其他供应方或语义假设 |
| 搜索空页 | 保存空页并关闭对应无效前沿,不伪装为接口失败 |
| 详情部分失败 | 保留成功项和逐条失败原因 |
| 内容画像缺失 | 尝试作者画像,标记 account_only,降低置信度 |
| 双侧画像冲突 | 优先视频画像,显式标注冲突 |
| 视频无播放地址 | 不强制内容解析,保存缺失状态 |
| 视频解析失败 | 保留原始错误,不用模型常识补写内容 |
| 数据库不可用 | 一次失败后转内存流程,最终披露未持久化 |
| Agent 或模型异常 | 运行标记 failed 并保存异常原因 |
| 最终分池同步失败 | 记录错误并将任务视为未完整完成 |
run_id 关联;| 指标 | 定义 |
|---|---|
| 任务完成率 | 成功进入 finished 且输出完整报告的任务占比 |
| 主推荐需求准确率 | 抽检中真正承接需求的主推荐占比 |
| 老年证据有效率 | 保留候选中具有有效视频或作者年龄画像的占比 |
| 分享证据完整率 | 保留候选中同时具有分享规模/效率和内容动机说明的占比 |
| 有效保留数 | 每次运行 primary + backup 数量及分布 |
| 补充池有效率 | 补充候选经业务抽检确认值得保留的占比 |
| 推荐多样性 | 保留结果覆盖的不同需求点和分享动机数量 |
| 指标 | 定义 |
|---|---|
| 搜索页持久化率 | 已调用搜索页中成功保存的占比 |
| 候选证据完整率 | 保留候选完成详情、双画像尝试、年龄标准化和必要内容核验的占比 |
| 最终分池一致率 | 最终报告与数据库分池完全一致的运行占比 |
| 重复候选率 | 去重前重复候选占比,用于观察搜索冗余 |
| 搜索新增效率 | 每个搜索页新增有效候选数 |
| 降级成功率 | 单供应方失败后仍成功完成任务的占比 |
| 平均运行时长 | 从运行创建到最终完成的耗时 |
| 单任务工具成本 | 各类搜索、详情、画像和解析调用次数 |
一次运行满足以下条件才视为产品完成:
run_id;aweme_id 幂等合并;出现以下任一情况,运行不得被判定为稳定完成:
pending_evaluation 直接出现在推荐结果;R / E / S / V、理由、完成标记和分池字段;find_agent_completion_guard 已有实现与测试,但当前 Agent 配置为
completion_guard=None;audit_video_discovery_process 和
audit_video_discovery_run 当前没有注册给 Agent。| 风险 | 影响 | 产品要求 |
|---|---|---|
| 点赞画像不等于转发画像 | “老年人会分享”只能是概率推断 | 报告必须使用谨慎措辞,并优先建设转发画像 |
| 内容画像经常缺失 | E 过度依赖作者先验 |
明确 account_only 和较低置信度 |
| 完成守卫暂停 | 模型可能在流程未闭合时提前结束 | P0 恢复确定性完成约束 |
| 审计工具未注册 | 无法在 Agent 内主动验证流程 | P0 注册并要求结束前审计 |
| 最终文字可反向改池 | 格式错误可能造成数据状态变化 | 同步前做严格校验并保证事务一致性 |
| 最终分池采用增量同步 | 报告中省略的旧候选可能仍留在主/补充池 | 改为一次运行内的原子全量对齐 |
| 外部接口串行限流 | 多词、多候选任务时延较高 | 更强预筛、批量接口和明确 SLA |
| 原始分享数不可跨题材比较 | S 排序可能偏向高曝光题材 |
建设同主题传播基线 |
| TikHub 为可选依赖 | 环境遗漏时搜索覆盖下降 | 配置预检、清晰降级与环境样例补全 |
| 模型行为依赖长提示词 | 规则可能被遗漏 | 将硬性流程约束下沉到确定性代码 |
find_agent_completion_guard;R / E / S 与置信度;find_agent 达到产品化完成状态,需要同时满足: