老王开了二十年烤鸭店,如今把连锁开到了二十家分店。每家分店的大厨都自己天不亮去菜市场买菜,回店各自洗、切、腌、配。结果同一道“芥末鸭掌”,东城店咸、西城店淡;新店出菜要四十分钟,老店二十分钟足矣;更麻烦的是,一位顾客吃出了过敏原,谁也说不出是哪家店的哪批食材出了问题。老王痛定思痛,决定建一座中央厨房:统一采购、统一加工、统一冷藏、统一配送,各家分店只管掌勺。这个故事的“剧情”,就是自建特征平台的全过程——在 AI 公司里,每家分店就是每个算法团队,那道菜就是模型,而决定菜味的配料,就是特征。
一句话职业价值:掌握自建特征平台架构,是数据工程师和架构师从“写特征脚本”走向“设计基础设施”的分水岭,也是企业规模化落地 AI 的核心竞争力。
可视化演示
动态演示自建特征平台架构方案的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
自建特征平台架构方案:自建特征 自建特征平台的动机与技术选型权 特征平台整体架构与组件分层设计 核心机制可视化 自建特征平台架构方案整体架构与关键组件
平台定位目标
老王的连锁烤鸭店开到二十家后,问题集中爆发:每位大厨黎明前都自己跑菜市场,回来各自洗切配,结果东城店烤鸭偏咸、西城店偏淡,新店出菜要四十分钟,老店二十分钟就好;更可怕的是某位顾客食物中毒,谁也说不清是哪家店哪批食材出了问题。老王这才明白,缺的不是好厨师,而是一座把所有“备菜工作”集中起来的中央厨房——这就是特征平台诞生的最朴素理由。
在 AI 公司里,算法团队就是分店厨师。数据科学家为一个模型常常要花六成时间写 SQL、写 Spark 作业、拼特征;各家团队重复劳动,同一个“用户近 7 天点击次数”,推荐组算 7 个自然日,广告组按 7×24 小时,口径不同,排查难题和模型效果都天差地别。特征平台(Feature Platform)就是公司的中央厨房:把特征的“定义—加工—存储—服务—监控”全链路收归统一。
具体来说,平台解决四个核心痛点。第一,重复建设:一个特征被五个团队各自写五遍。第二,口径不一致:同名不同义、同义不同名,模型之间无法复用也不敢复用。第三,上线慢:特征从开发到线上,手工流程动辄一两周。第四,不可治理:不知道特征从哪来、被谁用、质量如何。平台把特征当作“一等公民”来管理,注册、版本化、可复用、可追溯,让每一项“配菜工作”都有据可查。
就像中央厨房让“备菜”从各家分店的杂活变成专业化服务,特征平台让特征工作从算法同学的琐事变成平台化能力。小店不需要它,但当你拥有几十上百个模型时,没有中央厨房,后厨迟早会乱成一锅粥。这正是自建特征平台的首要定位:为规模化 AI 提供稳定、可控、可复用的“食材供给线”。
整体架构分层
中央厨房的流水线有五道固定工序:采购验收、加工车间、冷库存储、备料台、出餐配送,每道工序职责清晰,食材从进门到出餐一路不回头。特征平台的架构同样如此,自下而上分为四层:数据接入层、特征计算层、双存储体系、在线服务层。
数据接入层负责从业务库、日志、消息队列等“菜市场”把原始数据接进来,并做格式校验、迟到数据处理,相当于食材验收;特征计算层用离线批处理(Spark/Hive)和实时流计算(Flink)两大“厨师班”把原始数据加工成特征;存储层分离线特征存储与在线特征存储,分别扮演冷库和备料台;最顶层的在线服务层对外提供统一特征查询 API 和 SDK,就是出餐窗口。
分层最重要的价值,是让每一层可以独立扩展、独立降级。在线服务一旦承诺毫秒级返回,就要把延迟预算像分拨经费一样分配到各层:
回到烤鸭店,老王给每道工序定了时限:洗切 5 分钟、烤制 40 分钟、配送 10 分钟,加起来就是这只鸭子的“出餐延迟预算”。哪一环超时就优化哪一环,而不是让整个后厨乱抓。分层架构的意义,正在于让任何性能问题都能被精确定位到具体车间,而不是像过去那样“出了事全店乱成一团”。
- 端到端预算在线服务对外承诺的延迟上限,比如 50 毫秒,是整条链路的总预算,超了就算违约。
- 计算耗时特征加工本身消耗的时间,实时特征通常要控制在几毫秒内,对应“现点现做”的火候时间。
- 缓存命中耗时从备料台(在线缓存)取热特征的时间,一次内存读取通常在 1 毫秒以内。
- 存储回源耗时缓存未命中时回源数据库的时间,往往比缓存慢一个数量级,是预算的大头。
- 网络传输耗时请求与响应在网络链路上传播的时间。四层相加若超过预算,就要加缓存、做降级或优化计算逻辑。
特征定义管理
中央厨房里每道菜都有一张标准菜谱卡:名字、主料、辅料、克数、火候、腌制时间,写得明明白白。分店厨师不需要自己琢磨“芥末鸭掌的芥末怎么调”,照菜谱卡操作即可。特征平台的第一件事,也是把“特征”这道菜谱标准化:每个特征注册时,必须写明特征名称(全局唯一)、实体类型(如 user_id、item_id)、数据类型、加工逻辑、更新频率和负责人。
这份登记在册的“菜谱”,就是特征注册表(Feature Registry)。它是平台一切功能的起点:没有注册,就没有统一口径,没有复用,也没有血缘。注册之后,平台还要为每个特征建立“食材档案”(元数据)和“溯源记录”(血缘):这个特征读了哪张上游原始表、经过了哪个加工任务、被哪些模型引用,全部记录下来,作为后续治理和排障的依据。
聚合类特征是最常见的注册对象,一份典型“菜谱”长这样:
菜谱本身也需要版本管理:菜谱改了要升版本,出问题可以一键回滚到上一版。有了这套管理,分店(模型)之间才能共享同一套标准,而不是各自发明“黑暗料理”。当线上特征异常时,顺着菜谱卡和血缘记录,就能像查菜谱修订日志一样,快速定位是配方变了、食材变了,还是厨师操作变了。
- 特征名全局唯一的特征标识,任何团队引用都要用这个名字,不允许各写各的。
- 实体 u特征属于谁,可以是用户、商品或设备,对应菜谱里的“主料”。
- 业务时刻 t特征值是在哪个业务时刻计算的,这是后面一致性与时间对齐的关键。
- 窗口求和把从 t-7 到 t 这 7 天每天的点击量累加,对应菜谱的“辅料配比”。
- 取平均除以 7 得到日均点击,避免活跃天数不同的用户之间数值量纲差异过大。
存储体系设计
中央厨房有两种“库”:一种是冷库,面积大、温度低、存取慢,用来囤一周的食材;另一种是炉灶旁的备料台,只能放下十几个盘子,但厨师一伸手就能拿到。老王很清楚:不能拿冷库当备料台用,也不能指望备料台装下整个冷库。特征平台同样采用双存储体系。
离线特征存储是“冷库”,一般落在 Hive/HDFS 或数据湖上,能容纳海量历史特征,支撑训练时的大规模回填和样本生成,但访问延迟是秒级甚至分钟级;在线特征存储是“备料台”,通常用 Redis 这类 KV 数据库,容量有限但查询是毫秒级,专门服务线上模型的实时请求。两者存放同一批特征的不同“温度形态”。
无论冷库还是备料台,每一行特征都遵循统一的四元组结构,这是特征数据模型的核心:
存储选型上,冷库看中容量与成本,备料台看中速度与命中率;不少团队还会在备料台前再加一层“取餐口”——进程内本地缓存,进一步减少跨网络取菜。存储设计的本质,是让数据在合适的温度下待在合适的位置:大而冷、小而热。也只有这样,训练要“大而全”、上线要“快而准”的两难需求才能同时满足。
- 主料标识这条特征属于谁,如用户 10086,是查询的主键,相当于冷库中每个货位的编号。
- 特征名与注册表严格一致的菜谱名,线上查询和离线训练都靠它对齐,不允许自由发挥。
- 数值特征的具体取值,可以是数值、类别或向量,就是“配好料的半成品”本身。
- 加工时间这个值是什么时候算出来的,用于一致性校验、时效判断与回填管理。
一致性与时效
训练模型时,数据科学家像从冷库里取食材,拿的是“昨天腌制好的”;线上模型推理时,系统从备料台取食材,如果拿到的是“今天现切的”,厨师做出来的菜味道就变了——这就是训练与上线不一致(Training-Serving Skew)。模型离线评测表现良好,一上线就失灵,往往不是代码 bug,而是“冷库的菜”和“备料台的菜”根本不是同一批。
解决这个问题的第一关键是“同源同味”:离线加工与在线加工共用同一套特征定义和计算逻辑,并定期做一致性比对——同一批样本,离线查一遍、在线查一遍,计算差异率。第二关键是“时间窗口对齐”:训练样本打上生成时刻 t,取特征时必须保证只用 t 时刻之前(含)的信息,绝不能偷看未来。
这个“不能偷看未来”的规则,在特征工程中称为时间点正确性(Point-in-Time Correctness),数学表达是:
有了同源同味和时间对齐,还要解决“回填”与“时效分级”。新增一个特征时,需要把历史样本全部重算一遍(回填),相当于按新菜谱重新腌一批老食材;而不同特征的时效需求差异很大:风控的“5 分钟转账频次”是生鲜,必须实时;推荐的“7 天点击偏好”是冷冻,小时级即可;用户基础画像则是常温,天级更新就够。按温度分档,成本与体验才能同时成立。
- 样本时刻训练样本发生在时间轴上的位置,比如第 10 天,这是取特征的“现在”。
- 候选更新时刻特征 j 每次被刷新都会留下一个时间戳,所有更新时刻记为 τ_k,如同每一批入库食材的日期。
- 筛选条件只允许不晚于 t_i 的更新进入候选,未来数据一律丢弃,防止“偷看答案”。
- 取最近一次在候选更新里挑时间最接近 t_i 的那次,对应“开火前最近备好的一篮菜”。
- 拿到特征值用那次更新算出的值作为训练输入,与线上在 t_i 时刻实际能拿到的完全一致。
服务与监控
中央厨房给分店供菜有两种方式:一种是“提前配好”,把招牌菜的半成品批量送到各家门店,厨师加热即出餐;另一种是“现点现做”,遇到临时加菜,后厨立刻开火。特征平台的服务方式如出一辙:批量预载适合变化不剧烈的特征,定时把冷库算好的结果推到备料台;实时计算适合高时效特征,请求到达时用 Flink 状态或明细数据现场聚合。
为了保证出餐速度,平台还有三件套:本地缓存(取餐口)、热点特征识别(常点的菜多备几份)、降级策略(备料台故障时返回默认值或走冷库,而不是直接报错)。这些都属于性能保障策略。而菜能不能吃,要靠品控巡检——特征监控的核心指标是“分布漂移”:线上的特征值分布和训练时相比,有没有悄悄变味。
经典指标叫 PSI(Population Stability Index,群体稳定性指数):
通常 PSI 小于 0.1 表示稳定,0.1 到 0.25 表示有变化需要关注,大于 0.25 就要拉响警报。老王在中央厨房也设了品控台:每批食材抽检农残、每道菜测温、配送车装 GPS。特征平台同样要监控新鲜度(特征多久没更新)、延迟(服务多快返回)、命中率(备料台命中多少请求)、异常值(突然出现负数或极端值)。任何一项“脱靶”,都意味着一家分店的菜可能出了问题,必须立刻溯源。
- 分箱把特征取值范围切成 n 个区间,像把一篮菜按大小分成几堆分别数数。
- 线上占比当前线上样本中落在第 i 个区间的比例,代表“现在的菜”的分布。
- 训练占比训练阶段样本中落在第 i 个区间的比例,作为“过去的菜”的基准。
- 占比差p_i 与 q_i 的差值,体现该区间上线的偏移程度,差越大说明变化越明显。
- 对数权重取对数让偏移方向有正负,并放大比例差异的敏感度,逐箱累加得到总漂移分。
落地实践要点
老王没有一上来就建十个车间。他先选了最乱的一道招牌菜做试点:把鸭胚的采购、腌制、配送全部收到中央厨房,三家门店先跑通流程;验证口味一致、成本下降后,再逐步纳入冷菜、热菜、汤品。自建特征平台也是同样的演进路线,切忌一步到位。
实践路径分四步:第一步,选 1-2 个核心场景(如推荐或风控)试点,接入平台并验证一致性收益;第二步,多场景推广,建立标准化接入流程和迁移规范;第三步,治理运营,完善元数据、血缘、监控告警,让存量特征全部纳入管理;第四步,成本优化,淘汰低价值特征、合并重复特征。团队协作上,平台团队和算法团队要共同组成“菜谱委员会”,评审每个特征的注册与变更,避免平台变成没人用的摆设。
平台建设的回报,最直观的度量是特征交付周期:
典型的应用场景中,推荐系统用平台统一“用户 7 天点击偏好”“商品实时热度”等特征,风控系统靠平台实时供给“5 分钟转账频次”,搜索排序则复用点击、时长、相关性等基础特征。自建平台不是追求技术炫技,而是像老王的中央厨房一样:让每一家分店的每一道菜,稳定、快速、可溯源——这才是它存在的全部意义。
- 平台化前的周期一个特征从需求提出到能上线,手工流程通常要 5-10 天,这是改进的基准线。
- 平台化后的周期注册复用后一般压缩到小时级,新模型直接引用现成特征即可。
- 比值后者与前者的比例反映“缩水”程度,比例越小说明平台提效越明显。
- 提升百分比用 1 减去该比例再乘 100%,得到交付周期缩短的百分比,例如从 7 天降到 1 天就是约 86%。
AI 应用场景
场景一:推荐系统的特征统一与复用
阶段:特征生产与模型训练
解决的问题:传统方式下,每位推荐算法工程师自己写 SQL 和 Spark 作业算特征,同一个“用户 7 天点击”存在多个版本,模型之间无法复用,新模型冷启动要两周。AI 方式:在平台注册特征后,离线批处理统一计算入冷库,定时同步到备料台,所有推荐模型通过统一 API 取用,口径天然一致。
具体案例:某电商 App 推荐团队通过平台沉淀 300 多个标准化特征,新模型接入时间从 7 天缩短到 1 天,特征跨模型复用率达 70%,线上 A/B 实验效果稳定。
场景二:风控系统的实时特征供给
阶段:在线推理服务
解决的问题:支付风控需要在请求到达的几十毫秒内拿到“近 5 分钟转账次数”“设备活跃频次”等实时特征;传统做法每个模型单独接实时流,重复建设且延迟不稳,高峰期经常超时。
具体案例:某支付风控团队使用平台实时计算链路(Flink 聚合 + 备料台缓存),特征服务延迟稳定在 10 毫秒内,配合 PSI 监控及时发现特征漂移,欺诈拦截准确率提升 18%。
场景三:特征治理与合规溯源
阶段:数据治理与监控
解决的问题:金融合规要求说清每个模型特征的数据来源;人工整理血缘文档成本高、易过期。平台自动记录“特征→上游表→加工任务→下游模型”的完整血缘,审计时一键导出。
具体案例:某银行信用卡模型过审时,用平台血缘报告回答监管关于“特征来源与授权”的质询,将合规审核周期从 3 个月缩短到 1 个月,同时通过特征新鲜度监控避免了多起数据延迟事故。
Python 演示
import mathimport randomimport timefrom collections import defaultdict class FeatureStore: """内存版特征平台模拟器: 管理离线表+在线缓存+一致性校验""" def __init__(self): self.registry = {} # 特征注册表: name -> 特征定义 self.offline = defaultdict(list) # 离线存储: entity -> [(ts, value)] self.online = {} # 在线缓存: entity -> value self.lookup_count = 0 # 查询计数 self.hit_count = 0 # 缓存命中计数 def register(self, name, describe, window_days=7): """注册特征: 一份菜谱, 全员统一""" self.registry[name] = {'describe': describe, 'window': window_days} print("[注册] 特征 '%s' 已录入菜谱: %s" % (name, describe)) def compute(self, name, entity, events, mode='offline'): """按菜谱加工: 聚合最近窗口内的事件""" window = self.registry[name]['window'] values = [v for _, v in events if v is not None] recent = values[-window:] # 滑窗取最近 window 个值 agg_value = sum(recent) / len(recent) if recent else 0.0 ts = int(time.time()) if mode == 'offline': self.offline[entity].append((ts, agg_value)) self.online[entity] = agg_value # 同步到备料台 return agg_value def serve(self, entity): """在线服务: 备料台直达, 毫秒级返回""" self.lookup_count += 1 if entity in self.online: self.hit_count += 1 return self.online[entity] return None def export_offline(self, entity, ts): """离线取数: 训练时按时间点回放, 不用未来数据""" candidates = [v for t, v in self.offline.get(entity, []) if t <= ts] return candidates[-1] if candidates else 0.0 def consistency_check(self, entity, ts): """一致性校验: 冷库与备料台同源同味""" off_v = self.export_offline(entity, ts) on_v = self.serve(entity) if on_v is None: return False if abs(off_v) < 1e-9: return abs(on_v) < 1e-9 return abs(on_v - off_v) / abs(off_v) < 0.05 def hit_rate(self): """缓存命中率""" return self.hit_count / max(self.lookup_count, 1) def psi(online_dist, offline_dist): """PSI 漂移指数: 线上分布 vs 训练分布是否漂移""" score = 0.0 for p, q in zip(online_dist, offline_dist): if p > 0 and q > 0: score += (p - q) * math.log(p / q) return score def main(): store = FeatureStore() store.register('user_7d_click', '用户近7天点击次数均值', window_days=7) # 模拟 20 个用户各 40 天的点击原始事件 raw = {} for uid in range(20): raw[uid] = [(day, float(random.randint(0, 10))) for day in range(1, 41)] # 离线加工: 每天定时跑批, 相当于冷库入库 train_ts = int(time.time()) for uid, events in raw.items(): store.compute('user_7d_click', uid, events, mode='offline') # 冷库同步到备料台: 保证训练与上线同味 for uid, events in raw.items(): store.compute('user_7d_click', uid, events, mode='online') # 一致性校验: 同一条源数据, 离线与在线应一致 ok = store.consistency_check(0, train_ts) print("[一致性] 冷库与备料台同味: %s" % ("OK" if ok else "FAIL")) # 线上突发流量: 少量用户点击暴增, 实时聚合更新备料台 for uid in range(5): burst = [(41 + d, float(random.randint(80, 100))) for d in range(3)] store.compute('user_7d_click', uid, burst, mode='online') # 在线服务验证 val = store.serve(0) print("[服务] user_0 在线特征 = %.2f, 命中率 = %.2f" % (val, store.hit_rate())) # PSI 漂移检测: 线上分布 vs 训练分布 online_dist = [store.online.get(u, 0.0) for u in range(20)] offline_dist = [store.export_offline(u, train_ts) for u in range(20)] score = psi(online_dist, offline_dist) print("[监控] PSI = %.4f, 判定: %s" % (score, "正常" if score < 0.1 else "漂移告警")) if __name__ == '__main__': main()
self.registry[name] = {'describe': describe, 'window': window_days}把特征注册进“中央厨房菜谱”,统一口径。values = [v for _, v in events if v is not None]从原始事件中筛出有效取值,相当于挑出合格食材。recent = values[-window:]滑窗取最近 window 个值,对应菜谱里的“最近 7 天”。self.offline[entity].append((ts, agg_value))加工结果写入冷库(离线存储),并带上时间戳。self.online[entity] = agg_value同步到备料台(在线缓存),保证同源同味。store.compute('user_7d_click', uid, events, mode='offline')离线跑批,相当于每天定时入库。candidates = [v for t, v in self.offline.get(entity, []) if t <= ts]时间点正确性取数:只取样本时刻之前的值,不偷看未来。return abs(on_v - off_v) / abs(off_v) < 0.05一致性校验:冷库与备料台差异小于 5% 才算合格。score += (p - q) * math.log(p / q)PSI 漂移核心公式:逐箱累加线上与训练分布的差异。print("[监控] PSI = %.4f, 判定: %s" % (score, "正常" if score < 0.1 else "漂移告警"))品控结论输出,0.1 以下是稳定区间。
常见误区
误区我以为自建特征平台就是把所有特征统一存到一个大仓库里,相当于给特征建了个数据库,存进去随取随用,核心工作就是选数据库和建表。
正解特征存储只是平台里的一间冷藏室。完整平台覆盖定义、加工、存储、服务、监控全链路,好比中央厨房的灵魂是统一菜谱、车间、冷库、备料台和品控,而不只是买个冰箱。只做存储,模型团队照样各自造特征,重复建设、口径不一致这些核心痛点一个都解决不了。
为何常见:“特征存储”这个名词最直观,容易让人把平台窄化成数据库,忽略了它作为完整流水线的本质。
误区只要离线训练和在线服务用同一套特征计算代码,训练和上线的特征就一定一致,不需要额外做一致性校验。
正解代码相同不等于味道相同。离线用 T-1 全量数据跑批,在线用实时增量数据,两种口径算出的“近 7 天均值”可能差之千里;训练时用的是“昨天算好的值”,上线时用的是“刚刚算好的值”,模型自然懵。所以还需要时间对齐(Point-in-Time)和定期的离在线一致性比对,像品控抽检一样持续验证。
为何常见:直觉上“同一份菜谱”就应该是同一个味道,忽略了数据时间、窗口等“火候”变量同样决定成品。
误区既然建平台,就应该把所有特征都做成实时计算,延迟越低越先进,离线批处理是过时方案。
正解实时计算成本高、故障面大,很多特征根本不需要毫秒级。成熟平台像冰箱分“生鲜、冷冻、常温”:风控的转账频次要秒级,推荐的偏好特征小时级即可,基础画像天级更新就够。按业务需求分级设计,才能平衡成本与稳定。
为何常见:技术圈容易崇拜“实时”,把技术先进性与业务实际需求、成本约束混为一谈。
误区血缘追踪就是画一张特征依赖关系图,做个漂亮的展示页面,对日常开发没什么实际用处。
正解血缘是平台的“事故定位系统”。一道菜出了问题,顺着溯源能查到是哪批食材、哪个加工环节出了问题;一个上游表要下线,能提前算出会影响哪些特征和模型。它把被动救火变成主动预防,是数据治理的基石,而不是展示品。
为何常见:血缘的载体是一张图,直观上像“可视化大屏”,其排障价值往往要等到出事故时才被真正意识到。
误区自建特征平台意味着从 Hadoop、Spark、Redis 到监控报警全部自己开发,否则就不算“自建”。
正解自建是“集成 + 编排 + 治理”,不是重新发明锅碗瓢盆。主流做法是在成熟开源引擎之上,把特征注册、加工调度、双存储、统一 API、质量监控串成一条流水线。核心工作量是标准化流程,就像老王建中央厨房买的是现成冰柜和灶台,重头戏在流程设计与管理规范。
为何常见:“自建”两个字让人联想到从零造轮子,忽略了工程上复用开源、按需演进的常识。
面试题
Q1. 自建特征平台最核心的定位是什么?
- A.把特征统一存进数据库供查询
- B.给模型提供训练数据样本集
- C.覆盖加工存储服务的全链路← 正确答案
- D.替代所有实时计算引擎
答案:C。特征平台的价值在于全链路统一,像中央厨房解决的是从采购到配送的完整流程,而不只是多买一个冰箱。把特征存进数据库只是存储环节;给模型提供样本、替代计算引擎都偏离了平台定位,平台是服务于特征生命周期的,不是服务于某一种计算引擎。
Q2. 在线特征存储通常选用什么类型的数据库?
- A.离线数仓 Hive 分区表
- B.消息队列 Kafka 集群
- C.在线低延迟缓存 Redis← 正确答案
- D.搜索引擎 ES 索引库
答案:C。备料台要的是“一伸手就拿到”,在线特征存储必须毫秒级、高并发,Redis 这类 KV 缓存最合适。Hive 是冷库、Kafka 是食材运输车、ES 偏搜索场景,都不适合做在线特征的主存储。
Q3. 训练样本发生在 t=10,特征取值应遵循什么规则?
- A.用 t=10 之前最近的值← 正确答案
- B.用 t=12 未来时刻的值
- C.用所有历史值的平均数
- D.用未来一周的平滑值
答案:A。这是时间点正确性(Point-in-Time)规则:训练样本只能用样本时刻之前的信息,否则等于偷看未来,会造成训练与上线不一致。就像做菜只能用“开火前备好的料”,不能用“出锅后补买的料”。
Q4. 离线在线特征一致性校验的常用做法是什么?
- A.只比较特征名称是否相同
- B.每天人工抽查几十条样本
- C.让离线直接调用在线服务
- D.同源数据双跑并比对差异← 正确答案
答案:D。一致性校验的黄金标准是同源双跑:同一批数据在离线和在线各算一遍,再比对差异率。只比名称、人工抽查、让离线调在线服务,都覆盖不了“计算口径、时间窗口不一致”这类深层问题。
Q5. PSI 指标在特征平台中主要用于什么?
- A.衡量特征存储的容量大小
- B.检测线上特征分布漂移← 正确答案
- C.计算特征任务的耗时
- D.评估平台的请求延迟
答案:B。PSI 衡量线上特征分布与训练基准分布的漂移程度,是品控台的核心仪表。存储容量、任务耗时、访问延迟都不是 PSI 能回答的问题,它们分别属于容量规划、调度监控和性能监控的范畴。
Q6. 特征血缘追踪的主要价值是什么?
- A.画出漂亮的数据依赖图
- B.替代特征质量监控告警
- C.变更影响分析与排障← 正确答案
- D.自动生成模型训练代码
答案:C。血缘的价值在于变更影响分析和排障:上游表下线前能预警,特征出问题能溯源到具体加工环节。画图只是血缘的呈现形式,监控告警与血缘是互补而非替代关系,自动生成训练代码更是无中生有。
Q7. 特征时效性分级设计的核心依据是什么?
- A.业务延迟需求与成本平衡← 正确答案
- B.存储成本越低时效越高
- C.全部特征统一实时计算
- D.特征数量越多时效越高
答案:A。时效分级依据永远是业务延迟需求与成本、稳定的平衡:要生鲜的给实时链路,能冷冻的走批处理。“成本越低时效越高”是伪命题,因为实时必然更贵;“全部实时”和“数量越多越实时”都忽视了成本约束与必要性。
Q8. 自建特征平台的存储体系通常包含哪些部分?
- A.离线批量特征存储← 正确答案
- B.在线低延迟特征缓存← 正确答案
- C.特征元数据注册表← 正确答案
- D.模型训练代码仓库
答案:ABC。平台双存储体系 = 离线存储(冷库)+ 在线缓存(备料台)+ 元数据注册表(菜谱档案)。模型训练代码仓库属于研发资产,不属于特征平台的存储体系,两者边界要分清。
Q9. 解决训练与上线特征不一致的方法包括?
- A.统一特征定义与计算逻辑← 正确答案
- B.时间点正确性取数← 正确答案
- C.定期一致性比对校验← 正确答案
- D.完全禁用实时特征计算
答案:ABC。解决不一致三件套:统一定义与计算逻辑(同一份菜谱)、时间点正确性取数(不偷看未来)、定期一致性比对(品控抽检)。完全禁用实时特征计算是因噎废食,实时特征是风控等场景的刚需,关键是用对方法而不是一刀切。
Q10. 关于自建特征平台的落地实践,说法正确的有?
- A.先试点再推广的演进路线← 正确答案
- B.在开源组件上做集成与治理← 正确答案
- C.只上线新特征不做治理迁移
- D.统一特征注册规范与血缘← 正确答案
答案:ABD。落地实践的正确姿势:先试点再推广(先从招牌菜入手)、在开源组件上做集成与治理(不重复造轮子)、统一注册规范与血缘(让存量也纳入管理)。只上线新特征不做存量治理迁移,会让新旧两套体系长期并存、治理失效,是一步典型的弯路。