您现在的位置是:网站首页> 学习资源

大型项目研发技术收集

摘要

大型项目研发技术收集


集群使用

大型应用每个节点内存数据管理

抖音推荐机制探秘



集群使用

redis集群

redis的集群并给出详细的例子包括用C#如何操作集群的读写






redis集群

单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集

1.png

Redis集群支持多个Master,每个Master又可以挂载多个Slave

读写分离

支持海量数据的高可用

支持海量数据的读写存储操作

由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能

客户端和Redis的节点连接,不再需要连接集群中所有节点,只需连接集群中的任意一个可用节点即可

槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系

redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令


Redis集群分布式存储

槽位

集群的密钥空间被分成16384个槽,有效地设置了16384个主节点的集群大小上限(但是,建议的最大节点大小约为1000个节点)。

Redis集群投有使用一致性hash,而是引入了哈希槽的概念.

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。

集群的每个节点(master)负责一部分hash槽。


比如,有一个集群有三个节点:

1.png


分片

使用Redis集群时我们会将存储的数据分散到多台redis机器上,这称为分片。简言之,集群中的每个Redis实例都被认为是整个数据的一个分片。


如何找到给定key的分片:为了找到给定key的分片,我们对key进行CRC16(key)算法处理并通过对总分片数量取模。然后,使用确定性哈希函数,这意味着给定的key将多次始终映射到同一个分片,我们可以推断将来读取特定key的位置。


Redis集群分布式存储有大概有3种解决方法


哈希取余分区

1.png

hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。

优点:

简单粗暴,直接有效,只需要预估好数据规划节点例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。


缺点:

直接规划好节点,进行扩容或者缩容会很麻烦,不管扩还是缩,每次数据变动会导致节点有变动,映射关系都要重新计算,在服务器个数固定不变时没有问题。

如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化,Hash(key)/3会变成Hash(key) 

此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变得不可控。


一致性哈希算法分区

为了解决分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不行了。

目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系


配置集群(三主三从)

Redis集群为什么至少需要三个master节点?

因为新master的选举需要大于半数的集群master节点同意才能选举成功,如果只有两个master节点,当其中一个挂了,是达不到选举新master的条件的。


Redis集群为什么推荐节点数为奇数?

奇数个master节点可以在满足选举该条件的基础上节省一个节点,比如三个master节点和四个master节点的集群相比,大家如果都挂了一个master节点都能选举新master节点,如果都挂了两个master节点都没法选举新master节点了,所以奇数的master节点更多的是从节省机器资源角度出发说的。



哈希槽分区

一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。

接下来就需要对key求哈希值,然后对16384取模,余数是几key就落入对应的槽里。集群会记录节点和槽的对应关系。

HASH_SLOT = CRC16(key) mod 16384。

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。


写入的总体流程:当需要在 Redis 集群中放置一个 key-value时,redis先对key使用crc16算法算出一个结果然后用结果对16384求余数[ CRC16(key) % 16384],这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。



为什么redis集群的最大槽数是16384(不太懂)

Redis集群并没有使用一致性hash而是引入了哈希槽的概念。Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

正常的心跳数据包带有节点的完整配置,可以用幂等方式用旧的节点替换旧节点,以便更新旧的配置。这意味着它们包含原始节点的插槽配置,该节点使用2k的空间和16k的插槽,但是会使用8k的空间(使用65k的插槽)。同时,由于其他设计折衷,Redis集群不太可能扩展到1000个以上的主节点。因此16k处于正确的范围内,以确保每个主机具有足够的插槽,最多可容纳1000个矩阵,但数量足够少,可以轻松地将插槽配置作为原始位图传播。请注意,在小型群集中,位图将难以压缩,因为当N较小时,位图将设置的slot / N位占设置位的很大百分比。


redis的集群主节点数量基本不可能超过1000个

集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者不建议redis cluster节点数量超过1000个。 那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。




配置config文件

本案例的配置是在一台虚拟机的6个端口分别配置了6个redis服务器

1.png

端口 6381

vim /myredis/cluster/redisCluster6381.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6381

logfile "/myredis/cluster/cluster6381.log"

pidfile /myredis/cluster6381.pid

dir /myredis/cluster

dbfilename dump6381.rdb

appendonly yes

appendfilename "appendonly6381.aof"

requirepass 123456

masterauth 123456

 

cluster-enabled yes

