AI Function广告营销多模态素材的检索分析与生成最佳实践

更新时间:
复制 MD 格式

本文介绍基于 StarRocks AI Function 与多模态能力,面向游戏买量素材的生产制作、管理检索、切片拼装、数据驱动优化四大场景,实现批量脚本生成与二创、自动化打标、自然语言检索、素材切片拼装与效果优化的最佳实践。

方案概述

场景介绍

游戏买量团队每天产出与投放大量创意素材(短视频、图片、音频),面临以下痛点:

  • 老游戏素材荒:投放 3 年的老游戏每周仍需产出 40~50 支视频,但美术资源枯竭、创意同质化,靠人力硬产难以为继。

  • 新游批量起量:新游戏需要快速批量生成符合品牌调性的多方向视频脚本,抢占投放窗口。

  • 打标成本高、效果差:人工给素材打标签成本高、覆盖率低,且难以识别视频里的 IP、人物、复合场景等隐含元素。

  • 素材找不到、用不上:沉淀的素材越来越多,靠文件名和目录根本检索不到"想要的那一条"。

  • 切片拼装靠人肉:分镜切段、语义切片、精确到帧的视觉切片,以及按需拼装组合,全靠剪辑师手工。

  • 效果优化拍脑袋:素材投放前后数据分散,难以量化评估、反哺创意。

传统方式主要依赖人工写脚本、人工打标、人工剪辑与目录检索,产能受限、覆盖率低、素材复用难,投放效果也难以量化回流。

在这样的诉求驱动下,基于 StarRocks AI Function 在库内直接调用大模型,用标准 SQL 即可把创意素材的生产、管理、切片、优化全流程数据化——批量脚本一键生成、素材自动打标、自然语言检索、高效切片按需拼装、投放数据驱动迭代。

核心能力

本最佳实践把素材全生命周期建模到 StarRocks,主要用到以下能力:

  • 托管模型 / AI Function:用标准 SQL 直接调用大模型。脚本/分镜/二创生成用 ai_complete,批量多方向生成用"方向表 × 素材"的 CROSS JOIN + ai_complete;素材自动打标用 ai_classify,合规过滤用 ai_filter,IP/人物/复合场景抽取用 ai_extract,多素材聚合二创用 ai_agg

  • 多模态理解与向量化ai_embed_multimodal(url,'image') 把封面/关键帧编码为 2560 维视觉向量,ai_embed(text) 把内容文本编码为 1024 维文本向量,支撑跨模态检索。

  • 向量检索cosine_similarity 实现以文搜素材、以图搜素材及文本+视觉双路混合召回;生产环境可对向量列建 HNSW 索引加速。

  • 结构化 + 非结构化混合分析:向量、标签、切片、投放指标(CTR/CVR/ROI)同库存储,一条 SQL 完成"语义召回 + 标签过滤 + 效果聚合"。

方案优势

  • 量产不缺创意:一条优质素材可批量裂变出多方向脚本,高效切片可重新拼装成新视频,解决老游戏"缺美术还要每周 40~50 支"的产能困境。

  • 素材变成可检索资产:自动打标 + 多模态向量,让海量素材从"只能翻目录"变成"一句话就能找到那一条"。

  • 切片拼装数据化:分镜/语义/视觉帧三级切片建模 + AI 按需拼装,把剪辑师的经验沉淀成可复用、可组合的数据。

  • 数据驱动创意闭环:投放指标反哺选材,形成"回流数据 → 特征聚类 → 优选切片 → 二创拼装 → 再投放"的正循环。

方案流程

创意素材的生产、管理、切片、优化全流程数据化,全部内建到 StarRocks SQL 里,对应本文四大场景群。核心数据链分为六段:

image

  1. 入库:多平台创意素材(短视频、图片、音频)连同投放指标统一入库,支持 StarRocks 内表、Paimon 表等多种格式。

  2. AI 理解:用 ai_classify / ai_filter / ai_extract 自动打标与合规过滤,用 ai_embed / ai_embed_multimodal 生成文本与视觉向量。

  3. 切片建模:对素材做分镜、语义、视觉帧三级切片建模,沉淀为可复用、可组合的数据。

  4. 检索:用自然语言或跨模态查询,通过 cosine_similarity 实现以文搜素材、以图搜素材及双路混合召回。

  5. 拼装二创:用 ai_complete 批量生成多方向脚本与分镜,按需拼装切片组合成新素材。

  6. 投放回流:回流 CTR/CVR/ROI 等投放指标,反哺选材与创意迭代,形成数据驱动的正循环。

