想象你推门走进一家高端商场,门口站着一位金牌导购。她记得你上周买的跑步机,知道你刚收藏了降噪耳机,看你今天穿运动服,直接把最新款运动手环塞到你手里,顺手把门口展示台的瑜伽垫换成了速干T恤。旁边的阿姨走进来,导购却领着她走向羊绒衫专柜。同一家店、同一个门口,不同顾客看到的“开场”完全不一样——这就是线下版的千人千面。电商首页的千人千面,就是把这位金牌导购装进代码里:给每个用户建立档案卡(用户画像)、快速判断该推什么(实时推荐算法)、重新布置展示台(首页模块渲染)、接待新面孔(冷启动处理)、验证新话术是否有效(A/B测试)。这篇方案把这五件事一条线讲透,帮你把首页变成“每人一个专属导购”。

岗位关联

对AI从业者:千人千首页是电商推荐最核心的落地场景,掌握用户画像、实时推荐、A/B实验的完整闭环,是进入大厂推荐团队、增长团队的能力基石。

目录
  1. 可视化演示
  2. 用户画像构建
  3. 实时推荐算法
  4. 首页模块渲染
  5. 冷启动处理
  6. A/B测试方案
  7. 系统架构部署
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示电商千人千首页个性化推荐技术的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

电商千人千首页个性化推荐技术:用户画像 用户画像构建与标签体系 首页推荐架构与召回排序 核心机制可视化 电商千人千首页个性化推荐技术整体架构与关键组件

用户画像构建

金牌导购的柜台抽屉里,锁着一摞“顾客档案卡”。卡片上贴满了彩色标签:爱运动、数码控、价格敏感、宝妈、熬夜党。每接待完一位顾客,导购都会在卡片上添一笔:今天摸了三件外套,最后买走一件米色的。这些档案卡就是用户画像的线下版。

放到电商系统里,档案卡变成了一条条行为日志和标签数据。画像构建要解决四个问题:数据从哪来、行为怎么提、标签怎么打、更新怎么快。第一是数据采集埋点,App 前端把曝光、点击、加购、下单等事件上报到日志系统,相当于导购默默观察顾客的每一个动作。第二是行为特征提取,从原始日志里聚合出品类偏好、价格带、活跃时段等特征,相当于把“摸了三件外套”量化成“外套=3次,米色=1次”。

第三是标签体系设计,把特征映射成事实标签(近7天购买3单)、兴趣标签(数码偏好0.8)、预测标签(未来7天购买概率70%)三层。第四是画像实时更新,用带衰减的公式让旧行为随时间弱化,否则三年前的“喜欢童装”会一直统治今天的画像。

有了这套动态档案卡,导购每次见到老顾客,卡片上的标签都会翻新一层。顾客一年没来,旧标签自然褪色;来了三次狂买运动装备,新标签“运动”立刻贴上最显眼的位置。

scoret+1=α×actiont+(1−α)×scoretscore_{t+1} = \alpha \times action_t + (1-\alpha) \times score_t
白话解释:画像分数像一杯热水的温度——你喝一口(新行为)就加一点热水,放久了(时间流逝)自然变凉。α 控制加水的速度,也让旧温度慢慢退场。
  1. 行为贡献 α×action_t本次行为(点击/加购/下单/购买)对某个标签的即时贡献分,比如购买数码产品给“数码”标签加 0.8。
    α×actiont\alpha \times action_t
  2. 历史折损 (1-α)×score_t旧的画像分数乘以折损系数,时间越久远的旧分数,对当前的影响越小。
    (1−α)×scoret(1-\alpha) \times score_t
  3. 加权求和 score_{t+1}新贡献加上折损后的旧分数,得到更新后的画像分数,再作为下一次更新的基数。
    scoret+1=α×actiont+(1−α)×scoretscore_{t+1} = \alpha \times action_t + (1-\alpha) \times score_t

实时推荐算法

档案卡只是基础,导购真正的本事是“一眼判断该带你去哪”——脑子里瞬间闪过几百个顾客的购买史,找出和你最像的几个,顺着他们的购物车倒推你可能会喜欢什么。这就是推荐算法的日常。