cluster-config-file nodes-6381.conf

cluster-node-timeout 5000


端口 6382

vim /myredis/cluster/redisCluster6382.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6382

logfile "/myredis/cluster/cluster6382.log"

pidfile /myredis/cluster6382.pid

dir /myredis/cluster

dbfilename dump6382.rdb

appendonly yes

appendfilename "appendonly6382.aof"

requirepass 123456

masterauth 123456

 

cluster-enabled yes

cluster-config-file nodes-6382.conf

cluster-node-timeout 5000



端口 6383

vim /myredis/cluster/redisCluster6383.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6383

logfile "/myredis/cluster/cluster6383.log"

pidfile /myredis/cluster6383.pid

dir /myredis/cluster

dbfilename dump6383.rdb

appendonly yes

appendfilename "appendonly6383.aof"

requirepass 123456

masterauth 123456


cluster-enabled yes

cluster-config-file nodes-6383.conf

cluster-node-timeout 5000



端口 6384

vim /myredis/cluster/redisCluster6384.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6384

logfile "/myredis/cluster/cluster6384.log"

pidfile /myredis/cluster6384.pid

dir /myredis/cluster

dbfilename dump6384.rdb

appendonly yes

appendfilename "appendonly6384.aof"

requirepass 123456

masterauth 123456

 

cluster-enabled yes

cluster-config-file nodes-6384.conf

cluster-node-timeout 5000



端口 6385

vim /myredis/cluster/redisCluster6385.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6385

logfile "/myredis/cluster/cluster6385.log"

pidfile /myredis/cluster6385.pid

dir /myredis/cluster

dbfilename dump6385.rdb

appendonly yes

appendfilename "appendonly6385.aof"

requirepass 123456

masterauth 123456

 

cluster-enabled yes

cluster-config-file nodes-6385.conf

cluster-node-timeout 5000



端口 6386

vim /myredis/cluster/redisCluster6386.conf

bind 0.0.0.0

daemonize yes

protected-mode no

port 6386

logfile "/myredis/cluster/cluster6386.log"

pidfile /myredis/cluster6386.pid

dir /myredis/cluster

dbfilename dump6386.rdb

appendonly yes

appendfilename "appendonly6386.aof"

requirepass 123456

masterauth 123456

 

cluster-enabled yes

cluster-config-file nodes-6386.conf

cluster-node-timeout 5000



启动六台redis

redis-server /myredis/cluster/redisCluter6381.conf 

..........

redis-server /myredis/cluster/redisCluter6386.conf 


通过redis-cli命令为6台机器构建集群关系

redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.88.130:6381 192.168.88.130:6382 192.168.88.130:6383 192.168.88.130:6384 192.168.88.130:6385 192.168.88.130:6386

-cluster-replicas 1 表示为每个master创建一个slave节点


任意连接一个作为切入点(集群只需要连一个),并检验集群状态

连接6381端口

redis-cli -a 123456 -p 6381 -c     // -c表示集群 不加的话不是按照集群启动的,对于在别的机器上的key,会报错


不加 -c 启动 ,在存值时,可能会报错,原因是在计算槽位时,可能是在别的master下管理的槽位

下图中的槽位是在6384端口,所以需要在6384端口的redis进行set操作

1.png

加上-c之后,会进行自动重定向

2.png

查看集群主从关系

cluster nodes       // 查看集群的主从关系


查看集群信息

 cluster info   


查看某个key该属于对应的槽位值

CLUSTER KEYSLOT key  //查询key所在的槽位值


集群是否完整才能对外提供服务

在配置文件中有以下代码


cluster-require-full-coverage


默认YES,现在集群架构是3主3从的redis cluster由3个master平分16384个slot,每个master的小集群负责1/3的slot,对应一部分数据。

cluster-require-full-coverage:默认值 yes,即需要集群完整性,方可对外提供服务通常情况,如果这3个小集群中,任何一个(1主1从)挂了,你这个集群对外可提供的数据只有2/3了,整个集群是不完整的,

redis 默认在这种情况下,是不会对外提供服务的。



redis的集群并给出详细的例子包括用C#如何操作集群的读写

Redis集群及其C#操作方法。Redis集群是Redis提供的分布式解决方案,用于在多个Redis节点之间分片数据。

Redis集群的主要特点

自动分片:数据自动分布到多个节点。