说明
  • 原始素材始终留在 OSS,Object Table 只保存元数据和受控的 file 引用。

  • file 交给 AI 函数即可,签名URL 系统自动生成,SQL里不出现 AK/SK。

  • 同一素材靠 object_uri + etag 做增量幂等,重跑不重复烧 token。

方案步骤

步骤 1:建库建表

先为存放在 OSS 的原始素材创建 Object Table。视频、图片、音频等二进制大文件通过 Object Table 映射,仅登记 object_urietagfile 等元数据与引用,原始文件始终留在 OSS,无需搬运。

CREATE DATABASE IF NOT EXISTS game_ai;
USE game_ai;

-- 视频素材:短视频 / 过场 / 录屏(大文件必须走 Object Table)
CREATE OBJECT TABLE obj_videos PROPERTIES (
  "path" = "oss://<BUCKET>/creative/videos",
  "aliyun.oss.endpoint" = "oss-cn-beijing-internal.aliyuncs.com",
  "aliyun.oss.public_endpoint" = "oss-cn-beijing.aliyuncs.com",
  "aliyun.oss.access_key" = "<AK>",
  "aliyun.oss.secret_key" = "<SK>",
  "recursive" = "true",
  "file_pattern" = ".*\\.(mp4|mov|m4v)$"
);

-- 图片素材:原画 / 封面 / 关键帧
CREATE OBJECT TABLE obj_images PROPERTIES (
  "path" = "oss://<BUCKET>/creative/images",
  "aliyun.oss.endpoint" = "oss-cn-beijing-internal.aliyuncs.com",
  "aliyun.oss.public_endpoint" = "oss-cn-beijing.aliyuncs.com",
  "aliyun.oss.access_key" = "<AK>",
  "aliyun.oss.secret_key" = "<SK>",
  "recursive" = "true",
  "file_pattern" = ".*\\.(jpg|jpeg|png|webp)$"
);

-- 音频素材:配音 / 音效 / BGM
CREATE OBJECT TABLE obj_audio PROPERTIES (
  "path" = "oss://<BUCKET>/creative/audio",
  "aliyun.oss.endpoint" = "oss-cn-beijing-internal.aliyuncs.com",
  "aliyun.oss.public_endpoint" = "oss-cn-beijing.aliyuncs.com",
  "aliyun.oss.access_key" = "<AK>",
  "aliyun.oss.secret_key" = "<SK>",
  "recursive" = "true",
  "file_pattern" = ".*\\.(wav|mp3|m4a)$"
);

REFRESH OBJECT TABLE obj_videos;
REFRESH OBJECT TABLE obj_images;
REFRESH OBJECT TABLE obj_audio;

-- 查看已发现的素材清单
SELECT object_uri, size, content_type, last_modified
FROM obj_videos ORDER BY last_modified DESC LIMIT 10;

理解与打标产物落到下面 6 张业务内表。素材主表 game_clip_srccover_urlasr_textocr_text 既可来自现成回流数据,也可以由上面的 Object Table 用 ai_complete 直接产出(视频理解生成场景描述、图片识别生成 OCR、音频转写生成 ASR)。6 张表覆盖素材主表、双向量、打标、切片、二创产出。

-- 【入库 + 投放回流】素材主表(clip_type 区分 scene/clip/frame)
CREATE TABLE IF NOT EXISTS game_clip_src (
    game_id BIGINT NOT NULL, clip_id VARCHAR(64) NOT NULL,
    asset_id VARCHAR(64), clip_type VARCHAR(16), asset_type VARCHAR(16),
    game_name VARCHAR(128), title VARCHAR(256), cover_url VARCHAR(1024),
    object_uri VARCHAR(1024), source_etag VARCHAR(256),   -- 关联 Object Table 的原始文件与版本
    ocr_text VARCHAR(4096), asr_text VARCHAR(8192), scene_desc VARCHAR(4096),
    campaign_id VARCHAR(64), impressions BIGINT, clicks BIGINT, conversions BIGINT,
    cost DECIMAL(12,2), gmv DECIMAL(12,2), updated_at DATETIME
) PRIMARY KEY (game_id, clip_id) DISTRIBUTED BY HASH(game_id, clip_id) BUCKETS 8;

-- 【AI理解·视觉向量 2560】封面/关键帧
CREATE TABLE IF NOT EXISTS clip_visual_emb (
    game_id BIGINT NOT NULL, clip_id VARCHAR(64) NOT NULL, cover_url VARCHAR(1024),
    visual_embedding ARRAY<FLOAT>, embedding_created_at DATETIME
) PRIMARY KEY (game_id, clip_id) DISTRIBUTED BY HASH(game_id, clip_id) BUCKETS 8;

