博客 / 詳情

返回

從零構建短視頻推薦系統:雙塔算法架構解析與代碼實現

刷短視頻本來只想看幾分鐘,不知不覺一個多小時就沒了。每條視頻都恰好戳中你的興趣點,這種精準推送背後其實是一套相當複雜的工程架構。

這種"讀心術"般的推薦效果並非偶然。驅動這種短視頻頁面的核心引擎,正是業內廣泛採用的雙塔推薦系統(Two-Tower Recommendation System)。

本文將從技術角度剖析:雙塔架構的工作原理、為何在短視頻場景下表現卓越,以及如何構建一套類似的推薦系統。

推薦系統:注意力經濟的核心武器

注意力經濟時代,個性化推薦已經成為平台的基本能力。傳統的"熱門榜單"模式早已過時——因為用户很快就會感到內容乏味,並且推薦內容單一,無法吸引用户最終流失。

而短視頻的成功在於能夠預判用户需求,這也就是説為什麼推薦系統成為當今最具商業價值的 AI 應用之一:

Netflix 通過推薦決定你下一部追的劇,YouTube 用算法填滿你的首頁和 Shorts 流,Amazon 靠推薦驅動購買決策,Spotify 的 Discover Weekly 幫你發現新音樂。

但論推薦效果,TikTok/抖音應該説是做到了極致。除了響應速度極快,個性化程度還極高。

雙塔架構:兩個"大腦"的協作機制

雙塔系統本質上是兩個獨立但協調的神經網絡模塊:

用户塔(User Tower)專門建模用户特徵——偏好習慣、行為模式、上下文信息等等。物品塔(Item Tower)則負責理解內容特徵——視頻屬性、創作者風格、話題標籤等。

這種設計的巧妙之處在於將複雜的用户-內容匹配問題,轉化為兩個向量空間的相似度計算。

技術實現細節拆解

用户塔的特徵工程

用户塔的任務是將用户的所有行為數據壓縮成一個稠密向量表示,這個向量可以理解為用户的"數字指紋"。

輸入特徵通常包括:歷史觀看記錄及停留時長、互動行為(點贊、分享、評論、關注),時間和地理位置等上下文信息,以及用户基礎屬性(年齡、性別等,如果可獲取)。

這些原始特徵經過 embedding 層和多層神經網絡處理,最終輸出一個固定維度的向量。這個向量在某種程度上"記住"了用户的興趣偏好。

物品塔的內容理解

物品塔負責將每條物品轉換為相應的向量表示。

以視頻為例視頻特徵相對更加多元化:基礎 ID 信息(視頻 ID、創作者 ID),內容標籤和話題分類,音頻特徵(BGM、音效等),文本信息(標題、字幕、ASR 轉錄文本),視覺特徵(通常使用預訓練的 CNN 模型提取關鍵幀或縮略圖的特徵向量)。

同樣經過神經網絡處理後,每條視頻都得到一個與用户向量處於同一語義空間的表示向量。

向量匹配與相似度計算

兩個塔產生的向量如何進行匹配?最直接的方法是計算向量間的點積或餘弦相似度。相似度越高,表明用户對該視頻的潛在興趣越大。

但是面對百萬級別的視頻庫,逐一計算顯然不現實。所以就需要用到近似最近鄰搜索(ANN)技術,比如 Facebook 開源的 Faiss 或者 Google 的 ScaNN。這些工具能夠在毫秒級時間內從海量向量中找出最相似的候選集合。

從啓動到推薦:完整的數據流

當用户打開 短視頻時,後台的推薦流程大致如下:

首先實時計算或獲取用户的最新特徵向量。接着通過 ANN 檢索從全量視頻庫中召回幾千個潛在候選。然後使用更復雜的排序模型對候選視頻進行精排,考慮預期觀看時長、互動概率等多個目標。

在內容輸出前還會應用各種業務規則:內容去重避免相似視頻連續出現,新內容扶持保證流量分配的公平性,安全審核過濾違規內容。最後將排序好的視頻推送到用户端,整個過程只需要幾十毫秒以內就可以完成。

雙塔模型的代碼實現

想要實現一個簡化版的雙塔模型,可以參考以下代碼框架。

數據準備階段

  # Example log data (user_id, video_id, watch_time, liked)  
 logs = [  
     ("user1", "video123", 5.2, True),  
     ("user1", "video456", 1.1, False),  
     ("user2", "video789", 8.5, True),  
 ]

特徵存儲系統

實際生產環境中需要構建實時特徵存儲系統。用户特徵可能包括不同類別內容的觀看統計、活躍時段分佈等。視頻特徵則涵蓋分類標籤、互動指標聚合值等。

特徵存儲的核心是保證訓練和推理階段特徵的一致性,同時滿足低延遲的在線服務需求。

模型訓練

雙塔模型採用對比學習的訓練方式。正樣本來自真實的用户-視頻交互記錄,負樣本則通過隨機採樣生成。訓練目標是讓正樣本對應的用户向量和視頻向量儘可能接近,負樣本對應的向量儘可能遠離。

常用的損失函數包括 InfoNCE,配合 in-batch negatives 策略能夠有效提升訓練效率。

 import tensorflow as tf  
from tensorflow.keras.layers import Input, Dense, Embedding, Dot  

# User Tower  
user_input = Input(shape=(1,), name="user_id")  
user_embedding = Embedding(num_users, 64)(user_input)  
user_vec = Dense(32, activation="relu")(user_embedding)  

