PRD.md 14 KB

find_agent 产品需求文档(PRD)

文档版本:v1.2

基线日期:2026-07-28

Agent 定位:老年受众高潜抖音视频发现 Agent

1. 文档目的与边界

本文只描述 find_agent 本身:

  • 当前职责、输入、输出和能力;
  • 当前使用的工具、判断规则和运行约束;
  • 当前存在的问题及需要优化的点。

本文不描述 SupplyAgent 的整体业务流程,不涉及需求分级、日批调度、跨 Agent 协作、 下游生产发布、业务里程碑或平台级建设。

当前实现依据:

2. Agent 定位

find_agent 根据一条明确的内容需求,从抖音候选中寻找同时满足以下条件的视频:

  1. 与需求真实意图相关;
  2. 有证据支持其受众偏向较高年龄段;
  3. 具备可解释的分享价值。

Agent 对搜索词生成、候选补证、评分解释和最终分池负责。它不生产或改写视频,也不负责 需求优先级、任务调度、内容发布及其他 Agent 的行为。

当前版本明确不使用视频画面、语音、字幕或多模态理解。相关性与分享动机仅依据标题、 描述、话题、详情文本、互动数据和受众画像判断。

3. 输入与输出

3.1 输入

字段 必需性 含义
demand_word 必需 本次找片的需求词和意图边界
seed_video_title 可选 已知相关视频标题,用于消除需求歧义
relevant_points 可选 参考视频中与需求相关的灵感、目的或关键点
reference_videos 可选 多个参考视频及各自相关点
run_id 可选 已创建的发现运行标识;存在时必须复用

输入信息不足时,Agent 可以继续搜索,但必须降低意图判断的置信度,不能用模型常识补全 未提供的业务要求。

3.2 输出

Agent 最终输出以下内容:

  1. 一句话需求意图理解;
  2. primary 主推荐;
  3. rejected 淘汰候选及淘汰原因;
  4. Agent 实际执行的搜索记录;
  5. 缺失数据、画像冲突、未继续搜索项和接口错误。

每条主推荐至少包含:

  • 标题、作者、抖音页面链接和 aweme_id
  • 命中的需求点及相关性证据;
  • 原始分享数及可计算的分享效率;
  • 视频点赞用户年龄画像;
  • 作者粉丝年龄画像;
  • 分享动机;
  • R / E / S / V 整数分、置信度和主要限制。

最终分池只允许 primary / rejectedpending_evaluation 仅是处理中的临时状态,不得 出现在最终结果中。

4. 当前能力

4.1 需求理解与搜索规划

  • 综合需求词、参考标题和相关点解释真实意图;
  • 默认生成 2~3 个语义不同的根搜索词;
  • 搜索词不要求逐字复用 demand_word
  • 可根据高潜候选的话题、标题实体、作者和分页状态继续扩展;
  • 以新增有效候选和潜在信息价值决定是否继续搜索。

4.2 候选召回

  • 支持内部抖音关键词搜索;
  • 支持 TikHub 独立搜索和分页;
  • 支持按作者扩展最热或最新作品;
  • 不同搜索词、页面和来源的候选按 aweme_id 去重;
  • TikHub 不可用时可退回内部搜索,并保留错误原因;
  • 每次搜索结果均可保存查询词、形成原因、分页状态和父搜索信息。

4.3 候选证据补全

  • 批量获取视频详情,核验标题、作者、话题、链接和互动数据;
  • 获取视频点赞用户画像;
  • 获取作者粉丝年龄画像;
  • 标准化不同年龄桶表达;
  • 记录画像缺失、接口失败及视频画像与作者画像冲突;
  • 先使用搜索结果进行低成本预筛,再为高潜候选补充详情和画像。

当前没有以下证据:

  • 视频真实转发用户年龄画像;
  • 分年龄曝光、播放、完播和观看时长;
  • 视频画面、语音或字幕理解结果;
  • 同题材、相近发布时间下的标准化传播基线。

4.4 评分与分池

Agent 对每个候选独立判断:

  • R:需求相关性;
  • E:老年受众倾向;
  • S:分享价值。

综合价值为:

V = 100 × R^0.40 × E^0.35 × S^0.25

V 用于保持排序一致,不替代证据判断。只有 R / E / S 三项均成立的候选才能进入 primary;任一项不成立时进入 rejected

当前分池由模型根据提示词和证据作出,保存工具只保存结果,不重新计算分数或改变分池。

4.5 状态保存与完成控制

  • 创建或复用 run_id
  • 保存每个搜索页和去重后的候选;
  • 批量保存候选证据、评分、理由和分池;
  • 查询已保存的搜索与候选状态;
  • 通过数据库审计检查搜索、证据、评估和最终状态;
  • completion guard 强制最后阶段满足:

搜索页已保存 → 证据已获取 → 评估已保存 → 审计通过 → 查询最终状态 → 输出报告

最终报告只读取数据库最终状态,不通过文字反向修改候选分池。报告中的主推荐和淘汰 候选必须与数据库状态一致。

当 Agent 结合任务上下文、替代方案和工具反馈判断任务已经无法继续时,应停止无效重试, 输出以 任务未完成(工具故障) 开头的失败摘要。完成守卫只识别该声明,不解析工具 返回结构或错误文案,也不替 Agent 判断错误是否可恢复。

5. 当前判断规则

5.1 需求相关性是准入条件

  • 搜索词命中不等于内容相关;
  • 高分享或受众偏老不能弥补低相关;
  • 参考标题和相关点用于理解意图,不要求候选逐字匹配。

5.2 年龄证据按强度使用

证据优先级为:

  1. 视频点赞用户年龄画像;
  2. 作者粉丝年龄画像;
  3. 标题、描述、话题和详情文本体现的内容适配特征;
  4. 题材、人物或作者形象带来的直觉。

第 4 类不能单独支持老年倾向。视频画像与作者画像冲突时,以视频画像为主并降低置信度。 明确覆盖 50 岁及以上的年龄桶才属于直接老年信号;只有 40 岁以上数据时,只能表述为 成熟人群代理信号。

5.3 分享证据与年龄证据不能互相替代

  • share_count 说明传播规模,不说明分享者年龄;
  • 点赞用户或作者粉丝年龄画像说明受众倾向,不说明已经发生转发;
  • 当前只能推断“老年人可能愿意分享”,不能声称已观察到老年分享者;
  • 分享价值同时参考分享规模、分享效率和内容动机。

5.4 缺失不是负证据

  • 数据缺失或接口失败应标记为未知;
  • 未知会降低置信度,但不自动计为零分;
  • 强反证优先于多个弱正向线索;
  • 不得为了达到推荐数量而降低准入标准。

5.5 推荐集合需要新增价值

  • 高度重复的视频只保留证据更强的一条;
  • 价值接近时优先覆盖不同需求点和分享动机;
  • 合理搜索后允许少于 5 条或返回空结果。

6. 当前工具

工具 当前用途 关键限制
douyin_search 内部关键词召回 搜索结果不是最终事实
douyin_search_tikhub TikHub 搜索与分页 翻页必须复用供应方分页参数
douyin_user_videos 扩展作者作品 作品仍需逐条补证和判断
douyin_detail 批量核验视频详情 单次最多 8 条
get_content_fans_portrait 获取单条视频点赞用户画像 不是分享用户画像
get_account_fans_portrait 获取作者粉丝画像 只代表账号受众先验
batch_fetch_portraits 批量获取视频和作者画像 单次最多 8 条
normalize_age_portraits 标准化年龄桶 不负责业务评分
create_video_discovery_run 创建或复用运行状态 传入 run_id 时必须复用
record_video_search_page 保存搜索页并合并候选 每次搜索后均需调用
batch_save_video_candidate_evaluations 保存证据、评分和分池 只接受 primary / rejected
audit_video_discovery_run 审计 Agent 最终状态 can_finish=true 才能完成
query_video_discovery_state 恢复或读取最终状态 最终查询必须晚于成功审计

qwen_video_analyze 未注册,不属于当前 Agent 能力。

7. 当前运行约束

项目 当前设置
模型 固定为 google/gemini-3-flash-preview
最大迭代轮次 60
温度 0.2
搜索工具预算 10 次
详情工具预算 2 次
画像工具预算 3 次
候选保存预算 6 次
审计预算 4 次
状态查询预算 8 次
单批详情/画像候选数 最多 8 条

create_find_agent(..., model=...)run_find_agent(..., model=...) 虽然暴露了模型参数, 当前工厂仍固定使用上述模型,传入参数不会生效。

8. 当前实现评价

能力 状态 当前判断
需求理解 可用 能结合需求词、参考标题和相关点形成搜索假设
多源搜索 可用 内部搜索、TikHub 和作者作品均已注册
候选去重 可用 支持跨词、跨页和跨来源按 aweme_id 合并
详情与画像 可用但有缺口 支持详情、双侧画像和年龄标准化,画像可能缺失
内容理解 受限 仅使用文本、互动和画像,不使用视频理解
评分与分池 部分可用 规则完整,但主要依赖模型遵守长提示词
状态保存 可用 可保存运行、搜索页和候选状态
完成审计 已接入 可校验完成顺序、审计新鲜度和报告分池
故障终止 已接入 Agent 明确声明工具故障时允许失败结束
最终一致性 部分可用 报告只读并接受校验,尚无单一事务性最终化入口
运行恢复 部分可用 能查询旧状态,但缺少执行代次和自动恢复机制
可观测性 不完整 有日志和基础计数,缺少 Agent 级质量与成本指标