技术上的名字叫协同过滤,核心假设是“和你行为相似的人,喜欢的你也大概率喜欢”。要判断“相似”,最常用的尺子是余弦相似度。系统先构建“用户-物品”评分矩阵,行为越多数值越高;然后计算物品两两之间的相似度,把用户买过的物品的“邻居”召回出来;最终按相似度加权求和得到候选商品得分,取 TopK 进首页。与此同时,近线实时特征接入让“刚刚收藏”这类新信号在几秒内就影响下一次刷新,让推荐永远跟得上用户的当下心情。

余弦相似度把每个物品的用户行为看作一个向量,用向量夹角的余弦值衡量相似度——夹角越小越像,取值范围落在 0 到 1 之间。

导购的“瞬间判断”其实背地里是几千个老顾客在帮忙投票——这一单推荐,不是你一个人的喜好决定的,而是你和千万个“同类人”合谋的结果。

sim(i,j)=∑urui×ruj∑urui2×∑uruj2sim(i, j) = \frac{\sum_{u} r_{ui} \times r_{uj}}{\sqrt{\sum_u r_{ui}^2} \times \sqrt{\sum_u r_{uj}^2}}
白话解释:把两个商品各自收到的“用户打分”排成两列数字,余弦相似度就是看这两列数字的形状像不像——数字都大且同一个人都给了高分,形状就像,商品就相似。
  1. 打分 r_{ui}用户 u 对物品 i 的行为值,点击记 0.3、加购 0.7、购买 1.0,没行为记 0。
    rui∈{0,0.3,0.7,1.0}r_{ui} \in \{0, 0.3, 0.7, 1.0\}
  2. 分子共同偏好所有用户对物品 i 和 j 打分相乘再求和。只有同时对两个物品都有行为的用户才会贡献正分。
    ∑urui×ruj\sum_{u} r_{ui} \times r_{uj}
  3. 分母归一化两物品的“总分向量长度”相乘,把相似度压到 [0,1],避免热门物品光靠刷分就长得像所有商品。
    ∑urui2×∑uruj2\sqrt{\sum_u r_{ui}^2} \times \sqrt{\sum_u r_{uj}^2}

首页模块渲染

导购不只带你逛,还会动手改陈列。她知道李女士常买羊绒衫,就把羊绒区挪到入口最显眼的屏风前;知道王先生只看数码,就把相机展柜摆到过道正中。展示台就是模块,布置就是渲染。

电商首页是一块由多个模块组成的拼图板:顶部 banner、金刚区 icon、秒杀专区、热销榜单、“猜你喜欢”信息流。千人千面的关键,是让每个模块的排序和它内部的商品,都随用户画像动态变化。模块渲染包含两层决策:模块级排序——“猜你喜欢”放第一屏还是第三屏?秒杀要不要置顶?用加权得分公式计算每个模块的优先级;单元级内容——每个模块内部从候选池里取哪些商品,优先取画像匹配度高的。

实际工程上,首页通常由配置化平台下发模板,服务器根据用户画像实时填充每个坑位的商品 ID,客户端拿到数据后按模板渲染,做到不同用户首屏差异肉眼可见。遇到缓存或模块数据缺失时,自动降级为默认排序或热门内容,保证页面永不白屏。

导购每一次搬动柜台,都是“客户最大利益”和“商场经营目标”的博弈。首页渲染也一样——完全顺着用户会造成信息茧房,完全听老板会造成没人买账,加权公式就是那把把两边掂量清楚的天平。