-- 【AI理解·文本向量 1024】OCR+ASR+标题拼接
CREATE TABLE IF NOT EXISTS clip_text_emb (
    game_id BIGINT NOT NULL, clip_id VARCHAR(64) NOT NULL, text_for_embed VARCHAR(16384),
    text_embedding ARRAY<FLOAT>, embedding_created_at DATETIME
) PRIMARY KEY (game_id, clip_id) DISTRIBUTED BY HASH(game_id, clip_id) BUCKETS 8;

-- 【打标结果】品类/画风/情绪/卖点 + 合规 + 元素(IP/人物/复合场景) + 摘要
CREATE TABLE IF NOT EXISTS clip_tags (
    game_id BIGINT NOT NULL, clip_id VARCHAR(64) NOT NULL,
    game_genre VARCHAR(64), art_style VARCHAR(64), emotion VARCHAR(64), selling_point VARCHAR(64),
    risk_level VARCHAR(32), risk_reason VARCHAR(512),
    extracted_elements JSON, clip_summary VARCHAR(2048), tagged_at DATETIME
) PRIMARY KEY (game_id, clip_id) DISTRIBUTED BY HASH(game_id, clip_id) BUCKETS 8;

-- 【切片建模】分镜段/语义切片/视觉帧, 三级切片可复用单元
CREATE TABLE IF NOT EXISTS clip_slice (
    slice_id VARCHAR(64) NOT NULL, parent_clip_id VARCHAR(64), game_name VARCHAR(128),
    slice_type VARCHAR(16),                 -- scene 分镜段 / semantic 语义切片 / frame 视觉帧
    seq INT, time_range VARCHAR(32),
    visual_desc VARCHAR(2048), asr_snippet VARCHAR(2048),
    reusable_tag VARCHAR(128), perf_score DECIMAL(6,2)   -- 来源素材效果分, 用于优选二创
) PRIMARY KEY (slice_id) DISTRIBUTED BY HASH(slice_id) BUCKETS 8;

-- 【拼装二创产出】脚本 + 分镜表
CREATE TABLE IF NOT EXISTS creative_script (
    script_id VARCHAR(64) NOT NULL, game_id BIGINT, theme VARCHAR(256),
    source_clip_ids VARCHAR(1024), script_text VARCHAR(8192), storyboard VARCHAR(8192),
    generated_at DATETIME
) PRIMARY KEY (script_id) DISTRIBUTED BY HASH(script_id) BUCKETS 4;

对于刚建好的三张 Object Table,把 file 交给 ai_complete 即可直接产出 game_clip_src 需要的文本字段:视频理解生成 scene_desc、音频转写生成 asr_text、图片识别生成 ocr_text,并用 object_uri + etag 做增量幂等,无需人工填写。后续四大场景可直接消费这些字段。

-- 视频理解 → 场景描述(示意,落到 game_clip_src 前可先物化到临时表再回填)
SELECT o.object_uri, o.etag,
  ai_complete('qwen3.6-plus', '用一句话概括视频画面内容与分镜要点,用于素材检索', o.file, 'video') AS scene_desc
FROM obj_videos o
LEFT ANTI JOIN game_clip_src s ON o.object_uri = s.object_uri AND o.etag = s.source_etag;

-- 音频转写 → ASR 文本
SELECT o.object_uri, o.etag,
  ai_complete('qwen-omni-turbo', '直接输出音频文字内容,不要解释', o.file, 'audio') AS asr_text
FROM obj_audio o;

-- 图片识别 → OCR 文本
SELECT o.object_uri, o.etag,
  ai_complete('qwen-vl-max', '识别并只输出图片中的文字', o.file, 'image') AS ocr_text
FROM obj_images o
WHERE object_file_is_image(o.file);

步骤 2:素材生产制作

老游戏缺美术却要每周 40~50 支,新游要批量起量——核心是用少量优质素材裂变出大量脚本。

场景 1A:批量多方向脚本生成

一条优质素材 + 一张"创意方向表",用 CROSS JOIN 一次性产出多个方向的脚本,把"每周几十支"变成一条 SQL 的事。注意 CTE 里构造方向表用 UNION ALL,本 build 不支持 VALUES(...) AS t(col) 写法。

