
核心是通过大模型(如Siamese网络或Transformer)编码商品多模态特征(属性+文本),利用对比学习找到相似商品,结合用户行为数据,为“猜你喜欢”模块提供高效、个性化的相似商品推荐。
首先,特征工程:商品特征分为结构化属性(如品牌、价格、类别、规格,用one-hot或嵌入向量表示)和自然语言文本(如标题、详情页,用预训练的BERT等模型转化为语义向量)。需将两类特征融合,形成商品的全局表示。
模型选择:
训练流程:采用对比学习(Contrastive Learning),正样本为用户购买的商品对(同一用户购买的商品视为正样本,如用户购买A和B,则A和B为正样本对);负样本为随机商品或不同用户购买的商品。损失函数用InfoNCE(InfoNCE Loss),通过最大化正样本间相似度、最小化负样本间相似度,优化模型。
应用逻辑:“猜你喜欢”模块中,用户浏览/购买某商品时,用模型编码该商品向量,计算与所有商品的相似度(如余弦相似度),选取top K相似商品加入推荐列表。
| 模型类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Siamese网络 | 两个分支共享参数,输入两个样本,输出相似度 | 结构简单,计算高效,适合属性+文本联合编码 | 商品属性和文本描述都重要,且需要快速计算相似度(如实时推荐) | 需设计合理的正负样本对,避免过拟合 |
| Transformer | 基于自注意力机制,处理序列数据 | 能捕捉长距离依赖,语义理解能力强 | 商品文本描述较长(如详情页),需理解深层语义(如“适合运动”的语义关联) | 计算复杂度高,训练资源需求大,推理慢 |
| 传统方法(余弦相似度) | 直接计算向量夹角 | 简单高效,但无法捕捉语义 | 商品特征简单(如仅属性),且需大量预计算 | 无法处理文本语义,推荐效果有限 |
(伪代码,以Siamese网络为例)
# 1. 数据预处理:整合商品特征
def preprocess_item(item):
# 属性特征:one-hot编码或嵌入
attrs = encode_attributes(item['attributes']) # e.g., [1,0,1](品牌、价格、类别)
# 文本特征:用BERT得到向量
text_vec = get_bert_embedding(item['description']) # e.g., [0.1, -0.2, ...]
return np.concatenate([attrs, text_vec]) # 最终向量维度:属性维度+文本维度
# 2. 训练模型(Siamese网络)
def train_siamese_model(train_data):
model = SiameseModel() # 两个分支共享参数
for epoch in range(epochs):
for batch in train_loader:
items1, items2, labels = batch # items1: 正样本商品1, items2: 正样本商品2, labels: 1(正)或0(负)
# 前向传播:编码两个商品向量
outputs = model(items1, items2)
# 计算对比损失(InfoNCE)
loss = contrastive_loss(outputs, labels)
# 反向传播优化
loss.backward()
optimizer.step()
return model
# 3. 推荐逻辑:用户购买商品后,找相似商品
def get_similar_items(user_item, model, top_k=10):
user_vec = model.encode(user_item) # 编码用户购买的商品
all_items_vec = model.encode_all_items() # 编码所有商品
similarities = np.dot(all_items_vec, user_vec.T) # 计算余弦相似度
top_items = np.argsort(similarities)[-top_k:] # 取top_k相似商品
return top_items
(约80秒,自然表达)
“面试官您好,针对商品相似度推荐系统,我的设计思路是:首先,特征工程上,整合商品的结构化属性(如品牌、价格、类别)和文本描述(标题、详情页),分别通过嵌入层和预训练的BERT模型转化为向量。然后,模型选择上,采用Siamese网络,两个分支共享参数,输入两个商品向量,输出它们的相似度分数。训练时,利用对比学习,正样本是用户购买的商品对(同一用户购买的商品视为正样本),负样本是随机商品或不同用户购买的商品,通过InfoNCE损失函数优化模型。训练完成后,在“猜你喜欢”模块中,当用户浏览或购买某商品时,用模型编码该商品向量,计算与所有商品的相似度,选取top K相似商品推荐。这样能捕捉商品的多维度特征,提升推荐的相关性。”
问题1:如何处理冷启动用户(新用户或新商品)?
回答要点:新用户用协同过滤或基于内容的推荐作为初始推荐;新商品用属性特征或文本描述的初始向量,通过少量用户行为逐步优化模型。
问题2:训练数据中正负样本比例如何平衡?
回答要点:正样本来自用户购买的商品对(如同一用户购买A和B,A和B为正),负样本采用随机采样或负采样策略(如随机选择不相关的商品),比例通常正负1:1或1:3,避免模型偏向正样本。
问题3:计算效率如何保证,特别是实时推荐?
回答要点:模型采用轻量化的Siamese结构,编码后存储商品向量,推荐时通过向量点积计算相似度,时间复杂度低;同时,可对商品向量进行量化或索引,加速检索。
问题4:如何结合用户行为数据(如点击、加购)优化推荐?
回答要点:将用户行为(如点击、加购)作为额外的正样本,增强模型对用户偏好的学习;同时,加入用户特征(如历史购买记录)与商品特征融合,提升推荐个性化。