高可用性:支持主从复制和自动故障转移。

线性扩展:可以通过添加节点来增加集群容量。

下面我们将详细介绍Redis集群的工作原理、搭建过程,以及如用C#操作集群。


Redis集群工作原理

Redis集群使用哈希槽(hash slot)的概念来分配数据。集群有16384个哈希槽,每个key通过CRC16算法计算后对16384取模,来决定放置在哪个槽中。集群中的每个节点负责一部分槽。


搭建Redis集群

假设我们要搭建一个包含6个节点(3主3从)的Redis集群。


步骤:

a) 创建6个Redis实例,配置文件如下:

port 7000

cluster-enabled yes

cluster-config-file nodes-7000.conf

cluster-node-timeout 5000

appendonly yes


b) 启动6个Redis实例


c) 使用redis-cli创建集群:

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1


使用C#操作Redis集群

要在C#中操作Redis集群,我们可以使用StackExchange.Redis库。以下是一个详细的例子:

首先,安装StackExchange.Redis NuGet包:

Install-Package StackExchange.Redis

然后,使用以下代码连接并操作Redis集群:

using StackExchange.Redis;

using System;


class Program

{

    static void Main(string[] args)

    {

        // 连接到Redis集群

        ConfigurationOptions config = new ConfigurationOptions

        {

            EndPoints =

            {

                { "localhost", 7000 },

                { "localhost", 7001 },

                { "localhost", 7002 },

                { "localhost", 7003 },

                { "localhost", 7004 },

                { "localhost", 7005 }

            },

            CommandMap = CommandMap.Create(new HashSet<string>

            {

                "SUBSCRIBE", "UNSUBSCRIBE", "CLUSTER"

            }, available: false),

            AllowAdmin = true

        };


        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(config);


        // 获取数据库实例

        IDatabase db = redis.GetDatabase();


        // 写入数据

        bool setResult = db.StringSet("mykey", "Hello, Redis Cluster!");

        Console.WriteLine($"Set result: {setResult}");


        // 读取数据

        string getValue = db.StringGet("mykey");

        Console.WriteLine($"Get value: {getValue}");


        // 使用哈希表

        HashEntry[] hashFields = new HashEntry[]

        {

            new HashEntry("field1", "value1"),

            new HashEntry("field2", "value2")

        };

        db.HashSet("myhash", hashFields);


        string hashValue = db.HashGet("myhash", "field1");

        Console.WriteLine($"Hash field1 value: {hashValue}");


        // 使用列表

        long listLength = db.ListLeftPush("mylist", new RedisValue[] { "item1", "item2", "item3" });

        Console.WriteLine($"List length: {listLength}");


        RedisValue listItem = db.ListRightPop("mylist");

        Console.WriteLine($"Popped item: {listItem}");


        // 使用集合

        long addedCount = db.SetAdd("myset", new RedisValue[] { "member1", "member2", "member3" });

        Console.WriteLine($"Added set members: {addedCount}");


        bool isMember = db.SetContains("myset", "member2");

        Console.WriteLine($"Is 'member2' in set: {isMember}");


        // 关闭连接

        redis.Close();

    }

}

这个例子展示了如何连接到Redis集群,以及如何执行基本的读写操作,包括字符串、哈希表、列表和集合的操作。


注意事项:

在实际应用中,你应该使用适当的异常处理来处理可能出现的连接错误或其他异常。

ConnectionMultiplexer是线程安全的,应该被重用。通常,你会在应用程序启动时创建一个ConnectionMultiplexer实例,并在整个应用程序生命周期中重用它。

在集群模式下,某些复杂的多键操作(如事务)可能不被支持或需要特殊处理,因为keys可能分布在不同的节点上。

对于大规模应用,你可能需要考虑使用连接池来管理与Redis集群的连接。

通过这种方式,你可以有效地利用Redis集群的分布式特性,实现高可用性和可扩展性。



大型应用每个节点内存数据管理

每个几点保存自己节点的数据,如需要别的节点数据配合,可以使用框架的redis消息机制实现

绑定消息函数:

BindP2PMessage("消息名",ReturnP2PMessage);


static private void  ReturnP2PMessage(string sFromServer,string message,Object m_MsgData)

        {


            WriteLog("收到消息:" + message + ",数据:" + m_MsgData.ToString());

        }


发送消息函数

定义