Smodule(x)=w1×fpref(x)+w2×ftime(x)+w3×fbiz(x)S_{module}(x) = w_1 \times f_{pref}(x) + w_2 \times f_{time}(x) + w_3 \times f_{biz}(x)
白话解释:每个模块“挤进首屏的资格”由三张考卷加权:和用户偏好的匹配分、时间紧迫分(比如秒杀还剩10分钟)、业务强推分(比如新品要冲量)。权重由运营配置,就像导购把“老板交代的主推款”和“顾客的真实喜好”都记在心里。
  1. 偏好匹配分 f_pref模块主题与用户画像标签的匹配度,画像里“数码=0.9”的用户,「3C 会场」模块分就高。
    fpref(x)=∑tagprofile[tag]×tag_weight(x)f_{pref}(x) = \sum_{tag} profile[tag] \times tag\_weight(x)
  2. 时效分 f_time模块内商品还剩多少时间享受折扣,临近结束会加急权重,促使用户快点下单。
    ftime(x)=deadline−nowtotal_windowf_{time}(x) = \frac{deadline - now}{total\_window}
  3. 业务分 f_biz运营给新品的置顶补贴、清仓商品的曝光补偿等人工规则。
    fbiz(x)∈[0,1]f_{biz}(x) \in [0, 1]
  4. 加权求和三个分数按可配置权重相加,得分最高的模块排在最前面。
    Smodule(x)=w1×fpref(x)+w2×ftime(x)+w3×fbiz(x)S_{module}(x) = w_1 \times f_{pref}(x) + w_2 \times f_{time}(x) + w_3 \times f_{biz}(x)

冷启动处理

最难的是接待一位陌生顾客。没有档案卡、没有介绍人,导购只能先笑盈盈地问两句“平时喜欢跑步还是瑜伽?”顺手递上店里卖得最好的三款基础款,再从对方的反应里快速建立新卡片。这个“从陌生到熟悉”的过程,对应推荐系统里的冷启动。

冷启动有两类:新用户冷启动(没有行为数据)和新品冷启动(没有销售记录)。两者的共性都是“没有历史,无法用协同过滤”。解决方案分两路:一是试探,二是兜底。探索方面,给新用户推少量高探测价值的商品——用地域、设备型号、注册渠道等稀疏信号做粗画像,再结合随机探针,观察点击后立刻更新画像;新品则利用内容属性(图文标签、类目)计算与已有热销品的相似度,先混进相似推荐位。

兜底方面,热门榜是永远的最后防线,保证体验不崩。探索与利用的平衡,学术界用 UCB(上置信界)算法做取舍:被试次数少的商品,即使当前点击率不高,也会获得一次“再试试”的额外加分。

新顾客第一次进店,导购不会让他空手而归——先推荐最稳妥的基础款保底,再穿插一两个小众试探款钓鱼,对方多看一眼,档案卡上就多记一笔。冷启动不是没有推荐,而是“边推荐边建档”。

UCBi=xˉi+2×ln⁡tniUCB_i = \bar{x}_i + \sqrt{\frac{2 \times \ln t}{n_i}}
白话解释:UCB 是给每件商品算“潜力上限”:前半项是它当前的表现,后半项是“还没被充分尝试”的补偿。试得越少,后半项越大,越容易被端上桌;试多了表现差,后半项变小,自然退出舞台。
  1. 平均收益 x̄_i商品 i 被展示后获得的平均点击率/转化率,代表它目前的口碑。
    xˉi=clicksiimpressionsi\bar{x}_i = \frac{clicks_i}{impressions_i}
  2. 总探索量 ln t取对数后的全局展示次数,随时间增长但增长速度递减。
    ln⁡t\ln t
  3. 尝试次数 n_i商品 i 已经被展示给多少用户。n_i 越小,根号值越大。
    2×ln⁡tni\sqrt{\frac{2 \times \ln t}{n_i}}
  4. UCB 决策把口碑和“未尝试补偿”加起来排序,高者优先展示,实现试探与利用的自动平衡。
    UCBi=xˉi+2×ln⁡tniUCB_i = \bar{x}_i + \sqrt{\frac{2 \times \ln t}{n_i}}

A/B测试方案

导购琢磨出一套新话术,但不敢对所有顾客用——万一惹恼老主顾,得不偿失。于是她决定:这周只对老顾客里的 A 组用新话术,B 组继续用老话术,月底翻台账比一比两组的成交金额。这就是零售界的 A/B 实验。