WITH mat AS (   -- 汇总某游戏的合规优质素材口播
  SELECT group_concat(CONCAT(s.title,':',s.asr_text) SEPARATOR ' /// ') AS merged
  FROM game_clip_src s JOIN clip_tags t ON s.game_id=t.game_id AND s.clip_id=t.clip_id
  WHERE s.game_id=90001 AND t.risk_level='low'
),
directions AS (   -- 创意方向表(可换成一张维表, 支撑品牌调性批量控制)
  SELECT '剧情向:突出世界观与角色魅力' AS dir
  UNION ALL SELECT '福利向:突出开服登录送SSR'
  UNION ALL SELECT '公平竞技向:突出策略不氪也能赢'
)
SELECT d.dir AS 方向,
  ai_complete(CONCAT('你是游戏买量编导。基于以下同款素材口播(///分隔),按【',d.dir,
    '】方向产出一条25秒竖屏短视频脚本,含开头3秒钩子+卖点+结尾号召,禁极限词和诱导付费,70字内直接输出:\n', m.merged)) AS 脚本
FROM directions d CROSS JOIN mat m;

实测产出(3 个方向,同一素材裂变)

  • 福利向:"开局登录领SSR!《幻塔纪元》今日开服,登录即送暗夜刺客,海量新手福利同步开放,轻松组建阵容。点击左下角,立即上线领取!"

  • 公平竞技向:"【3秒钩子】开服不拼氪金拼脑力!【卖点】登录领SSR刺客,真实攻城演示。全靠策略布阵,不氪金照样上分,主打公平竞技。【结尾】立即下载,用战术赢全场!"

  • 剧情向:"暗影撕裂苍穹,旧世传说等你苏醒。踏入幻塔纪元,暗夜刺客静候缔约。万人策略攻城,以智谋破局公平竞技。即刻前往,执剑重铸王座!"

directions 换成一张品牌调性维表(每行一个方向/受众/情绪),即可批量产出符合品牌调性的几十支脚本,直接解决老游戏产能与新游批量起量。

场景 1B:竞品宣发材料参考 → 差异化脚本

把竞品卖点和自家素材一起喂给模型,先分析竞品打法,再产出差异化定位的脚本:

WITH comp AS (
  SELECT '原神:开放世界探索,元素反应战斗,精美二次元 /// 崩坏星穹铁道:回合制策略,列车叙事,声优阵容' AS competitor_selling
),
mine AS (
  SELECT group_concat(asr_text SEPARATOR ' /// ') AS my_mat FROM game_clip_src WHERE game_id=90001
)
SELECT ai_complete(CONCAT(
  '你是游戏买量策略师。竞品宣发卖点如下:', c.competitor_selling,
  '。我方素材口播如下:', mi.my_mat,
  '。请分析竞品打法,给出我方差异化定位,并产出一条25秒短视频脚本主打差异化优势,直接输出[差异化定位]+[脚本]:')) AS result
FROM comp c CROSS JOIN mine mi;

实测(节选):模型给出差异化定位——竞品是"内容驱动型(单机内容/角色养成/视听叙事)",我方错位打"社交驱动型:真人实时策略博弈 + 公平竞技不逼氪",并产出 5 镜头脚本(0-3s 竞品界面打❌切我方万人攻城 → 实时指挥走位 → 零氪推塔公平掉落 → 公会集结 → 下载定版)。竞品分析与差异化立意都相当到位。

场景 2:AI 辅助制作:真人 + 游戏玩法共屏脚本

游戏广告多为 30 秒内短视频,真人口播 + 游戏画面共屏是高转化形态。ai_complete 直接产出分轨分镜:

SELECT ai_complete(CONCAT(
  '你是游戏短视频编导。基于素材:', asr_text,
  '。产出一条28秒真人口播+游戏玩法共屏的短视频脚本,分[真人出镜画面]/[游戏玩法画面]/[口播]三轨,共4个镜头,适合达人投放,直接输出分镜:')) AS coplay_script
FROM game_clip_src WHERE clip_id='GC80003';

实测产出(萌宠餐厅共屏脚本,节选)

镜头

时长

真人出镜

游戏玩法画面

口播

1

0-5s

真人瘫坐揉肩叹气拿手机,屏幕亮起表情转亮

游戏启动,暖色餐厅开门+轻快BGM

下班累到不想动?试试这个"电子小憩室",30秒治愈你的疲惫!

2

5-13s

真人托腮,指尖滑动,嘴角上扬

布偶猫收银/柯基端盘/熊猫颠勺

开一家专属萌宠餐厅,毛茸茸的小动物全给你打工!

3

13-20s