protected static bool PostSelfP2PMessage(string MsgType, object m_MsgData);

protected static bool PostP2PMessage(string ActionP2PServerName, string MsgType, object m_MsgData);

protected static bool PostPublicMessage(string MsgType, object m_MsgData);

例子

PostSelfP2PMessage("消息名", "自己消息数据");  

PostP2PMessage("接收消息的节点名", "消息名", "特指向消息数据");

PostPublicMessage("消息名", "公共消息数据");



抖音推荐机制探秘

标签得分公式Score(T) = Σ(行为类型权重 × 次数) / Σ总行为权重,例如观看 + 1 分、点赞 + 3 分、收藏 + 5 分

抖音的推荐机制是一个复杂而精妙的系统,主要基于用户行为数据,通过多种技术模型,经过召回、过滤、排序等环节,为用户提供个性化的内容推荐。以下是从技术角度的详细介绍:


  • 基于用户行为的技术模型1
    • 协同过滤:这是早期推荐系统的核心技术。抖音会找到与你兴趣相似的用户,把他们喜欢的内容推荐给你。例如,用户 A 和用户 B 都喜欢视频 X 和 Y,系统可能会把用户 A 喜欢的视频 Z 推荐给用户 B。系统无需了解视频内容,只需依据 “谁看了什么” 来运作。同时,系统会不断将兴趣相似用户归为一组,随着用户行为变化,其所属 “兴趣圈子” 也会改变,推荐内容也随之动态调整。
    • Wide&Deep 模型:抖音的主力推荐模型之一。Wide 部分像老朋友,能记住用户明显爱好,如用户常点赞猫咪视频,就会持续推荐相关内容。Deep 部分则像懂心理学的朋友,会研究用户行为模式,捕捉用户自己可能都未意识到的兴趣,如发现用户喜欢的萌宠视频有 “圆滚滚、会洗东西” 的特点,就可能推荐小浣熊视频。两者结合,既能满足用户已知兴趣,又能拓展新兴趣。
    • 双塔召回模型:用于从海量视频中快速找出用户可能喜欢的内容。该模型有用户塔和内容塔两座 “塔”,分别分析用户兴趣特点和视频特点,就像为用户和视频制作 “数字身份证”。用户 “身份证” 记录其观看偏好、活跃时间等,视频 “身份证” 记录内容、风格等信息。系统通过比较 “身份证”,能在几毫秒内从上亿视频中筛选出几百个匹配度高的候选视频。
  • 推荐流程4
    • 双重审核机制:采用机器与人工结合的方式。机器审核主要通过识别画面及文本关键词,检测违规内容并去重。人工审核则重点审核标题、封面和关键帧,对机器审核出的可能违规内容进一步筛查,确保内容合规。
    • 冷启动机制:通过审核的视频会进入初始流量池,抖音会为每个新视频分配 200 至 300 个活跃用户的曝光机会,新账号与大 V 账号均从零开始竞争,保证优质内容有公平的推荐机会。
    • 数据加权与加大推荐:冷启动后,系统会根据视频的完播率、点赞率、评论率和转发率这四大核心指标进行数据分析。若视频在该阶段表现优异,就会被推荐到更大的流量池,获得更多曝光。
    • 标签放大与精品推荐池:系统会根据用户行为数据为用户与视频打上标签并匹配推送。当视频进入推荐榜单,会减弱标签约束,向更广泛用户推荐,让优质内容突破原有标签限制,扩大影响力。
    • 延迟曝光机制:部分优质内容发布初期数据可能不佳,但抖音的 “旧视频挖掘算法” 会使其重新被推荐,产生 “爆款效应”,提升账号其他视频的播放量,形成二次传播。
  • 其他技术要点
    • 实时学习系统4:抖音能通过用户的实时反馈,如点赞、评论、观看时长等,不断更新用户的兴趣模型。这种在线学习机制可快速响应用户需求,在用户刷视频过程中,迅速推荐更符合其喜好的内容。
    • 多目标建模体系3:抖音以 “用户长期价值” 为核心目标,考虑完播、评论、点赞等众多目标,力图计算出更符合用户长期价值的内容。同时,为打破 “信息茧房”,设置了专门的探索维度,通过多样性打散、多兴趣召回等方法,控制相似内容出现频次,并采用随机推荐等方式,帮助用户探索新兴趣。


