推荐算法的本质是兴趣匹配的概率计算
很多用户在使用Instagram时都会产生疑问:为什么平台推荐的内容越来越符合自己的偏好?事实上,推荐系统并不具备读懂用户想法的能力,其本质是通过分析用户行为数据、内容特征,计算用户与内容的匹配概率,最终筛选出用户可能感兴趣的内容。
早期互联网平台的内容展示多采用时间序排序,用户获取感兴趣的内容完全依赖主动搜索或关注账号。随着平台内容量爆发式增长,Instagram每天新增数百万条帖子,传统展示方式已经无法满足用户的信息获取需求,推荐系统成为内容平台的核心基础设施。
一、推荐系统的核心架构:召回-排序-重排三段式链路
现代工业级推荐系统普遍采用多阶段漏斗式架构,通过层层筛选在计算效率和推荐精度之间取得平衡。整体流程如下:
┌─────────────────────────────────────────────┐
│ 全量内容池(千万级) │
└─────────────────────┬───────────────────────┘
▼
┌─────────────────────────────────────────────┐
│ 召回层(Recall) │
│ ┌──────────┬──────────┬────────┬────────┐ │
│ │协同过滤 │内容标签 │热度召回│图算法 │ │
│ └──────────┴──────────┴────────┴────────┘ │
└─────────────────────┬───────────────────────┘
▼
候选集(千级)
▼
┌─────────────────────────────────────────────┐
│ 粗排层(Pre-Ranking) │
│ 轻量模型快速筛选,保留百级 │
└─────────────────────┬───────────────────────┘
▼
候选集(百级)
▼
┌─────────────────────────────────────────────┐
│ 精排层(Ranking) │
│ DeepFM / DIN / SlimPer 深度模型排序 │
└─────────────────────┬───────────────────────┘
▼
候选集(十级)
▼
┌─────────────────────────────────────────────┐
│ 重排层(Re-Ranking) │
│ ┌──────┬──────┬──────┬──────┬─────────┐ │
│ │ 去重 │多样性│广告插入│新内容扶持│社交关系│ │
│ └──────┴──────┴──────┴──────┴─────────┘ │
└─────────────────────┬───────────────────────┘
▼
┌─────────────────────────────────────────────┐
│ 最终展示内容(Feed流) │
└─────────────────────────────────────────────┘
召回层(Recall)
召回层的核心目标是从千万级内容池中快速筛选出千级别候选集,对性能要求极高,通常要求毫秒级响应。
多路召回策略:
| | 召回策略 | 核心原理 | 适用场景 |
|———|———|———|
| 协同过滤召回 | 相似用户喜欢的内容推荐给目标用户 | 有丰富行为数据的活跃用户 |
| 内容标签召回 | 基于用户历史兴趣标签匹配内容特征 | 冷启动、新用户 |
| 热度召回 | 全局热门内容优先推荐 | 热门事件、爆款内容 |
| 图算法召回 | 基于社交关系图传播推荐 | 有社交关系的平台 |
| 向量召回 | 将用户和内容映射到同一向量空间做相似度匹配 | 大规模内容池高效检索 |
粗排层(Pre-Ranking)
粗排层使用轻量级模型对召回的千级候选集进行快速打分排序,筛选出百级候选集进入精排层。常用模型包括:
浅层神经网络(2-3层MLP)
双塔模型(用户塔 + 物品塔)
基于特征交叉的轻量模型
精排层(Ranking)
精排层是推荐系统的核心,使用复杂深度学习模型对百级候选集进行精准打分排序。主流模型包括:
DeepFM:结合因子分解机和深度网络,同时捕获低阶和高阶特征交叉
DIN(Deep Interest Network):通过注意力机制建模用户历史行为与候选内容的相关性
SlimPer:Meta自研的轻量级精排模型,在保持精度的同时大幅降低推理延迟
重排层(Re-Ranking)
重排层在精排结果基础上进行业务规则调整:
去重:避免同一来源内容重复出现
多样性打散:同类型内容间隔展示,避免信息茧房
广告插入:在自然内容中穿插广告位
新内容扶持:给新发布内容一定曝光机会
社交关系加权:好友互动过的内容提升排序
二、用户兴趣建模:行为信号与兴趣向量
推荐系统的精度取决于对用户兴趣的理解深度。现代推荐系统将用户兴趣表示为高维向量,通过持续的行为信号进行动态更新。
用户行为信号权重体系
不同用户行为对兴趣判断的价值不同:
| 完播/长停留 | 1.0 | 强正信号,说明内容真正吸引用户 |
| 分享/转发 | 0.9 | 强正信号,用户愿意背书 |
| 收藏/保存 | 0.8 | 强正信号,有复看意图 |
| 点赞 | 0.5 | 中等正信号,认可但成本低 |
| 评论 | 0.5 | 中等正信号,有互动意愿 |
| 快速跳过 | -0.3 | 负信号,不感兴趣 |
| 点击"不感兴趣" | -1.0 | 强负信号,明确拒绝 |
用户兴趣向量更新逻辑
以下是用户兴趣向量的核心更新逻辑:
def update_user_profile(user_profile, behavior_event):
“”"
根据用户行为事件更新兴趣画像向量
参数:
user_profile: 用户当前兴趣向量,key为内容标签,value为兴趣权重
behavior_event: 行为事件对象,包含content_tag(内容标签)、
behavior_type(行为类型)、duration(停留时长)
"""
# 不同行为对应的权重系数
behavior_weight = {
"share": 1.0, # 分享:强正信号
"save": 0.8, # 收藏:强正信号
"complete_watch": 0.7, # 完播:强正信号
"like": 0.5, # 点赞:中等正信号
"comment": 0.5, # 评论:中等正信号
"quick_skip": -0.3, # 快速跳过:负信号
"not_interested": -1.0, # 明确不感兴趣:强负信号
}
# 获取行为权重
weight = behavior_weight.get(behavior_event.behavior_type, 0.0)
# 结合停留时长的衰减系数(停留越长,信号越强)
duration_factor = min(behavior_event.duration / 60.0, 1.0)
# 更新对应标签的兴趣权重
tag = behavior_event.content_tag
user_profile[tag] += weight * duration_factor
# 兴趣衰减:所有标签的兴趣权重随时间衰减,避免历史行为过度影响
decay_rate = 0.95
user_profile = {k: v * decay_rate for k, v in user_profile.items()}
# 确保权重在合理范围内
user_profile = {k: max(-1.0, min(1.0, v)) for k, v in user_profile.items()}
return user_profile
协同过滤算法原理
协同过滤(Collaborative Filtering)是推荐系统最经典的算法之一,核心思想是"相似的用户喜欢相似的内容"。
基于用户的协同过滤(User-Based CF):
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def user_based_cf(user_item_matrix, target_user, top_k=10):
“”"
基于用户的协同过滤推荐
参数:
user_item_matrix: 用户-物品交互矩阵(行:用户,列:物品,值:评分/交互次数)
target_user: 目标用户索引
top_k: 返回推荐物品数量
"""
# 计算用户之间的余弦相似度
user_similarities = cosine_similarity(user_item_matrix)
# 获取与目标用户最相似的K个用户
target_sim = user_similarities[target_user]
target_sim[target_user] = 0 # 排除自己
# 找到最相似的邻居用户
k_neighbors = np.argsort(target_sim)[::-1][:50]
# 聚合邻居用户交互过的物品
item_scores = {}
for neighbor in k_neighbors:
sim_score = target_sim[neighbor]
# 获取邻居用户交互过的物品
interacted_items = np.where(user_item_matrix[neighbor] > 0)[0]
for item in interacted_items:
if user_item_matrix[target_user, item] == 0: # 目标用户未交互过
item_scores[item] = item_scores.get(item, 0) + sim_score * user_item_matrix[neighbor, item]
# 按推荐分数排序
sorted_items = sorted(item_scores.items(), key=lambda x: x[1], reverse=True)
return [item for item, score in sorted_items[:top_k]]
基于物品的协同过滤(Item-Based CF):
def item_based_cf(user_item_matrix, user_history_items, top_k=10):
“”"
基于物品的协同过滤推荐
参数:
user_item_matrix: 用户-物品交互矩阵
user_history_items: 用户历史交互过的物品列表
top_k: 返回推荐物品数量
"""
# 计算物品之间的余弦相似度(对矩阵转置后计算)
item_similarities = cosine_similarity(user_item_matrix.T)
# 对候选物品打分
item_scores = {}
num_items = user_item_matrix.shape[1]
for candidate_item in range(num_items):
if candidate_item in user_history_items:
continue # 已交互过的物品跳过
score = 0
for history_item in user_history_items:
score += item_similarities[candidate_item, history_item]
item_scores[candidate_item] = score
sorted_items = sorted(item_scores.items(), key=lambda x: x[1], reverse=True)
return [item for item, score in sorted_items[:top_k]]
三、深度学习排序模型:从DeepFM到DIN
精排层使用的深度学习模型是推荐系统技术含量最高的部分,下面介绍三种主流模型的核心原理。
DeepFM:因子分解机 + 深度网络的融合
DeepFM的核心创新在于同时捕获低阶特征组合和高阶特征组合:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Embedding, Flatten, concatenate
from tensorflow.keras.models import Model
class DeepFM(Model):
“”"
DeepFM模型:FM部分捕获低阶特征交叉,Deep部分捕获高阶特征交叉
“”"
def init(self, num_fields, embed_dim, deep_layers):
super(DeepFM, self).init()
self.num_fields = num_fields # 特征字段数量
self.embed_dim = embed_dim # 嵌入维度
# 嵌入层
self.embedding = Embedding(input_dim=10000, output_dim=embed_dim)
# FM部分:一阶线性部分 + 二阶交叉部分
self.fm_first_order = Dense(1, use_bias=True)
# Deep部分:多层感知机
self.deep_layers_list = []
prev_dim = num_fields * embed_dim
for layer_dim in deep_layers:
self.deep_layers_list.append(Dense(layer_dim, activation='relu'))
prev_dim = layer_dim
# 最终输出层
self.output_layer = Dense(1, activation='sigmoid')
def call(self, inputs):
# inputs: [batch_size, num_fields]
embeds = self.embedding(inputs) # [batch_size, num_fields, embed_dim]
# FM一阶部分
fm_first = self.fm_first_order(Flatten()(embeds))
# FM二阶部分(简化版)
sum_embeds = tf.reduce_sum(embeds, axis=1)
sum_square_embeds = tf.square(sum_embeds)
square_sum_embeds = tf.reduce_sum(tf.square(embeds), axis=1)
fm_second = 0.5 * tf.reduce_sum(sum_square_embeds – square_sum_embeds, axis=1, keepdims=True)
# Deep部分
deep_input = Flatten()(embeds)
deep_out = deep_input
for layer in self.deep_layers_list:
deep_out = layer(deep_out)
# 融合FM和Deep的输出
combined = concatenate([fm_first, fm_second, deep_out])
output = self.output_layer(combined)
return output
DIN(Deep Interest Network):注意力机制建模用户兴趣
DIN的核心创新是引入注意力机制,根据候选物品动态激活用户历史行为中的相关部分:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Concatenate, Multiply, Lambda
def dice(x, name=‘dice’):
“”"
DIN中使用的DICE激活函数(Data Adaptive Activation Function)
比传统ReLU更适合推荐场景的稀疏特征
“”"
alpha = tf.Variable(tf.zeros(x.shape[-1:]), name=name + ‘_alpha’)
ps = tf.nn.sigmoid(x)
return ps * x + (1 – ps) * alpha * x
def attention_layer(query, keys, values, keys_length):
“”"
局部注意力层:根据候选物品(query)计算用户历史行为(keys)的注意力权重
参数:
query: 候选物品向量 [batch_size, embed_dim]
keys: 用户历史行为物品向量 [batch_size, history_len, embed_dim]
values: 用户历史行为物品向量(通常与keys相同)
keys_length: 每个用户实际历史行为长度
"""
history_len = tf.shape(keys)[1]
query_expand = tf.tile(tf.expand_dims(query, 1), [1, history_len, 1])
# 计算注意力分数:[query, keys, query-keys, query*keys]
din_unit = Concatenate(axis=-1)([
query_expand,
keys,
query_expand – keys,
query_expand * keys # 逐元素乘法(element-wise multiply)
])
# 通过MLP计算注意力权重
attention_scores = Dense(80, activation='relu')(din_unit)
attention_scores = Dense(40, activation='relu')(attention_scores)
attention_scores = Dense(1, activation=None)(attention_scores)
attention_scores = tf.squeeze(attention_scores, axis=-1) # [batch_size, history_len]
# 掩码:将padding位置设为负无穷
mask = tf.sequence_mask(keys_length, maxlen=history_len)
paddings = tf.ones_like(attention_scores) * (-2 ** 32 + 1)
attention_scores = tf.where(mask, attention_scores, paddings)
# Softmax归一化
attention_weights = tf.nn.softmax(attention_scores) # [batch_size, history_len]
# 加权求和
output = tf.reduce_sum(tf.expand_dims(attention_weights, -1) * values, axis=1)
return output, attention_weights
四、LLM与大模型在推荐系统中的应用
2025—2026年,大语言模型(LLM)开始深度融入推荐系统,主要体现在以下三个方面:
内容理解与特征提取
传统推荐系统依赖人工标注的内容标签,而LLM可以自动理解内容的深层语义:
使用LLM进行内容特征提取的示例流程
以下为伪代码,仅展示逻辑流程
def extract_content_features_with_llm(content_text, content_image=None):
“”"
使用大语言模型提取内容特征
流程:
LLM理解文本内容的主题、情感、风格
多模态模型理解图片/视频的视觉特征
输出结构化的内容特征向量
"""
# Step 1: 文本特征提取
text_prompt = f"""
请分析以下内容的特征,返回JSON格式:
主题分类(最多3个)
情感倾向(positive/neutral/negative)
内容风格(搞笑/教育/娱乐/新闻等)
目标受众(年龄段、兴趣群体)
关键词(最多5个)
内容: {content_text}
"""
# 调用LLM API(伪代码)
llm_response = call_llm_api(text_prompt)
structured_features = parse_json(llm_response)
# Step 2: 将结构化特征映射到推荐系统的特征向量
feature_vector = map_to_embedding(structured_features)
return feature_vector
生成式推荐(Generative Recommendation)
Meta在2024年推出了SlimPer和生成式推荐框架,将推荐问题转化为生成问题:
生成式推荐的核心思路:将推荐转化为序列生成
以下为伪代码,仅展示逻辑流程
def generative_recommendation(user_history, context_features, llm_model):
“”"
生成式推荐:使用LLM直接生成推荐内容ID序列
与传统"召回-排序"范式不同,生成式推荐将用户历史行为作为prompt,
让LLM直接生成下一个最可能感兴趣的内容ID
"""
# 构建prompt
prompt = build_recommendation_prompt(
user_history=user_history, # 用户历史交互序列
context=context_features, # 当前上下文(时间、位置等)
task="predict_next_item" # 任务类型
)
# LLM生成推荐内容ID
generated_item_ids = llm_model.generate(
prompt,
max_new_tokens=10,
temperature=0.7
)
return generated_item_ids
用户画像与意图理解
LLM可以更深入地理解用户意图,而不仅仅依赖行为统计:
以下为伪代码,仅展示逻辑流程
def enhance_user_profile_with_llm(user_behaviors, user_profile):
“”"
使用LLM增强用户画像:从行为序列中推断深层兴趣
输入:
user_behaviors: 用户最近N条行为记录
user_profile: 现有用户画像向量
输出:
enhanced_profile: 增强后的用户画像
"""
# 构建用户行为摘要prompt
behavior_summary = ""
for b in user_behaviors[-20:]: # 最近20条行为
behavior_summary += f"[{b.timestamp}] {b.action}了关于{b.topic}的内容n"
prompt = f"""
根据以下用户行为记录,推断该用户的:
当前主要兴趣方向(最多3个)
兴趣变化趋势(新增兴趣/减弱兴趣)
内容偏好风格
行为记录:
{behavior_summary}
"""
llm_insights = call_llm_api(prompt)
# 将LLM推断的兴趣融入用户画像向量
enhanced_profile = merge_llm_insights(user_profile, llm_insights)
return enhanced_profile
五、用户可控推荐:Your Algorithm功能
2025年,Instagram推出了Your Algorithm功能,将推荐系统的控制权部分交还给用户。这一功能的技术实现如下:
功能架构
| 调整兴趣滑块(如"更多旅行内容") | 提升对应标签的召回权重 | 召回层权重系数动态调整 |
| 屏蔽某类内容 | 在重排层过滤该类内容 | 重排层规则引擎 |
| 选择"探索新内容"模式 | 降低历史行为权重,增加多样性 | 兴趣向量衰减加速 + 多样性采样 |
| 选择"只看关注的人" | 切换到社交关系召回主通路 | 召回策略切换 |
技术实现原理
def apply_user_preferences(feed_items, user_preferences):
“”"
根据用户偏好设置调整推荐结果
参数:
feed_items: 推荐候选内容列表
user_preferences: 用户偏好设置(兴趣权重、屏蔽列表等)
"""
adjusted_items = []
for item in feed_items:
score = item.original_score
# 1. 兴趣权重调整
if item.topic in user_preferences.interest_boosts:
score *= (1 + user_preferences.interest_boosts[item.topic])
# 2. 屏蔽过滤
if item.topic in user_preferences.blocked_topics:
continue
# 3. 多样性控制
if user_preferences.exploration_mode:
# 探索模式:降低热门内容权重,提升新颖内容
score = score * 0.7 + item.novelty_score * 0.3
# 4. 社交关系加权
if user_preferences.following_only:
if not item.is_from_following:
continue
score *= 1.5
item.adjusted_score = score
adjusted_items.append(item)
# 按调整后分数重新排序
adjusted_items.sort(key=lambda x: x.adjusted_score, reverse=True)
return adjusted_items
六、推荐系统的评估指标
推荐系统的效果评估是持续优化的基础,主要指标包括:
离线评估指标
指标 含义 适用场景
| AUC | 模型区分正负样本的能力 | 排序模型离线评估 |
| NDCG@K | 考虑排序位置的相关性指标 | 推荐列表质量评估 |
| Hit Rate@K | 前K个推荐中命中用户实际点击的比例 | 召回层评估 |
| MRR | 首个相关结果的排名倒数 | 搜索+推荐联合评估 |
在线评估指标
指标 含义 业务价值
| 点击率(CTR) | 推荐内容被点击的比例 | 内容吸引力 |
| 完播率 | 视频内容被完整观看的比例 | 内容质量核心指标 |
| 停留时长 | 用户在Feed流的总停留时间 | 平台粘性 |
| 分享率 | 内容被分享的比例 | 内容传播价值 |
| 负反馈率 | "不感兴趣"点击比例 | 推荐精准度反面指标 |
七、常见问题与技术挑战
冷启动问题
新用户或新内容缺乏行为数据,传统协同过滤无法工作。解决方案:
以下为伪代码,仅展示逻辑流程
def cold_start_recommendation(new_user_features, content_pool):
“”"
冷启动推荐策略
基于用户注册信息(年龄、性别、地区)做粗粒度推荐
热门推荐兜底
探索性推荐(Bandit算法)
"""
recommendations = []
# 策略1:人口统计学推荐
demo_based = demographic_recommendation(new_user_features)
recommendations.extend(demo_based[:3])
# 策略2:热门推荐(保证内容质量下限)
hot_items = get_hot_items(category=new_user_features.interest_category, limit=2)
recommendations.extend(hot_items)
# 策略3:Thompson Sampling探索
for _ in range(5):
item = thompson_sampling_sample(content_pool)
recommendations.append(item)
return recommendations
信息茧房与多样性
过度个性化会导致用户陷入信息茧房,解决方案:
MMR(最大边际相关性)重排:在相关性和多样性之间权衡
探索与利用(E&E)策略:定期插入探索性内容
长尾内容扶持:给低曝光高质量内容曝光机会
总结
现代推荐系统已经从简单的协同过滤演进为融合深度学习、大语言模型、生成式AI的复杂工程系统。核心架构的召回-排序-重排三段式范式仍然是工业界的主流选择,但在每个环节都有大量技术创新:
召回层:从传统CF发展到向量召回、图神经网络召回
排序层:从逻辑回归发展到DeepFM、DIN等深度学习模型
内容理解:从人工标签发展到LLM自动语义理解
推荐范式:从检索式推荐向生成式推荐演进
用户体验:从完全黑盒向用户可控(Your Algorithm)方向发展
对于开发者而言,理解推荐系统的技术原理不仅有助于从事相关工作,也能更好地理解日常使用的各类内容平台背后的技术逻辑。
网硕互联帮助中心


评论前必须登录!
注册