线上推荐也一样,任何算法改动都不能直接全量上线。A/B 测试把流量按用户 ID 哈希分桶,保证同一用户永远只进一组,避免实验穿透;两组同时在线运行不同策略。核心指标选转化率、客单价、GMV,辅助指标看人均点击、浏览深度;然后计算 Z 统计量并与 1.96 比较,判断差异在 95% 置信水平下是否显著;最后按 10%→30%→50%→100% 灰度放量,随时准备回滚。

导购月底翻台账时,不光看总金额,还要看两组顾客的回头率、投诉率——就像线上实验不能只看转化率,还得盯住用户满意度、客诉这些“长期台账”。数据说话,话术升级才敢全面铺开。

Z=p^A−p^Bp^(1−p^)(1nA+1nB)Z = \frac{\hat{p}_A - \hat{p}_B}{\sqrt{\hat{p}(1-\hat{p}) \left( \frac{1}{n_A} + \frac{1}{n_B} \right)}}
白话解释:Z 值像“两组差异的可信嗓门”:分子是两组转化率差距,分母是波动噪声。嗓门盖过噪声(|Z|>1.96),就敢说差异是真的,否则只是运气。
  1. 实验组转化率 p̂_A实验组内完成目标行为的用户占比。
    p^A=conversionsAvisitorsA\hat{p}_A = \frac{conversions_A}{visitors_A}
  2. 合并比例 p̂把两组合并后计算的总体转化率,作为方差估计的基础。
    p^=convA+convBnA+nB\hat{p} = \frac{conv_A + conv_B}{n_A + n_B}
  3. 标准误分母两组样本量共同决定的抽样误差,样本越大噪声越小。
    p^(1−p^)(1nA+1nB)\sqrt{\hat{p}(1-\hat{p}) \left( \frac{1}{n_A} + \frac{1}{n_B} \right)}
  4. 显著性判决当 |Z|>1.96 时拒绝“两组无差异”的假设,承认新策略有效。
    ∣Z∣>1.96|Z| > 1.96

系统架构部署

前台只有一位金牌导购,背后却站着一个商场:仓库管理员每晚盘点库存(离线),理货员每隔几分钟补一次货架(近线),导购本人负责当下问答(在线)。三层各干各的,又紧密衔接——推荐系统的架构也是这个分工。

千人千面要支撑数亿用户、毫秒级响应,不能全在用户请求那一刻临时算。业界标准做法是“离线 + 近线 + 在线”三层架构:能提前算好的绝不现算,能缓存住的绝不回源。离线层用 Spark/Hive 跑批量任务,产出用户画像、物品相似度、热门榜,每天凌晨更新一次;近线层用 Kafka 接实时行为流 + Flink 做流计算,按分钟级刷新“实时热门”“刚刚在看”这类动态信号;在线层用 Redis 缓存画像和推荐结果,配合 RPC 接口在 50ms 内返回首页数据。

性能预算上,缓存命中率是生命线——命中高,响应快,数据库压力小。

导购脱口而出的那句“张先生,新款跑步机到了”,并不是临场翻库存清单,而是仓库夜里备好货、理货员刚摆上架、导购提前背过新款卖点。推荐系统也是如此——你看到首页的每一件商品,都是离线、近线、在线三层提前排练好的结果。

Ttotal=Tcache+(1−hit_rate)×TdbT_{total} = T_{cache} + (1 - hit\_rate) \times T_{db}
白话解释:一次首页请求的耗时 = 读缓存的死快 + 只有缓存没命中时才付出的数据库慢速。缓存命中率 99% 时,99 个用户都尝到毫秒级秒开,只有 1 个用户等数据库慢慢算。
  1. 缓存耗时 T_cache从 Redis 取推荐结果的时间,通常 1-3ms。
    Tcache≈2 msT_{cache} \approx 2\,ms
  2. 回源概率 (1-hit_rate)缓存没命中的请求比例,命中率越高回源越少。
    1−hit_rate1 - hit\_rate
  3. 数据库耗时 T_db回源查询 MySQL/HBase 的耗时,可能 30-100ms。
    Tdb≈50 msT_{db} \approx 50\,ms
  4. 总耗时表达绝大多数请求只花 T_cache,整体平均耗时被命中率压得很低。
    Ttotal=Tcache+(1−hit_rate)×TdbT_{total} = T_{cache} + (1 - hit\_rate) \times T_{db}