如何界定用户喜欢哪个视频?

抖音主要通过用户的行为数据和视频特征,并结合算法模型来界定用户是否喜欢某个视频,具体如下1


  • 用户行为数据
    • 点赞:用户点击点赞按钮是一种明确的喜欢表达,系统会认为用户对该视频有积极的态度,后续可能会推荐更多类似内容。
    • 评论:评论行为表明用户对视频内容有较高的兴趣,愿意发表自己的看法或与其他用户交流,这是用户喜欢视频的一个重要信号。
    • 分享:用户将视频分享到其他平台或社交圈子,说明该视频对用户有较大价值,能满足其某种需求,如展示自己的兴趣、与他人分享快乐等,这也是喜欢的强烈体现。
    • 关注:若用户因某个视频而关注了视频创作者,说明用户对该创作者的风格或内容感兴趣,期待看到更多相关视频,是对视频及创作者的高度认可。
    • 完播率:用户完整观看视频,表明视频内容吸引用户,使其愿意花费时间看完,尤其是对于较长的视频,完播更是喜欢的重要标志。
    • 观看时长:即使未完全看完,较长的观看时长也说明视频在一定程度上吸引了用户,系统会据此判断用户对视频的感兴趣程度。
    • 停留互动:用户在视频播放过程中暂停、重复观看某个片段,或在评论区停留较长时间,都是对视频感兴趣的表现,会被系统纳入喜欢程度的评估。
  • 视频特征与用户画像匹配:抖音会为用户和视频都打上标签。用户标签基于其历史行为数据,涵盖兴趣类别、偏好风格等;视频标签包括内容主题、类型、关键词等。当视频标签与用户标签匹配度高时,系统会认为用户可能喜欢该视频。例如,用户常观看美食类视频,系统给其打上 “美食爱好者” 标签,那么带有 “美食制作”“美食探店” 等标签的视频就更有可能被推荐给用户,若用户对这类视频有较多互动,就会进一步确认其对该类视频的喜爱。
  • 算法模型预测:抖音通过推荐算法模型,如 Wide&Deep 模型、双塔召回模型等,综合用户行为数据、视频特征和场景数据等进行计算。模型会预测用户对某个视频触发点赞、完播等行为的概率,概率越高,说明用户越可能喜欢该视频。例如,根据用户历史上对同类视频的喜好程度、当前观看场景等因素,算法会推测用户是否会喜欢新的候选视频,对于预测概率高的视频,会优先推荐给用户,并根据用户实际反馈不断优化预测结果


抖音新发的视频打标签的原理,从技术角度详细说明

抖音新发视频的打标签过程是一个高度智能化的技术系统,它通过多模态内容分析、深度学习模型和动态优化机制,自动为视频生成精准的语义标签。这些标签不仅是推荐系统理解视频内容的核心基础,也是实现个性化推荐的关键纽带。以下是从技术角度对其原理的深度解析:

一、标签的技术目标与核心逻辑

抖音的标签体系旨在将视频内容转化为结构化、可计算的语义表示,核心目标包括:


  1. 内容理解:识别视频主题、类型、情感、风格等关键信息。
  2. 精准匹配:连接用户兴趣标签与视频内容标签,驱动推荐算法高效召回候选内容。
  3. 生态治理:辅助内容审核、版权检测及违规识别(如暴力、色情等标签过滤)。


其底层逻辑是通过多源数据融合多层特征抽象,将原始视频信号(视觉、听觉、文本)转化为离散或连续的标签向量空间,供后续模型进行快速计算和推理。

二、打标签的技术流程详解

抖音为新发视频生成标签的过程主要分为以下技术阶段:

1. 原始数据提取与预处理

  • 视频解码:将上传的视频文件解码为原始帧序列、音频流及文本信息(标题、字幕、描述等)。这一步需要高效处理海量并发视频,确保低延迟和高吞吐量。
  • 关键帧提取:基于视频质量分析算法(如镜头切换检测、精彩程度评估),抽取最具代表性的关键帧(如封面图、高潮画面),减少冗余计算量。
  • 多模态特征提取:分别从视觉、听觉、文本维度提取特征:
    • 视觉特征:通过预训练的图像分类模型(如 ResNet、EfficientNet)提取物体、场景、色彩、构图等视觉语义;基于人体姿态估计(如 OpenPose)识别动作标签(舞蹈、健身、篮球等)。
    • 音频特征:使用 VGGish 等音频特征提取器将音频流转换为声学场景嵌入(如音乐类型、环境噪音、语音片段),进一步通过 ASR(自动语音识别)技术将语音转化为文本,识别关键词(如歌曲名、演讲主题词)。
    • 文本特征:通过 NLP 模型处理标题、描述及字幕文本:分词(如 Jieba 分词)、实体识别(NER,提取人名、地名、品牌词)、情感分析(正面 / 负面情绪)、主题模型(LDA 或 BERT-based 分类)生成文本标签。