真人起身伸懒腰,拿回手机惊喜指屏

"离线收益"结算页金币狂飙

最爽的是放置挂机!人不在金币照样进账,不肝不氪。

4

20-28s

达人凑近镜头手势指引下载

餐厅满座爆单+"立即下载"呼吸动效

每天几分钟,治愈又解压,左下角直接开玩!

模型还自动附了投放执行提示(共屏比例 5:5、语速 2.5 字/秒卡 28 秒、适配泛娱乐/打工人解压达人),可直接交付剪辑。

步骤 3:素材管理与检索

场景 1:自动化打标签(含 IP / 人物 / 复合场景识别)

基础打标(品类/画风/情绪/卖点 + 合规)见文末,这里演示隐含元素识别——用 ai_extract 抽出人工最难标的 IP、人物视觉、场景元素、复合场景:

SELECT clip_id,
  ai_extract(CONCAT(scene_desc,' ',ocr_text,' ',asr_text),
    ['ip_or_role','character_visual','scene_elements','composite_scene']) AS elements
FROM game_clip_src WHERE clip_id IN ('GC80001','GC80003');

实测

  • GC80001 → {"ip_or_role":"幻塔纪元/SSR暗夜刺客","character_visual":"暗色调二次元角色特写,刺客持双刀,武器高光","scene_elements":"雨夜屋顶,霓虹灯背景","composite_scene":"暗色调二次元角色特写,刺客持双刀在雨夜屋顶,霓虹灯背景,镜头拉近武器高光"}

  • GC80003 → {"ip_or_role":"萌宠餐厅/可爱小动物店员","character_visual":"明亮卡通画风,圆润可爱的猫咪店员","scene_elements":"暖色调餐厅场景,猫咪店员端盘子","composite_scene":"可爱小动物当店员的餐厅经营场景"}

IP、角色、场景、复合场景四维一次抽全,可直接写入 clip_tags.extracted_elements,替代人工逐条标注。

场景 2:自然语言 / 跨模态检索

素材打标 + 向量化后,支持三种检索。以文搜素材(策划描述创意需求):

WITH q AS (SELECT ai_embed('治愈系放置类经营游戏,画面可爱轻松,适合下班解压') AS qv)
SELECT x.clip_id, s.game_name, s.title, t.game_genre, t.art_style,
       ROUND(cosine_similarity(x.text_embedding, q.qv),4) AS score
FROM clip_text_emb x JOIN game_clip_src s ON x.game_id=s.game_id AND x.clip_id=s.clip_id
LEFT JOIN clip_tags t ON x.game_id=t.game_id AND x.clip_id=t.clip_id
CROSS JOIN q ORDER BY score DESC LIMIT 4;

实测:治愈经营 GC80003 排第一(0.662),益智 GC80005(0.522)次之——一句自然语言精准命中同调性素材。以图搜素材(参考图 → ai_embed_multimodal → 视觉向量 cosine_similarity)、文本+视觉双路 RRF 混合召回同理(SQL 见文末混合检索节)。

步骤 4:素材切片与拼装

场景 1:三级切片建模

素材按三个粒度切片,建模到 clip_slice,每个切片带来源素材的效果分 perf_score,便于后续优选:

  • 分镜段(scene):按镜头切段,如"治愈开场/角色亮相""放置收益演示"。

  • 语义切片(semantic):借大模型按语义重组片段。

  • 视觉帧(frame):精确到帧,如可做封面的高光帧。

INSERT INTO clip_slice VALUES
('SL_80003_S1','GC80003','萌宠餐厅','scene',1,'00:00-00:05','明亮卡通餐厅开门,猫咪店员招手欢迎','欢迎光临萌宠餐厅','治愈开场/角色亮相',22.50),
('SL_80003_S2','GC80003','萌宠餐厅','scene',2,'00:05-00:15','放置收菜界面,金币叮咚弹出,一键收取动画','放置也能赚金币','玩法演示/放置收益',22.50),
('SL_80003_S3','GC80003','萌宠餐厅','scene',3,'00:15-00:20','猫咪端出招牌三明治,暖色特写,下载按钮浮现','下班放松就玩它','行动号召/结尾',22.50),
('SL_80003_F1','GC80003','萌宠餐厅','frame',1,'00:03','猫咪店员端盘子正脸高光帧,可作封面','','高光帧/可做封面',22.50),
('SL_80001_S1','GC80001','幻塔纪元','scene',1,'00:00-00:03','暗夜刺客持双刀雨夜屋顶特写,霓虹背景','登录就送SSR暗夜刺客','热血开场钩子',15.38),
('SL_80001_S2','GC80001','幻塔纪元','scene',2,'00:03-00:10','十连抽卡橙卡金光翻转特效','十连必出橙卡','抽卡福利演示',15.38),
('SL_80002_S1','GC80002','幻塔纪元','scene',1,'00:00-00:08','万人同屏攻城,千军冲锋,投石车俯视','万人同屏攻城','宏大战争场面',4.68);