9. 需要优化的点

9.1 P0:提高 Agent 的确定性与一致性

  1. 增加事务性最终化

    • 新增单一 finalize_video_discovery_run 能力;
    • 仅允许最终化当前运行已召回且已评估的候选;
    • 在一个事务内校验并写入候选分池、计数、完成状态和最终摘要;
    • 最终化失败必须显式返回错误并支持安全重试。
  2. 将关键约束从长提示词下沉到程序

    • 用结构化节点控制搜索、补证、评估、审计和最终输出;
    • 对必需证据、合法状态和工具调用顺序做程序校验;
    • 保留 LLM 对意图、搜索词、语义相关性和解释的判断空间。
  3. 结构化模型输出

    • 为搜索计划、候选评估和最终结果定义 JSON Schema;
    • 校验 R / E / S 取值、必填证据、置信度和分池;
    • 由程序计算 V,避免模型计算漂移;
    • 禁止模型输出未召回的候选 ID。
  4. 修复模型配置

    • 让显式传入的 model 参数真正生效;
    • 保存实际使用的模型、Prompt 和评分策略版本;
    • 避免固定依赖预览模型。
  5. 补齐 Agent 契约测试

    • 覆盖未保存搜索页、证据晚于评估、审计失败、旧状态查询和报告分池不一致;
    • 覆盖幻觉候选 ID、非法分池、缺失证据和工具预算耗尽;
    • 用固定样例验证相关性闸门、年龄证据层级和未知数据处理。

9.2 P1:提高搜索与判断质量

  1. 优化搜索前沿选择

    • 结构化记录每个搜索假设的预期价值、实际新增候选和耗时;
    • 根据边际新增率决定翻页、标签扩展和作者扩展;
    • 减少同义词重复搜索及低价值工具调用。
  2. 优化候选预筛与补证

    • 将低成本预筛规则结构化;
    • 优先为可能改变分池的候选补充详情和画像;
    • 对重复详情和画像增加短期缓存;
    • 记录每项缺失证据对置信度的具体影响。
  3. 建立评分评测集

    • 建立覆盖不同题材的人工标注样例;
    • 分别评估 R / E / S,避免只看最终分池;
    • 统计 primary / rejected 混淆情况;
    • 按模型、Prompt 和策略版本回放对比。
  4. 增强 Agent 可观测性

    • 记录搜索新增率、候选漏斗、证据缺失率、工具失败率和单次调用成本;
    • 区分模型判断失败、外部接口失败、持久化失败和完成校验失败;
    • 输出本次使用的模型、Prompt、策略和数据源版本。
  5. 改进运行恢复

    • 为同一 run_id 增加执行代次;
    • 恢复时明确区分已完成步骤、可复用证据和需要重试的失败项;
    • 避免新一轮执行混用已过期的搜索或候选判断。

9.3 P2:升级 Agent 可用证据

  1. 接入真实转发用户年龄分布和样本量;
  2. 接入分年龄曝光、有效播放、完播率和观看时长;
  3. 建立同题材、同发布时间窗口的传播基线;
  4. 增加评论中的提醒、家庭沟通、收藏和求链接等结构化意图信号;
  5. 在获得明确授权和完整验证前,继续保持“不使用视频理解”的能力边界;
  6. 将新证据的计算规则、置信度上限和冲突处理策略版本化。

10. Agent 验收标准

一次 find_agent 运行满足以下条件,才视为 Agent 自身完成:

  1. 已创建或复用唯一 run_id
  2. 实际调用的搜索页均已保存;
  3. 候选已按 aweme_id 去重;
  4. 主推荐已尝试获取详情和双侧年龄画像;
  5. 年龄画像已标准化,缺失和冲突已披露;
  6. 每个已评估候选具有合法分池及对应理由;
  7. 最终不存在 pending_evaluation 或其他非法分池;
  8. 数据库审计返回 can_finish=true
  9. 审计后已重新查询最终状态;
  10. 最终报告与数据库 primary / rejected 完全一致;
  11. 不使用未注册的视频理解能力或编造缺失证据;
  12. 推荐不足 5 条时不降低质量标准。

若工具故障导致任务无法继续,则不适用上述成功条件,但必须满足:

  1. Agent 已根据上下文判断继续调用无法产生有效进展;
  2. Agent 已停止重复调用失败工具;
  3. 最终摘要明确标记 任务未完成(工具故障)
  4. 摘要包含失败工具、原始错误、已完成内容和未完成内容;
  5. 不输出看似有效的推荐结果。