2. 多模态特征融合与语义建模

  • 特征编码:将上述各模态特征编码为高维向量(如视觉特征→图像嵌入向量,音频特征→声学嵌入向量,文本→词嵌入向量)。
  • 跨模态融合:采用多模态注意力机制特征拼接技术,将不同模态信息整合为统一的视频表示向量。例如:
    • 通过文本引导的图像注意力(Text-image cross-attention)强化图像中与标题关键词相关的区域特征提取2
    • 融合后的向量可进一步输入 Transformer 架构,学习模态间的交互关系,生成更抽象的语义标签空间。
  • 标签预测模型:基于融合后的特征向量,通过分类器(如多层感知机 MLP、Transformer decoder)或预训练分类模型(如 ERNIE-ViL 用于图文理解)预测标签集合:
    • 基础分类标签:垂类标签(美食、科技、宠物等一级类目)、子类型标签(家常菜、数码评测、萌宠搞笑等二级 / 三级细分)。
    • 语义属性标签:情感(治愈、激励、搞笑)、风格(简约、复古、特效)、质量(高清、低质模糊)、版权信息(原创、二次创作)等。
    • 关键词标签:从文本和 ASR 结果中提取高频实体词或短语(如 “红烧肉教程”“iPhone 15 评测”)。

3. 标签精炼与冲突消解

  • 冗余消除:通过 TF-IDF 或词共现分析过滤低信息量或重复标签(如同一视频多次出现 “教程” 但无其他有效信息)。
  • 层级标签聚合:根据垂类体系将细粒度标签聚合为高层标签(例如 “猫抓板制作”→聚合至 “宠物用品 DIY”→“萌宠” 一级类目)7
  • 冲突解决:当不同模态预测结果冲突时(如文本标题为 “科技评测” 但视觉画面偏向游戏),通过加权投票或置信度校准(confidence calibration)确定最终标签优先级。

4. 冷启动阶段的标签迭代优化

新发视频进入初始流量池(200-300 曝光量)后,标签系统会结合用户实时反馈动态优化:


  • 行为数据回流:完播率、点赞、评论、转发等互动数据反向验证初始标签的有效性。例如:若标注为 “美食” 的视频获得大量健身用户点击但低互动,则可能需要重新评估标签匹配度。
  • 用户兴趣再校准:根据观看该视频的用户群体画像(如多数用户携带 “宠物” 标签却被推荐 “美食” 视频),系统可能推断视频存在潜在跨领域吸引力,进而扩展标签集合(如新增 “治愈系” 或 “生活技巧” 等泛标签)。
  • 长尾标签挖掘:通过关联规则学习(Apriori 算法)或深度聚类发现未被初始模型覆盖的新标签(如小众兴趣组合 “汉服 + 电竞”)。