场景 2:切片检索 + 按需拼装

先用 ai_filter 从切片库检索符合需求的片段(如"适合做开场钩子的镜头"),ai_filter 可直接写在 WHERE 里:

SELECT slice_id, parent_clip_id, slice_type, time_range, reusable_tag, perf_score
FROM clip_slice
WHERE ai_filter('这个视频切片适合用作短视频的开场钩子镜头', CONCAT(visual_desc,' ',reusable_tag))
ORDER BY perf_score DESC;

实测精准命中 SL_80003_S1(治愈开场/角色亮相)。再把优选的高效切片(perf_score>=15)交给 ai_complete 按黄金结构重新拼装成新分镜:

WITH picked AS (
  SELECT group_concat(CONCAT('[',slice_type,'|',time_range,'|',visual_desc,'|',asr_snippet,'] 效果分',CAST(perf_score AS STRING)) SEPARATOR ' /// ') AS slices
  FROM clip_slice WHERE perf_score>=15
)
SELECT ai_complete(CONCAT(
  '你是游戏素材拼装师。以下是从高效素材库切出的可复用分镜片段(///分隔,含效果分):', slices,
  '。请按[开场钩子→玩法卖点→行动号召]的黄金结构,优选并重新组合成一条25秒二创短视频的分镜表,输出[镜头|时间轴|画面|口播]四列,并说明选择理由:')) AS assembled
FROM picked;

实测产出:模型跨素材重组出 4 镜头二创分镜——用治愈餐厅开场(22.5 分)拼接暗夜刺客(15.38 分)制造"暗黑→治愈"强反差钩子,中段用最高分放置收菜演示玩法,爽点段插十连抽卡,结尾用暖色三明治特写 + 高光帧做封面引导;并给出拼装逻辑(前 3 秒抓人、高分素材放关键节点、口播贴合画面)。无需新美术,纯靠已有高效切片重组即产出新视频,正是老游戏量产二创的核心解法。

步骤 5:数据驱动的素材优化

打标结果与投放指标同库,回流分析纯 SQL、零 Token。

-- 6A 素材级 ROI 排行
SELECT s.clip_id, s.game_name, t.art_style, t.emotion, t.selling_point,
  ROUND(s.clicks/s.impressions*100,2) AS ctr_pct,
  ROUND(s.conversions/s.clicks*100,2) AS cvr_pct,
  ROUND(s.gmv/s.cost,2) AS roi, t.risk_level
FROM game_clip_src s LEFT JOIN clip_tags t ON s.game_id=t.game_id AND s.clip_id=t.clip_id
ORDER BY roi DESC;

-- 6B 高转化特征聚类(指导下一批二创方向)
SELECT t.art_style, t.emotion, t.selling_point, COUNT(*) AS clips,
  ROUND(AVG(s.conversions/s.clicks*100),2) AS avg_cvr_pct, ROUND(AVG(s.gmv/s.cost),2) AS avg_roi
FROM game_clip_src s JOIN clip_tags t ON s.game_id=t.game_id AND s.clip_id=t.clip_id
WHERE t.risk_level='low'
GROUP BY t.art_style, t.emotion, t.selling_point ORDER BY avg_roi DESC;

-- 6C 合规拦截(high 风险不进投放池)
SELECT s.clip_id, s.game_name, t.risk_reason, ROUND(s.gmv/s.cost,2) AS roi
FROM game_clip_src s JOIN clip_tags t ON s.game_id=t.game_id AND s.clip_id=t.clip_id
WHERE t.risk_level='high' ORDER BY roi DESC;

素材级 ROI 排行

clip_id

素材

画风

情绪

CTR%

CVR%

ROI

风险

GC80003

萌宠餐厅·治愈经营

Q版卡通

治愈轻松

6.00

16.67

22.50

low

GC80001

幻塔纪元·刺客

二次元

热血激昂

6.00

13.14

15.38

low

GC80006

萌宠餐厅·BGM

其他

治愈轻松

4.13

14.52

13.55

low

GC80002

幻塔纪元·攻城

写实3D

热血激昂

3.51

