ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从整蛊视频看懂短视频推荐系统:内容理解到召回排序

从整蛊视频看懂短视频推荐系统:内容理解到召回排序 最近在短视频平台刷到一类整蛊视频时很多人第一反应是“这都能火”博主假装打电话大声聊另一半特别感兴趣的事比如约人钓鱼、组局打球、晚上吃火锅然后偷偷记录对方从瘫在沙发上无动于衷到瞬间精神、迅速凑上来打听细节的全程。制作成本极低一个手机支架加一段对话却能稳定拿到几十万甚至上百万播放量。如果只从内容角度看这类视频的走红似乎靠的是“选题好、有共鸣”。但从技术视角看更值得琢磨的是另一件事这条视频为什么能精准出现在最容易被打动的人的信息流里平台的推荐系统是怎么“看懂”视频内容、怎么推测用户兴趣、又怎么把两者高效匹配起来的这篇文章会用这条整蛊视频作为分析样本把短视频推荐系统的核心链路拆开讲清楚。内容会覆盖多模态内容理解、用户兴趣画像、召回与排序机制并给出可运行的简化代码示例。读完你会发现爆款内容并不是纯靠运气而是内容结构恰好命中了推荐系统优化的核心指标而对开发者来说理解这套机制的价值远远大于复制一个整蛊创意。1. 这条视频为什么能吸引人内容结构与推荐指标的关系先回到内容本身。这条整蛊视频能火并不是因为它画面精美或演员演技好而是因为它具备一个非常清晰的“兴趣触发结构”。拆开看视频信息流的逻辑只有三步博主率先抛出一个高度具体的兴趣关键词钓鱼、打球、火锅、游戏、汽车。屏幕外的人产生明显反应从冷淡到兴奋动作和表情出现强烈反转。这种反转被镜头完整记录形成天然的“验证感”。这种结构恰好命中了推荐算法最关注的几个指标。推荐系统不会直接判断“这条视频有没有意思”而是通过用户的反馈行为来间接判断。以下几个指标几乎是所有短视频平台的核心完播率用户是否看完了这条视频。互动率用户是否点赞、评论、转发。关注转化用户是否因为这条视频去关注博主。“假装打电话聊丈夫感兴趣的事”这类内容天然就是为高完播率设计的。观众想知道“他到底会不会凑上来”这个悬念把观看时长拉长而当情绪反转出现时观众又会因为“跟我家那位一模一样”产生强烈共鸣点赞和评论的积极性远高于普通视频。但这里要区分一个容易误解的点推荐系统并不是“看到视频很好所以推荐”而是“先推荐给一小部分人发现反馈好再放量推荐”。爆款的诞生本质是内容和算法在试错中一次次相互确认的结果。理解这一点后面对用户画像、召回、排序的理解会顺畅很多。2. 短视频推荐系统整体架构从上传到刷到的完整链路抛开具体平台所有短视频推荐系统都可以抽象成四个子系统内容理解系统负责把视频变成机器可计算的数据包括标签、主题、向量、质量分等。用户画像系统负责把用户在平台上的行为沉淀成兴趣特征和偏好权重。召回系统从海量视频库中快速筛选出几百个“候选集”。排序系统对候选集精排预测用户点击、完播、点赞的概率决定信息流展示顺序。这条链路和传统搜索有很大区别。搜索是用户先输入明确的关键词系统只需要匹配“相关性”推荐则没有明确指令系统必须从用户的历史行为、实时场景、内容特征中主动猜测用户此时可能想看什么。以那条整蛊视频为例一条视频从上传到被某个用户刷到大体经历这样几个环节视频上传后多模态算法抽帧、转写语音、识别字幕、打标签。视频进入内容池获得一个初始曝光量。系统把视频推给一小部分“探索用户”观察反馈数据。如果完播率、互动率表现好系统扩大推荐范围。在更大的候选集里排序模型综合评估与每个用户的匹配程度决定最终是否展示、展示在第几位。这套架构的工程难点在于“链路长、实时性要求高”。从内容入库到用户刷到中间延迟通常控制在毫秒到秒级。整个推荐系统的优化目标也不只是“推荐得准”而是同时兼顾新鲜感、多样性和平台生态的长期收益。3. 多模态内容理解平台如何“看懂”一条整蛊视频机器并不像人一样“看懂”视频。它需要把视频拆解成多个维度的信号再合并成结构化的内容表示。这个过程就是多模态内容理解。一条“假装打电话聊丈夫感兴趣的事”的视频平台至少会从四个模态提取信息语音转写通过 ASR 把博主说的话变成文本“周六去钓鱼”就是一个明确的关键词。字幕识别短视频大多有自动字幕OCR 可以直接提取字幕内容。画面理解识别出场景是客厅、沙发上的人、手持手机拍摄等元素。表情与动作识别识别屏幕中人物从“不起劲”到“突然坐直”的状态变化。把这些信号合并系统可以给这条视频打上多个层级的标签动作类标签如“整蛊”“偷拍”关系类标签如“夫妻”“家庭”兴趣类标签如“钓鱼”“运动”甚至还能推断出情绪标签如“惊喜”“哭笑不得”。标签体系是内容理解最直接的产出物也是后面用户画像和召回的基础。对平台来说标签粒度直接决定推荐精度。如果只打“搞笑”这种大标签那这条视频会被推荐给所有喜欢搞笑内容的人匹配效率非常低而“钓鱼整蛊夫妻反应”这种组合标签才能精准命中小圈层再通过圈层扩散。以下代码演示了一个极简的文本标签提取流程。实际系统中输入可能是 ASR 转写文本这里用几条模拟文案代替import jieba import jieba.analyse video_transcripts [ 假装打电话说老公喜欢钓鱼看他什么反应, 我说明天去球场打一整天篮球老公瞬间从沙发弹起来, 说晚上吃火锅他马上凑过来问去哪家, ] for i, text in enumerate(video_transcripts, 1): tags jieba.analyse.extract_tags(text, topK5) print(f视频{i}: {tags})运行后大概会输出类似结果视频1: [打电话, 老公, 钓鱼, 假装, 反应] 视频2: [球场, 篮球, 老公, 沙发, 打] 视频3: [火锅, 凑过来, 晚上, 哪家]这几个关键词已经足够支撑一个基础的兴趣标签。实际工程里还会配合词汇表过滤、同义词归一化、实体识别把“老公”归一为“配偶/婚姻”类目把“钓鱼”对应到兴趣类目下的“垂钓”。4. 用户兴趣画像推荐系统如何知道“丈夫感兴趣的事”整蛊视频里那个丈夫产生兴趣是因为他本来就喜欢那件事。推荐系统的逻辑也一样它要先知道用户对什么感兴趣才有可能推荐出“让用户瞬间精神”的内容。用户兴趣画像的构建核心是把用户行为转化为结构化特征。行为通常分两类显式反馈点赞、收藏、评论、关注、分享。这些行为表达强烈但稀疏。隐式反馈播放时长、完播率、重播次数、滑走速度、停留时间。这些行为数量庞大能反映真实注意力。隐式反馈比显式反馈更接近真实兴趣。很多人刷到一条视频不会点赞但会完整看完甚至反复看两遍这在算法眼里就是高兴趣信号。画像系统会按时间和行为类型给不同行为分配权重。比如当天的行为权重最高一周前的行为衰减一半一个月前的行为基本只作长线参考分享权重高于点赞完整播放权重高于滑到一半。最终每个用户都会得到一个兴趣向量在“钓鱼”“篮球”“整蛊”“美食”等维度上分别有高低不同的分数。这里真正容易踩坑的地方是只统计行为次数不考虑行为质量画像会失真。比如用户连续快进三条视频行为次数很多但真实意图是“不感兴趣”。更合理的做法是引入“负反馈”信号把快速滑走、主动选择“不感兴趣”等行为计入低分或扣分。下面是一个简化的用户兴趣画像累加逻辑from collections import defaultdict actions [ {user: U01, tag: 钓鱼, type: share, ts: 10}, {user: U01, tag: 钓鱼, type: like, ts: 12}, {user: U01, tag: 篮球, type: watch_50, ts: 15}, {user: U01, tag: 美食, type: dislike, ts: 20}, ] ACTION_WEIGHT { watch_10: 0.2, watch_50: 0.5, watch_90: 1.0, like: 2.0, comment: 3.0, share: 4.0, dislike: -3.0, } def update_profile(profile, actions): for act in actions: weight ACTION_WEIGHT.get(act[type], 0) profile[act[user]][act[tag]] weight return profile profile defaultdict(lambda: defaultdict(float)) profile update_profile(profile, actions) for user, tags in profile.items(): print(f用户 {user}: {dict(tags)})输出用户 U01: {钓鱼: 6.0, 篮球: 0.5, 美食: -3.0}从结果可以清楚看到用户 U01 对“钓鱼”的兴趣远高于“篮球”而对“美食”产生了明显的负反馈。真实系统还会把时间衰减、跨端行为合并、多兴趣簇聚类等逻辑加进来但核心思路是一致的用行为数据加权出连续的兴趣分数。5. 召回、排序、重排匹配兴趣内容的完整流程有了内容标签和用户画像下一步就是匹配。但匹配不能“大海捞针”式地全量计算工业级系统通常分成召回、排序、重排三个阶段。召回阶段解决“从亿万视频里选几百个”。多路召回是常用方案每一路独立运行最后合并候选集兴趣召回根据用户兴趣标签找相似标签的视频。协同过滤找与当前用户行为相似的其他用户把那些用户喜欢的内容推荐过来。热门召回推荐当前热度高的内容解决冷启动和探索问题。关注召回推荐用户关注博主的新作品。向量召回将内容和用户都映射为向量用近似最近邻搜索找相似项。排序阶段解决“这几百个怎么排”。排序模型预测用户对每个候选视频的点击率、完播率、互动率再把多个预估值融合成最终得分。传统方案是逻辑回归和 GBDT工业界目前主流是 DeepFM、DIN 这类深度学习模型它会综合用户特征、视频特征、上下文特征、交叉特征做预估。重排阶段解决“体验层面的约束”。如果连续五条都是同一类整蛊视频用户很快就会厌倦。重排算法会做多样性打散、相似内容去重、商业内容混排同时保证推荐列表整体平滑。用一段简化代码演示“兴趣召回简单排序”的流程videos { v1: {tags: {钓鱼: 1.0, 整蛊: 0.7, 家庭: 0.4}}, v2: {tags: {篮球: 0.9, 运动: 0.7}}, v3: {tags: {整蛊: 0.8, 宠物: 0.6}}, v4: {tags: {美食: 0.8, 火锅: 0.7}}, } user_interest {钓鱼: 0.9, 整蛊: 0.6, 运动: 0.2} def recall(user_interest, videos, top_k2): candidates [] for vid, info in videos.items(): score 0.0 for tag, weight in info[tags].items(): score user_interest.get(tag, 0) * weight if score 0: candidates.append((vid, round(score, 4))) candidates.sort(keylambda x: x[1], reverseTrue) return candidates[:top_k] print(recall(user_interest, videos))输出[(v1, 1.48), (v3, 0.48)]这个极简逻辑里v1 同时命中了“钓鱼”和“整蛊”得分最高v3 单靠“整蛊”命中v4 因用户对美食兴趣为 0 而被过滤。真实系统的召回和排序会复杂很多但“让高匹配内容获得更高排序位置”的基本原则是通用的。6. 从标签体系到向量化召回语义匹配的升级路径标签体系虽然直观但有一个天然瓶颈它无法处理语义相近但字面不同的内容。用户喜欢“钓鱼”内容里全是“路亚”“台钓”“打窝”标签匹配的效率就会下降。工业界目前的解法是引入向量化表示让内容和用户都变成一个高维向量用向量之间的距离衡量相似度。这就是双塔模型的基本思路。左边是内容塔负责把视频的多模态特征编码成向量右边是用户塔负责把用户历史行为、画像特征编码成向量。训练时让“被用户正向反馈过的内容对”向量靠近负样本向量拉远。线上使用时系统提前把所有视频向量建好索引用户请求到来时计算用户向量再做近似最近邻检索。常见的向量检索工具有 Facebook 开源的 FAISS、以及 HNSW 算法及其变体。它们能在百万甚至亿级向量中在几十毫秒内返回与目标向量最相似的 Top-K 结果。向量化召回真正改变的是推荐的“表达粒度”。标签是一种离散的、人工定义的粗粒度表达向量是连续的、模型从海量行为中学习出来的细粒度表达。它可以在没有任何显式关键词的情况下判断出“喜欢看路亚视频的人大概率也对溪流钓视频感兴趣”。这种能力是纯标签体系很难做到的。从工程演进角度看成熟的推荐系统通常是“标签体系与向量召回并存”。标签用于解释、干预、审核和初始召回向量用于承担主要的语义召回。两者的配合保证系统既有可控性又有扩展性。7. 常见问题与排查思路推荐系统是个工程链路很长的系统出问题时往往要跨模块排查。下面按典型现象整理一份排查清单问题现象可能原因排查方式解决方案新视频长期无曝光冷启动策略不足内容池没有被探索检查视频是否完成审核、标签是否生成给新内容设置探索流量池设置最低曝光量推荐结果明显不符合用户兴趣用户画像存在噪声或负反馈未纳入查看用户近N天行为日志检查行为权重增加负反馈扣分重启实时画像计算标签覆盖率为空多模态处理链路异常检查ASR/OCR任务运行状态和日志补跑内容理解任务增加兜底标签召回结果同质化严重多路召回中某一路占比过高统计各路召回的占比和覆盖率调整各路权重增加多样性召回策略线上指标下跌但离线实验正常特征分布偏移对比线上和离线特征分布增加特征监控定期重训模型扒不出某类内容但热度很高标签体系没有覆盖新类目检查视频标签分布和类目字典定期补充类目字典加入人工标注样本实际项目里第一优先级永远是“确认数据链路是否完整”。很多所谓推荐不精准追到最后其实是埋点缺失、行为日志丢失或者标签没生成。不要在模型结构上做大量优化之前先确认上游数据没问题。8. 最佳实践与工程建议如果你所在团队准备搭建内容推荐能力下面这些经验值得提前参考。第一埋点规范是地基。播放时长、完播位置、滑走时间、点赞、评论这些行为必须统一事件命名、统一时间戳规范否则后续画像和模型训练都会受影响。推荐系统的数据质量永远比模型结构更重要。第二标签体系需要生命周期管理。标签不是“打上就永远有效”。热点类标签可能几周后失效行为类标签会随用户兴趣迁移而衰减。建议为标签增加时间戳和置信度定期清理低频和失效标签。第三冷启动要单独设计。新用户没有足够行为数据新内容没有足够曝光反馈这两个问题都需要特殊策略。新用户可以先用热门内容探索兴趣再逐步换成个性化推荐新内容可以设置低门槛的探索流量池用短时反馈快速判断是否放量。第四必须引入 AB 实验和评估体系。不能只凭感觉判断推荐效果。离线指标可以看 AUC、召回率、准确率在线指标要看点击率、完播率、人均播放时长、留存率。上线新策略时建议小流量实验观察足够长周期再全量。第五注意信息茧房问题。推荐系统只优化“短期点击”用户看到的内容会越来越窄。实践中要主动加入探索流量、多样性约束和随机性保障内容生态的健康度。第六安全和合规要前置。内容理解、用户画像都会涉及大量用户行为数据必须遵循最小必要原则做匿名化和权限管控。对风险内容要建立从审核到屏蔽的完整处理链路不能只依赖推荐模型。9. 总结与后续学习方向回到最初的整蛊视频。它能在信息流里爆火表面看是内容创意取胜深层看是内容结构恰好顺应了推荐系统的优化逻辑明确的兴趣信号带来高完播率强共鸣引发互动互动数据又触发更大规模的推荐。对内容创作者来说理解推荐机制可以帮助选题对开发者来说理解完整推荐链路就是在理解平台级产品最核心的工程系统之一。如果你接下来想深入实践可以按三条路径继续想学推荐算法从逻辑回归、FM、DeepFM 等经典模型入手在 MovieLens 等公开数据集上做训练和评估。想学用户画像可以分析公开的行为日志数据练习行为权重设计、时间衰减、聚类分群。想学工程架构推荐系统依赖高并发、缓存、消息队列和在线服务可以尝试自己搭建一个简化版的召回与排序服务。最后提醒一句能跑通 Demo 和理解论文距离一个能支撑生产环境的推荐系统还有很大差距。真正的工程难点往往不在模型参数里而在数据质量、特征监控、实验机制和系统容错这些不显眼的地方。一次把链路数据理清楚、把评估体系建起来对团队的价值远大于盲目堆叠新模型。
返回列表