AI 应用场景

大促会场动态拼装

阶段:首页模块渲染 + 用户画像

解决的问题:传统大促所有用户进入同一个会场页,运营手工配置几十个坑位,资源位分配粗放。AI 用画像对每个用户动态拼装会场:健身用户首屏看到运动专场入口和跑鞋预热,数码控看到 3C 神券 banner,宝妈看到奶粉尿裤专场,会场转化率相比静态页提升 20% 以上。

具体案例:某电商平台「双11」期间,根据用户近 30 天行为标签实时调整二楼会场模块顺序,并在秒杀位插入用户购物车同款商品,人均 GMV 提升 12%。

新用户首单转化

阶段:冷启动处理

解决的问题:新用户没有行为数据,首页如果直接推全站热门,缺乏针对性,首单转化率低。AI 用设备型号、注册渠道、地域等粗信号试探推荐,并配合 UCB 在冷启动阶段自动平衡“热门保底”和“个性试探”。

具体案例:新人第一次打开 App,首页第一屏「猜你喜欢」从全站 Top100 中随机探针 20 个商品,并结合渠道(搜索广告进入 vs 朋友分享进入)做差异投射,新用户 7 日首单率提升 8%。

推荐策略灰度验证

阶段:A/B测试方案

解决的问题:推荐算法频繁迭代,如果没有实验体系,一个改动的上线风险无法量化。AI 从业者搭建统一的 A/B 实验平台,对所有策略改动强制实验准入,用 Z 检验判断显著性,再灰度放量。

具体案例:推荐团队将排序模型从 LR 升级为深度模型,先在 10% 流量上跑了两周,实验组人均点击率显著提升 6%、客单价无明显回落,才逐步放量到全量,全程可随时回滚。

Python 演示

python59 行
# -*- coding: utf-8 -*-"""千人千面首页推荐 - 简化版实时推荐流水线"""import randomfrom collections import defaultdict # 商品-标签矩阵: item -> {tag: 权重}catalog = {    'camera': {'digital': 0.9, 'photo': 0.8},    'shoes':  {'sport': 0.9, 'outdoor': 0.7},    'lipstick': {'beauty': 0.9, 'fashion': 0.6},    'earphone': {'digital': 0.8, 'music': 0.7},    'mat':     {'sport': 0.8, 'health': 0.7},} # 用户画像: user_id -> {tag: score}profiles = defaultdict(lambda: defaultdict(float))  def update_profile(user_id, item_id, alpha=0.2):    """用户点击/购买商品后, 用衰减加权更新画像标签分数"""    for tag, weight in catalog[item_id].items():        old = profiles[user_id][tag]        profiles[user_id][tag] = alpha * weight + (1 - alpha) * old  def recommend(user_id, top_k=3):    """根据用户画像给候选商品打分, 返回首页 TopK 商品列表"""    profile = profiles[user_id]    scores = {}    for item_id, tags in catalog.items():        s = sum(profile.get(tag, 0.0) * w for tag, w in tags.items())        scores[item_id] = s    ranked = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)    return [item for item, _ in ranked[:top_k]]  def simulate_view(user_id, item_ids, click_rate=0.3):    """模拟用户浏览首页并随机点击其中一些商品"""    for item_id in item_ids:        if random.random() < click_rate:            update_profile(user_id, item_id)  if __name__ == '__main__':    # 两个兴趣不同的用户分别有历史行为    update_profile('u_001', 'camera')    update_profile('u_001', 'earphone')    update_profile('u_002', 'shoes')    update_profile('u_002', 'mat')     # 再浏览一轮, 画像继续更新    simulate_view('u_001', ['camera', 'earphone', 'lipstick'])    simulate_view('u_002', ['shoes', 'mat', 'camera'])     home_a = recommend('u_001')    home_b = recommend('u_002')    print('User A home:', home_a)    print('User B home:', home_b)    print('Personalized:', home_a != home_b)
目的:用最简代码演示“画像更新 → 商品打分 → 首页排序”的千人千面流水线,跑通“同一份商品池,两个用户首页不同”的完整链路。
  1. catalog = {'camera': {'digital': 0.9, 'photo': 0.8}, 'shoes': {'sport': 0.9, ...}}商品-标签矩阵,相当于商场的商品知识库,每种商品天生携带匹配哪类人群的信号。
  2. profiles = defaultdict(lambda: defaultdict(float))用户画像容器,每个用户一个“标签→分数”的嵌套字典,没出现过的标签默认为 0。
  3. old = profiles[user_id][tag]取出该标签的旧分数,作为衰减更新的起点。
  4. profiles[user_id][tag] = alpha * weight + (1 - alpha) * old画像更新公式:本次行为贡献 α×weight,旧分数按 (1-α) 折损后保留。
  5. s = sum(profile.get(tag, 0.0) * w for tag, w in tags.items())商品得分 = 画像各标签分数 × 商品标签权重的累加和。
  6. ranked = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)按得分降序排列,取 TopK 作为首页展示。
  7. simulate_view(user_id, item_ids, click_rate=0.3)模拟真实浏览:不一定每个商品都点,只以 30% 概率触发画像更新。
  8. print('Personalized:', home_a != home_b)一句话验收千人千面:两个用户的首页列表必须不同。