7.95

4.68

low

GC80004

传奇霸业·屠龙刀

像素复古

浮夸夸张

6.00

5.81

4.57

high

GC80005

小学生大冒险

Q版卡通

浮夸夸张

4.67

5.31

2.29

high

业务洞察闭环:治愈轻松 + Q版卡通(GC80003)ROI 22.5 居首;两条违规浮夸素材(GC80004/05)点击高但转化差、ROI 垫底。这一结论直接反哺场景群一/三的选材——批量脚本与二创拼装优先复用高 ROI 的治愈向、公平向素材,合规不仅不牺牲效果,反而是高 ROI 的共性特征,形成"回流数据 → 特征聚类 → 优选切片 → 二创拼装 → 再投放"的完整闭环。

附:基础数据链

上文四大场景依赖的基础数据链(入库、双向量、基础打标)SQL 如下:

素材入库

6 条数据,含 2 条违规样本:

INSERT INTO game_clip_src
(game_id, clip_id, asset_id, clip_type, asset_type, game_name, title, cover_url,
 ocr_text, asr_text, scene_desc, campaign_id, impressions, clicks, conversions, cost, gmv, updated_at) VALUES
(90001,'GC80001','AST9001','clip','video','幻塔纪元','开局送SSR暗夜刺客','<公读海报图URL>',
 '限时开服 登录即送SSR','兄弟们幻塔纪元今天开服啦,登录就送SSR暗夜刺客,还有十连必出橙卡,错过等一年!',
 '暗色调二次元角色特写,刺客持双刀在雨夜屋顶,霓虹灯背景,镜头拉近武器高光','CMP_A1',520000,31200,4100,18600.00,286000.00,'2026-07-12 20:11:00'),
(90001,'GC80002','AST9002','clip','video','幻塔纪元','策略攻城战真实演示','<公读海报图URL>',
 '万人同屏 攻城掠地','这是真实游戏画面,万人同屏攻城,策略布阵才能赢,不氪金也能上分,公平竞技。',
 '宏大战争场面,城墙下千军万马冲锋,投石车与弓箭手,写实3D画风,俯视镜头','CMP_A1',430000,15100,1200,12400.00,58000.00,'2026-07-12 20:22:00'),
(90002,'GC80003','AST9003','clip','video','萌宠餐厅','超治愈经营养成','<公读海报图URL>',
 '放置经营 一键收菜','经营你的萌宠餐厅吧,可爱小动物当店员,放置也能赚金币,下班放松就玩它。',
 '明亮卡通画风,圆润可爱的猫咪店员端盘子,暖色调餐厅场景,Q版角色','CMP_B2',680000,40800,6800,15200.00,342000.00,'2026-07-13 10:05:00'),
(90003,'GC80004','AST9004','clip','video','传奇霸业','点击就送屠龙宝刀','<公读海报图URL>',
 '全网最爆 一刀999级','兄弟别划走,点进来就送满级VIP和屠龙宝刀,一刀9999级,绝对全网最强,充1得100,血赚不亏!',
 '老式传奇界面,金光闪闪的刀,浮夸的数字弹出特效,暗红色调','CMP_C3',890000,53400,3100,21000.00,96000.00,'2026-07-13 14:30:00'),
(90004,'GC80005','AST9005','clip','video','小学生大冒险','儿童向卡通闯关','<公读海报图URL>',
 '益智闯关 家长放心','小朋友们快来玩,简单点点就能闯关,充值648解锁全部关卡,爸爸妈妈的手机借来充钱哦!',
 '低龄卡通画风,彩虹色背景,Q版小人蹦跳过关,气球和糖果元素','CMP_D4',210000,9800,520,4800.00,11000.00,'2026-07-14 09:15:00'),
(90002,'GC80006','AST9006','clip','audio','萌宠餐厅','轻快BGM配音片段','<公读发票图URL>',
 '','欢迎光临萌宠餐厅,今天想吃点什么呢,喵~ 我们的招牌是元气三明治哦!',
 '纯音频素材,轻快钢琴与铃铛音效,女声软萌配音','CMP_B2',150000,6200,900,3100.00,42000.00,'2026-07-14 11:40:00');

双向量回填

视觉 2560 / 文本 1024,拼接用 CONCAT_WS 严禁 ||

INSERT INTO clip_visual_emb
SELECT game_id, clip_id, cover_url, ai_embed_multimodal(cover_url,'image'), NOW()
FROM game_clip_src WHERE cover_url IS NOT NULL AND cover_url<>'';

