本文介绍基于 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 里,对应本文四大场景群。核心数据链分为六段:

入库:多平台创意素材(短视频、图片、音频)连同投放指标统一入库,支持 StarRocks 内表、Paimon 表等多种格式。
AI 理解:用 ai_classify / ai_filter / ai_extract 自动打标与合规过滤,用 ai_embed / ai_embed_multimodal 生成文本与视觉向量。
切片建模:对素材做分镜、语义、视觉帧三级切片建模,沉淀为可复用、可组合的数据。
检索:用自然语言或跨模态查询,通过 cosine_similarity 实现以文搜素材、以图搜素材及双路混合召回。
拼装二创:用 ai_complete 批量生成多方向脚本与分镜,按需拼装切片组合成新素材。
投放回流:回流 CTR/CVR/ROI 等投放指标,反哺选材与创意迭代,形成数据驱动的正循环。
原始素材始终留在 OSS,Object Table 只保存元数据和受控的 file 引用。
把file 交给 AI 函数即可,签名URL 系统自动生成,SQL里不出现 AK/SK。
同一素材靠 object_uri + etag 做增量幂等,重跑不重复烧 token。
方案步骤
步骤 1:建库建表
先为存放在 OSS 的原始素材创建 Object Table。视频、图片、音频等二进制大文件通过 Object Table 映射,仅登记 object_uri、etag、file 等元数据与引用,原始文件始终留在 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_src 的 cover_url、asr_text、ocr_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_classify 取 get_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;