常见误区

误区用户画像应该是一份“定死的档案”,建好之后长期不变,反正用户还是那个人。

正解用户的兴趣会漂移——去年爱跑步,今年迷钓鱼。画像是“活台账”,必须用衰减更新让新行为持续修正旧标签,否则三年前的旧兴趣会一直霸占今天的推荐位。就像导购的档案卡,每次接待后都要添新笔记。

为何常见:离线任务批量产出的画像长得很像静态表,加上“用户ID→标签”的表结构容易让人误以为画像只建一次就够了。

误区用户爱点什么就推什么,点击率涨了,推荐就做好了。

正解只看点击率会陷入信息茧房——用户点过的相似商品被反复推荐,越推越窄。好的首页推荐要在点击率之外,兼顾品类多样性、商品新鲜度、商业目标权重。就像导购不能因为你上回买了黑T恤,这周就只拿黑T恤给你看。

为何常见:点击率指标直观、日报更新快,KPI 好写;但“点击多→买得多→留得久”的长期链条往往被忽视。

误区新策略上线跑一天,看到点击率比旧版高就宣布胜利,第二天全量。

正解一天的短期数据充满噪声,还有“新奇效应”——用户对新版好奇点几下,不代表真有效。要跑够最小样本量、避开大促周期、看统计显著性(|Z|>1.96),再灰度放量。导购也得等到月底翻台账,不会凭昨天一个客人多买一件就改话术。

为何常见:周报、KPI 压力让人想快速看到结果,忽略了统计规律要求的最小样本和实验周期。

误区新用户没有任何行为数据,干脆把全站销量榜当首页,反正不会错。

正解纯热门没有个性化,用户来了两次看到的都一样,既无法建立画像,也留不下“这人懂我”的体验。正确做法是“热门兜底 + 试探性推荐”:热门保证下限,试探积累信号,用 UCB 自动调节两者的比例。

为何常见:热门策略实现最简单、不依赖画像工程,上线零成本,容易被误当成冷启动的最终答案。

误区A/B 实验就是“新旧策略各跑一段时间,然后比大小”,谁先上线谁当参照。

正解实验必须按用户(或设备)维度哈希分桶,同一用户全程只进一组,两组同时在线运行,否则时间先后带来的大盘波动会污染结论;同时要保证分桶均匀,避免 90% 用户进实验组。

为何常见:把线下“先后对比”的思维惯性搬到线上,忽略了用户重叠和时段差异这两个因果推断杀手。

面试题

Q1. 千人千面首页推荐最核心的目标是什么?

单选题 · easy

  • A.首页展示完全随机商品
  • B.每个用户看到匹配商品← 正确答案
  • C.所有用户看到相同首页
  • D.让所有商品均匀曝光