# Item Tower  
item_input = Input(shape=(1,), name="item_id")  
item_embedding = Embedding(num_items, 64)(item_input)  
item_vec = Dense(32, activation="relu")(item_embedding)  

# Dot Product (Interaction)  
dot_product = Dot(axes=1)([user_vec, item_vec])  

model = tf.keras.Model(inputs=[user_input, item_input], outputs=dot_product)  
model.compile(optimizer="adam", loss="binary_crossentropy")  
 model.fit([user_ids, item_ids], labels, epochs=10)

向量索引構建

模型訓練完成後,需要為所有視頻預計算向量表示,並構建 ANN 索引以支持快速檢索。

 import faiss  

# Store all item embeddings in Faiss for fast search  
item_embeddings = model.get_layer("item_embedding").get_weights()[0]  
index = faiss.IndexFlatIP(32)  # Inner Product search  
index.add(item_embeddings)  

# Get recommendations for a user  
user_embedding = user_model.predict(["user123"])  
 _, recommended_ids = index.search(user_embedding, k=10)  # Top 10 videos

線上服務部署

生產環境的推薦服務需要處理實時用户請求。系統接收用户特徵後,調用用户塔計算向量表示,然後查詢 ANN 索引獲取候選集,最後經過排序模型輸出最終推薦結果。

整個鏈路的延遲控制是關鍵指標,通常要求在 100 毫秒以內完成。

 import tensorflow as tf  

# A simple two-tower model using user IDs and item IDs  
class TwoTowerModel(tf.keras.Model):  
    def __init__(self, user_vocab_size, item_vocab_size, embed_dim):  
        super().__init__()  
        # Embedding layers for users and items (learnable lookup tables)  
        self.user_embedding = tf.keras.layers.Embedding(input_dim=user_vocab_size, output_dim=embed_dim)  
        self.item_embedding = tf.keras.layers.Embedding(input_dim=item_vocab_size, output_dim=embed_dim)  

    def call(self, inputs):  
        user_id, item_id = inputs  # expecting user and item IDs as inputs  
        # Get embeddings for user and item  
        user_vec = self.user_embedding(user_id)    # shape: [batch_size, embed_dim]  
        item_vec = self.item_embedding(item_id)    # shape: [batch_size, embed_dim]  
        # Compute dot product similarity (and squeeze to 1D)  
        score = tf.reduce_sum(user_vec * item_vec, axis=1)  
        return score  

# Example usage:  
model = TwoTowerModel(user_vocab_size=10000, item_vocab_size=50000, embed_dim=32)  
user_ids = tf.constant([123])  # a sample user ID  
item_ids = tf.constant([456])  # a sample item ID  
predicted_score = model((user_ids, item_ids)).numpy()  
 print("Predicted score:", predicted_score)

工程實踐中的核心挑戰

冷啓動問題是推薦系統的經典難題。新用户缺乏歷史行為數據,新視頻沒有互動反饋,這時需要依賴內容特徵和一些啓發式規則來進行推薦。

流行度偏差同樣需要重點關注。熱門內容容易獲得更多曝光,形成馬太效應。平衡熱門內容和長尾內容的分發比例,關係到內容生態的健康發展。

特徵一致性在工程實踐中經常被忽視。離線訓練和在線推理使用的特徵定義必須嚴格一致,否則會導致模型效果大幅下降。

效果評估體系

推薦系統的評估需要結合在線和離線指標。

在線指標主要關注用户實際行為:點擊率(CTR)、觀看時長、完播率、互動率等。這些指標直接反映推薦效果對用户體驗的影響。

離線指標則用於模型開發階段的快速評估:召回率@K 衡量候選召回的質量,NDCG 評估排序效果,AUC 反映分類性能等。

雙塔架構的核心優勢

短視頻推薦對響應速度要求極高,用户不會為了等待推薦結果而忍受幾秒鐘的加載時間。

雙塔架構在這方面表現出色:向量可以離線預計算,大幅減少在線計算開銷;架構簡單清晰,容易做水平擴展;能夠自然地融合協同過濾和內容過濾的優勢。

相比於複雜的深度模型,雙塔系統在保證效果的同時更易於工程實現和維護。

短視頻推薦效果看似神奇,實際上是大量工程優化和算法創新的結果。

整個系統的核心邏輯其實不復雜:把用户偏好和內容特徵都編碼成向量,然後在高維空間中進行相似度匹配。難點在於如何設計特徵、如何訓練模型、如何優化工程性能。

用户塔將觀看歷史、互動行為、時間上下文等信息壓縮為 256 維向量,例如

[0.2, -0.7, ..., 0.4]

視頻塔將內容元數據、音頻特徵、創作者信息等編碼為同樣維度的向量,例如

[-0.1, 0.5, ..., 0.3]

實時匹配通過餘弦相似度計算用户向量和視頻向量的匹配程度,使用 FAISS 等工具實現毫秒級的近似最近鄰檢索,找出最相關的 50 條候選視頻。

最終的推薦列表還會根據時效性、多樣性等業務規則進行調整,確保在 10 毫秒內完成整個推薦流程。

總結

我們上面這只是推薦系統的基礎架構。真正的產品化還需要考慮更多細節:多目標優化、實時反饋、AB 測試、內容安全等等。但雙塔模型為這些複雜需求提供了一個穩定可靠的技術基礎。

完整代碼:

https://avoid.overfit.cn/post/8a6c8f94d2764cc9bdf9e7fc781e09f5

作者:Prem Vishnoi

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.