三、关键技术模块与算法解析

  1. 多模态内容分析引擎
    • 图像理解:利用迁移学习(Transfer Learning)在大规模图像数据集(如 ImageNet)上预训练的模型,快速适应抖音视频场景,提升物体 / 场景识别精度。
    • 音频 - 文本联动:ASR 转录的语音文本与字幕文本结合,通过语言模型(如 ERNIE、BERT)进行关键词提取和主题分类,增强语义理解深度2
    • 跨模态对齐:基于对比学习(Contrastive Learning)的损失函数(如 InfoNCE),拉近视频多模态特征与对应标签语义空间的距离,确保特征与标签强关联。
  2. 深度学习模型架构
    • 标签预测网络:采用 Wide & Deep 结构兼顾记忆性(Wide 部分直接学习原始特征与标签关联)和泛化性(Deep 部分通过多层神经网络挖掘隐含语义模式),或 Transformer-based 编码器提升长序列语义建模能力7
    • 双塔召回模型应用:用户兴趣向量(用户塔)与视频内容向量(内容塔)的相似性计算依赖视频标签作为语义锚点,高效实现候选视频快速召回(例如,用户塔中 “舞蹈爱好者” 特征与内容塔 “街舞教程” 标签向量匹配)。
  3. 实时反馈与在线学习
    • 增量更新机制:用户对视频的即时互动(如点赞后系统秒级调整后续推荐)驱动模型在线更新参数,快速修正标签置信度权重,形成 “标签生成→推荐→用户反馈→模型优化” 的闭环迭代。
    • 冷启动优化策略:对于无历史数据的新视频,初期依赖内容标签刚性匹配(如 “科技” 标签用户仅接收同类视频);随着互动数据积累,逐步引入探索机制(Exploration),通过随机或贝叶斯优化(Bandit 算法)测试扩展标签覆盖范围。
  4. 标签质量保障体系
    • 双重审核机制联动:机器生成的初步标签首先经过安全 / 合规检测(如暴力、敏感词过滤),人工审核团队对关键视频(如高潜力爆款)的标签进行抽查校准,确保生态安全与内容质量5
    • AB 测试与指标监控:通过实验对比不同标签策略的用户留存、互动率等核心指标,持续迭代优化标签生成算法,例如验证新增情感标签是否提升完播率。

四、示例说明:新发美食视频的标签生成路径

假设用户上传一条标题为 “超简单红烧肉教程,新手也能做!” 的视频:


  1. 预处理:解码视频提取关键帧(红烧肉特写、烹饪步骤画面)、音频(讲解语音 + 背景音乐)及文本信息。
  2. 视觉分析:图像模型识别 “红烧肉”“厨房场景”“铁锅” 等视觉实体,结合色彩特征推断 “美食教程” 主类别。
  3. 音频处理:ASR 将语音转为文本(如 “糖色炒制技巧”“火候控制”),提取关键词标签;音乐分类模型识别背景音乐类型(生活休闲类)。
  4. 文本解析:标题分词为 “红烧肉”“教程”“新手”“简单”,NER 标注实体词;主题模型分类至 “美食→家常菜→烹饪技巧” 垂类层级。
  5. 多模态融合:融合视觉特征(食材视觉吸引力)、文本关键词(教程、新手友好)及音频语义(详细步骤讲解),生成标签集合:
    • 核心标签:“红烧肉教程”“家常菜”“新手友好”
    • 扩展标签:“治愈系”“厨房生活”“慢生活技巧”(若初始流量池用户反馈显示跨领域吸引力)。
  6. 冷启动验证:根据首批观众互动数据(如大量点赞 + 收藏但低转发),可能增强 “实用技巧” 标签权重,或根据观众画像新增 “上班族快手菜” 等长尾标签。

五、挑战与技术演进方向

  1. 复杂语义理解瓶颈
    幽默、隐喻、文化梗等非结构化内容(如 “凡尔赛文学” 视频)的精准标签仍依赖更先进的多模态深度理解模型(如基于知识图谱的常识推理)。
  2. 时效性与长尾内容覆盖
    热点事件(如突发新闻、流行梗)需秒级生成动态标签;小众兴趣(如 “古风手作”)需增强长尾聚类与关联规则挖掘能力。
  3. 公平性与信息茧房规避
    通过标签打散机制(Diversity Shaking)或可控探索(如随机插入 15%-20% 跨标签视频),平衡精准性与用户兴趣多样性发展。
  4. 联邦学习与隐私保护
    在用户端设备进行轻量化特征提取(如边缘 AI 芯片预处理视觉特征),减少原始数据传输,符合 GDPR / 等隐私法规。

总结

抖音新发视频的打标签原理是通过多模态内容分析深度特征融合实时反馈迭代,将原始视频信号转化为结构化语义标签的过程。这一系统依赖计算机视觉、语音处理、自然语言处理及深度学习的协同发力,为推荐系统提供精准的内容索引,同时通过冷启动优化和在线学习机制,持续适应内容生态的动态变化。其核心价值在于构建用户兴趣与视频内容之间的高效语义桥梁,驱动个性化推荐体验的持续进化,同时保障平台内容生态的健康与安全。未来,随着多模态大模型(如生成式 AI 理解复杂创意内容)及边缘计算技术的发展,标签生成的精度、时效性及长尾覆盖能力将进一步提升。













Top