答案:B。千人千面的“千面”就是一人一面。B 点出个性化匹配的本质,A 随机违背目标,C 是千人一面正好相反,D 均匀曝光是公平性问题,不是推荐的核心目标。

Q2. 用户画像是用什么数据构建起来的?

单选题 · easy

  • A.购买历史行为记录← 正确答案
  • B.商品库存的盘点表
  • C.服务器CPU使用率
  • D.物流配送的路线图

答案:A。画像来源于用户自己的行为——点击、浏览、加购、下单这些行为日志。库存表、CPU、物流路线都是系统内部数据,与用户偏好无关。

Q3. 新用户没有任何行为数据时,最合理的做法是?

单选题 · easy

  • A.直接冻结用户账号
  • B.只推全站销量最高的
  • C.热门兜底加试探推荐← 正确答案
  • D.不做任何个性化动作

答案:C。冷启动的正确解法是“热门兜底 + 试探”。B 只做了一半。A、D 相当于导购不理新客人,体验上不可行。

Q4. 画像更新公式 score=(1-α)×old+α×action 中,α 越大意味着什么?

单选题 · mid

  • A.历史行为的影响越小← 正确答案
  • B.用户数量增长得越快
  • C.商品库存消耗得越快
  • D.系统计算耗时越来越长

答案:A。α 越大,新行为的权重越高,old 的折损系数 (1-α) 越小,历史影响就越弱。B、C、D 都与 α 没有关系,是用来干扰的。

Q5. 协同过滤推荐的核心逻辑是?

单选题 · mid

  • A.相似用户的偏好互相推荐← 正确答案
  • B.用随机算法猜测用户兴趣
  • C.只按商品利润高低排序
  • D.完全相同商品重复推荐

答案:A。协同过滤的核心理念是“和你像的人喜欢什么,你大概率也喜欢”。B 是随机器,C 是商业策略不是个性化,D 是低质量推荐。

Q6. 首页模块动态渲染的主要目的是?

单选题 · mid

  • A.让首屏模块排序因人而异← 正确答案
  • B.减少研发团队的代码工作量
  • C.让每个页面加载速度变慢
  • D.固定首页布局减少维护成本

答案:A。动态渲染就是用画像决定每个用户首屏模块的优先级和内容,实现一人一首页。B、D 是静态页面的优势,C 是性能退化,都谈不上目的。

Q7. UCB 算法中根号项的主要作用是什么?

单选题 · hard

  • A.给尝试少的商品额外机会← 正确答案
  • B.降低所有商品曝光概率
  • C.直接删除低点击率商品
  • D.让推荐结果完全随机化

答案:A。根号项 = √(2ln t / n_i),n_i 越小该项越大,给未被充分探索的商品加分。B、C 是对利用的误解,D 放弃利用环节。

Q8. A/B 测试的正确做法包括哪些?

多选题 · mid

  • A.用户哈希分桶避免重叠← 正确答案
  • B.跑够样本再看显著差异← 正确答案
  • C.周末上线一天就下结论
  • D.新旧策略同时在线运行← 正确答案

答案:ABD。A 分桶、B 显著性检验、D 同时试验都是 A/B 的必备要素。C 是典型错误,短期数据带噪声且受新奇效应干扰。

Q9. 千人千面推荐系统架构通常包含哪些层?

多选题 · mid

  • A.离线批量计算层← 正确答案
  • B.在线实时服务层← 正确答案
  • C.近线流式补算层← 正确答案
  • D.打印机输出设备层

答案:ABC。三层架构是推荐系统标准答案:离线算画像,近线补实时信号,在线每秒服务千万请求。D 与系统架构无关,用于凑数。

Q10. 关于冷启动探索与利用的权衡,正确的说法是?

多选题 · extreme

  • A.探索让新商品获得曝光← 正确答案
  • B.利用环节发挥历史数据价值← 正确答案
  • C.纯利用容易导致信息茧房← 正确答案
  • D.纯探索永远是最好的策略

答案:ABC。探索负责新增量,利用负责存量价值,两者必须平衡。C 说的就是纯利用的经典毛病。D 错在“永远”——纯探索浪费历史数据,也没有商业目标约束。