INSERT INTO clip_text_emb
SELECT game_id, clip_id,
       CONCAT_WS(' | ', title, scene_desc, ocr_text, asr_text),
       ai_embed(CONCAT_WS(' | ', title, scene_desc, ocr_text, asr_text)), NOW()
FROM game_clip_src WHERE LENGTH(CONCAT_WS(' ', title, scene_desc, ocr_text, asr_text)) > 10;
-- 校验: visual_dim=2560  text_dim=1024  null 全 0

基础打标

品类/画风/情绪/卖点 + 三路合规过滤。ai_classifyget_json_string(...,'$.labels[0]')AI 函数不能进 CASE,先在 CTE 物化布尔列;CASE 分支顺序即业务优先级

INSERT INTO clip_tags
WITH flags AS (
  SELECT s.game_id, s.clip_id,
    get_json_string(ai_classify(CONCAT_WS(' ', s.title, s.scene_desc, s.asr_text),
      ['二次元RPG','策略战争','放置经营','传奇MMO','益智休闲','卡牌','射击','其他']), '$.labels[0]') AS game_genre,
    get_json_string(ai_classify(s.scene_desc,
      ['写实3D','二次元','Q版卡通','像素复古','暗黑风','低龄童趣','其他']), '$.labels[0]') AS art_style,
    get_json_string(ai_classify(s.asr_text, ['热血激昂','治愈轻松','紧迫催单','浮夸夸张','平静']), '$.labels[0]') AS emotion,
    get_json_string(ai_classify(s.asr_text,
      ['开服福利','公平竞技','放置省心','充值返利','益智教育','其他']), '$.labels[0]') AS selling_point,
    ai_filter('这段游戏广告文案是否含虚假或夸大宣传如全网最强一刀999绝对最强等极限词', s.asr_text) AS f_false,
    ai_filter('这段游戏广告文案是否诱导充值付费如充1得100血赚满级VIP', s.asr_text) AS f_pay,
    ai_filter('这段游戏广告文案是否诱导未成年人或涉及未成年借家长手机充值', s.asr_text) AS f_minor,
    ai_extract(s.asr_text, ['game_type','reward','currency','vip_or_pay','target_user']) AS extracted_elements,
    ai_complete(CONCAT('用60字内概括这条游戏广告素材在讲什么卖点,只输出概括:\n',
      CONCAT_WS(' ', s.title, s.scene_desc, s.asr_text))) AS clip_summary
  FROM game_clip_src s
)
SELECT game_id, clip_id, game_genre, art_style, emotion, selling_point,
  CASE WHEN f_minor THEN 'high' WHEN f_false THEN 'high' WHEN f_pay THEN 'mid' ELSE 'low' END,
  CASE WHEN f_minor THEN '诱导未成年付费' WHEN f_false THEN '虚假夸大宣传' WHEN f_pay THEN '诱导充值' ELSE NULL END,
  extracted_elements, clip_summary, NOW()
FROM flags;

实测打标:GC80004 判 high/虚假夸大宣传,GC80005 判 high/诱导未成年付费,其余 low,品类/画风/情绪/卖点均准确(详见场景群四 6A 表)。

混合检索 RRF

文本 + 视觉双路,ORDER BY 用裸别名 rrf_score 不能带表前缀:

WITH q AS (
  SELECT ai_embed('热血二次元RPG,暗夜刺客,霓虹雨夜战斗') AS q_text,
         ai_embed_multimodal('热血二次元RPG,暗夜刺客,霓虹雨夜战斗','text') AS q_visual
),
text_recall AS (
  SELECT x.clip_id, ROW_NUMBER() OVER (ORDER BY cosine_similarity(x.text_embedding,q.q_text) DESC) AS r
  FROM clip_text_emb x CROSS JOIN q ORDER BY r LIMIT 100),
visual_recall AS (
  SELECT v.clip_id, ROW_NUMBER() OVER (ORDER BY cosine_similarity(v.visual_embedding,q.q_visual) DESC) AS r
  FROM clip_visual_emb v CROSS JOIN q ORDER BY r LIMIT 100),
fused AS (
  SELECT clip_id, SUM(1.0/(60+r)) AS rrf FROM (
    SELECT clip_id, r FROM text_recall UNION ALL SELECT clip_id, r FROM visual_recall) u GROUP BY clip_id)
SELECT f.clip_id, s.title, ROUND(f.rrf,5) AS rrf_score
FROM fused f JOIN game_clip_src s ON f.clip_id=s.clip_id
ORDER BY rrf_score DESC LIMIT 4;