你决定开一家私厨,而不是加盟中央厨房。中央厨房省心:菜谱现成、供应链成熟、按份付费。但你的招牌菜需要独门配方,食材必须锁在自己店里,出品火候要自己说了算——于是你签下店面,雇厨师,买灶台,从此掌勺人是你,守夜人也是你。这套“自己搭后厨”的决策,放到机器学习系统里,就是特征平台的自建方案。 自建特征平台,即不依赖现成的商业特征平台服务,而是基于 Kafka、Flink、Redis 等开源组件,由团队亲手搭建一套特征加工与管理的流水线。在这条流水线里,Kafka 是连接供应商与后厨的冷链传送带,把海量原始事件源源不断送进来;Flink 是灶台上的快手大厨,食材还在传送带上就顺手做好半成品特征;Redis 是后厨的保鲜冰箱,特征低温冷藏,模型推理时一伸手就能取到;Feature Store 元数据层则是管菜谱的账房先生,每道菜的做法、版本修订、食材来源都登记在册。 自建方案用自由度换来了复杂度:架构灵活可深度定制,数据全程内网可控,但服务器要自己扛、集群要自己调、深夜出故障要自己爬起来修。这篇文章,就把这套“私厨”的前厅后堂拆开给你看。

岗位关联

自建特征平台是机器学习团队深度掌控特征全生命周期的关键路径。理解它的架构取舍与成本结构,能帮助你在数据安全敏感或定制需求强烈的业务场景中做出正确技术决策,并落地一套可运维的特征基础设施。

目录
  1. 可视化演示
  2. 自建方案概述
  3. 流式接入层
  4. 流式计算层
  5. 在线存储层
  6. 元数据管理
  7. 运维与决策
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

自建特征平台方案结合开源组件构建定制化架构:Kafka和Flink处理流式特征计算,Redis提供在线存储,F... 切换模式查看不同维度。

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

自建特征平台:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

自建方案概述

你决定开一家私厨,而不是加盟中央厨房。中央厨房省心:菜谱现成、供应链成熟、按份付费。但你的招牌菜需要一个独门配方,数据必须锁在自己店里,出品火候要自己说了算——于是你签下店面,雇厨师,买灶台。这套“自己搭后厨”的思路,放到机器学习系统里,就是特征平台的自建方案。

所谓自建特征平台,是指不直接购买成熟的特征平台商业服务,而是基于 Kafka、Flink、Redis 等开源组件,由团队自己设计并搭建一套特征加工与管理的流水线。它把“数据→特征→模型”的链路全部握在团队自己手中,从源头到消费全程可控。相比商业方案的开箱即用,自建更强调定制化与数据主权。

一套典型的自建特征平台由四个层次构成。第一层用 Kafka 做数据接入,把业务系统产生的海量事件缓冲起来;第二层用 Flink 做流式特征计算,把原始事件实时加工为特征值;第三层用 Redis 做在线特征存储,支撑模型推理时的毫秒级读取;第四层用 Feature Store 做元数据管理,登记每个特征的定义、版本与血缘。四层各司其职,构成一条完整的特征生产线。

私厨的账算下来,五年经营总花费未必比中央厨房外包便宜。但如果你有不能外泄的独家秘方(数据安全要求)、招牌菜必须按自己方式来(深度定制),那么这份多花的钱,买的是掌控力。

TCO=Cbuild+T×(Cops+Clabor)\displaystyle TCO = C_{\text{build}} + T \times (C_{\text{ops}} + C_{\text{labor}})
通俗说明:自建平台的长期总投入,等于一次性建设费用,加上每年运维与人力成本乘以运行年限。开源组件本身免费,但围绕它们运转的机器和人,才是真正的成本大头。
  1. 建设成本 C_build平台搭建初期的服务器采购、集群配置与基础代码开发投入,类似私厨开张前的装修和灶具费。
    Cbuild=Chardware+Cengineering\displaystyle C_{\text{build}} = C_{\text{hardware}} + C_{\text{engineering}}
  2. 年度运维成本 C_ops集群日常运行的机器费用、带宽、监控告警等资源开销,逐年累加。
    Cops=Cservers+Cmonitoring\displaystyle C_{\text{ops}} = C_{\text{servers}} + C_{\text{monitoring}}
  3. 人力成本 C_labor全职维护特征平台的工程师薪资,随团队规模增长。
    Clabor=Nengineers×Salaryyear\displaystyle C_{\text{labor}} = N_{\text{engineers}} \times \text{Salary}_{\text{year}}
  4. 运行年限 T平台服役时间越长,年度开销累加越多,因此长期 TCO 往往远超建设费。
    TCO=Cbuild+T×(Cops+Clabor)\displaystyle TCO = C_{\text{build}} + T \times (C_{\text{ops}} + C_{\text{labor}})

流式接入层

私厨的生命线是食材供应链。即使厨艺再高,供应商送货混乱、食材在门口堆成山,后厨也开不了工。Kafka 就是那条冷链传送带外加临时周转仓:供应商(业务系统)把食材(行为事件)放到传送带上,后厨按节奏取用,再急的货也有条不紊。

Kafka 是分布式消息队列,担任特征平台的数据接入层。App 日志、Web 埋点、数据库变更等生产端把事件写入 Kafka 的主题,特征计算服务作为消费端订阅这些事件。生产者和消费者互不感知,上游故障不会直接压垮下游,这就是解耦的价值——传送带有缓冲仓,就算供应商一时疯狂供货,后厨也不会被堵死。

Kafka 的高吞吐来自分区机制。一个主题被拆成多个分区,每个分区是独立的顺序队列,可并行读写。分区越多,并行度越高,集群吞吐越大。但分区也不是越多越好,过多会增大元数据管理开销——传送带铺得太满,仓库也会乱。

传送带设计得好,后厨接货从容;传送带过多,仓库通道挤满反而碍事。私厨的传送带是几米台面,Kafka 的分区是集群里的资源账,都要精打细算。

Q≈P×Rpartition\displaystyle Q \approx P \times R_{\text{partition}}
通俗说明:集群总吞吐约等于分区数量乘以单分区处理速率。想提高接货速度,先看单条传送带是否吃满,再考虑加传送带。
  1. 分区数 P主题下分区的数量,决定并行读写的通道数,每多一条分区就多一条并行的传送带。
    P=partitionCount(topic)\displaystyle P = \text{partitionCount}(\text{topic})
  2. 单分区速率 R_partition每条分区每秒处理的记录条数,由磁盘、网络与副本机制决定。
    Rpartition=Nrecordssecond\displaystyle R_{\text{partition}} = \frac{N_{\text{records}}}{\text{second}}
  3. 总吞吐 Q所有分区速率相加的近似值,体现横向扩展的收益。
    Q≈P×Rpartition\displaystyle Q \approx P \times R_{\text{partition}}

流式计算层

食材到了后厨,不能直接端上桌。需要快手大厨在食材最鲜活时快速加工成半成品:切配、焯水、腌渍,客人下锅即烹。Flink 就是那位站在传送带旁的大厨——食材经过时,顺手就把特征做好了,锅气十足。

Flink 是流式计算引擎,订阅 Kafka 中的原始事件,在内存中持续进行窗口聚合、关联、过滤等操作。与离线批处理每天算一次不同,Flink 让特征值秒级甚至毫秒级更新,模型能感知到用户刚刚发生的动作。这种“热炒”能力,是自建方案区别于离线特征管道的核心优势。

滑动窗口是最常见的场景之一。比如“最近 5 分钟点击次数”:Flink 维护一个随事件推进的窗口,新事件进入、旧事件滑出,窗口内均值实时更新。窗口越大,特征越平滑但滞后越明显;窗口越小,特征越敏感但噪音越大。快手大厨对火候的把握,就体现在窗口参数的选择上。

私厨讲究锅气,菜要趁热吃。Flink 让特征带着最新状态上桌,而不是拿昨天的库存凑合。窗口大小就像火候——火大了菜焦,火小了菜生。

xˉt=1N∑i=1Nxt−i\displaystyle \bar{x}_t = \frac{1}{N} \sum_{i=1}^{N} x_{t-i}
通俗说明:t 时刻的滑动平均特征,等于当前窗口内最近 N 条事件值的算术平均。
  1. 事件值 x_{t-i}窗口内第 i 条历史事件的数值,比如一次点击行为记为 1。
    xt−i,i=1,2,…,N\displaystyle x_{t-i}, \quad i = 1, 2, \dots, N
  2. 窗口大小 N窗口内包含的事件条数,是滑动窗口的“尺子”,决定特征平滑度。
    N=windowSize of Flink\displaystyle N = \text{windowSize of Flink}
  3. 滑动均值 \bar{x}_t窗口内所有事件求和再除以 N,作为当前时刻的特征输出。
    xˉt=1N∑i=1Nxt−i\displaystyle \bar{x}_t = \frac{1}{N} \sum_{i=1}^{N} x_{t-i}

在线存储层

半成品加工完,不能堆在案板上等着氧化变质。后厨需要一台保鲜冰箱,把食材分门别类冷藏起来,客人点菜时一伸手就能取到。Redis 就是这台冰箱:基于内存存取,毫秒级响应,一份食材一秒内取一万次也不带喘气。

在线推理时,模型对特征读取的延迟要求极高,通常需要在几毫秒内拿到结果。如果每次请求都现场从原始数据现算特征,几十甚至几百毫秒的延迟会让业务无法接受。因此 Flink 算出的特征值写入 Redis,推理服务直接从缓存取用,一读一个准。这一取一放之间,就是自建平台的“出菜速度”。

Redis 是内存键值数据库,特征以“用户ID:特征名”为键存储。写入时设置 TTL 过期时间,超过保质期的特征自动失效;当缓存未命中时,系统回退到离线批量特征或触发重算。TTL 的选择需要权衡:太短导致大量未命中回退,太长则让模型吃到发馊的旧特征。

冰箱不是保险柜,食材会过期。Redis 的 TTL 就是保质期标签——过期食材一律丢弃,宁缺毋滥,绝不给模型端上变质特征。

H=NhitNhit+Nmiss\displaystyle H = \frac{N_{\text{hit}}}{N_{\text{hit}} + N_{\text{miss}}}
通俗说明:缓存命中率等于从冰箱成功拿到食材的次数除以总取用次数。命中率越高,平台读取越稳定、延迟越可控。
  1. 命中次数 N_hit请求特征时在 Redis 中直接读到了有效值,相当于从冰箱顺利取到食材。
    Nhit\displaystyle N_{\text{hit}}
  2. 未命中次数 N_miss键不存在或已过期,需要走降级路径,相当于食材过期白跑一趟冰箱。
    Nmiss\displaystyle N_{\text{miss}}
  3. 命中率 H命中率接近 1 说明缓存健康,过低则要检查 TTL 或写入链路。
    H=NhitNhit+Nmiss\displaystyle H = \frac{N_{\text{hit}}}{N_{\text{hit}} + N_{\text{miss}}}

元数据管理

后厨里最不起眼却最要命的角色,是管菜谱的账房先生。大厨改了两版配方,没有人记录,三个月后谁也说不出眼前这道菜到底怎么做的。Feature Store 元数据层,就是自建特征平台里的账房先生。

特征平台与传统散落脚本之间最本质的差别,在于元数据治理。每个特征在 Feature Store 中登记:特征名、计算逻辑、数据类型、数据粒度、版本号、标签、数据来源、使用方。这份注册表让特征从“某个工程师脑中的想法”变成“企业可查询、可复用、可追溯的资产”,不再依赖个人记忆。

元数据层有三个核心能力。特征注册:新特征先登记再上线,消费方按名查找,杜绝重复造轮子。版本管理:特征逻辑变更时递增版本号,新版本灰度、旧版本可回溯,模型出问题能快速回滚。血缘追踪:记录特征从哪些原始表或事件计算而来,为数据质量排查和合规审计提供依据。

有了账房先生,大厨换了三拨,招牌菜做法依旧有据可查。没有菜谱账本的后厨,做得再好吃也是一本乱账——线上模型出了 Bug,你敢拍胸脯说出用的是哪版特征吗?

F(v)=Lookup(name,version)\displaystyle F^{(v)} = \text{Lookup}(\text{name}, \text{version})
通俗说明:给定特征名和版本号,元数据层就能返回对应的特征定义,像按菜名和版次从账本里翻出那道菜的完整做法。
  1. 特征名 name全局唯一的特征标识,例如“用户点击率”。
    name="click_rate"\displaystyle \text{name} = \text{"click\_rate"}
  2. 版本号 version每次变更递增的版本编号,用于区分不同代际的特征定义。
    version=2\displaystyle \text{version} = 2
  3. 查表 Lookup元数据引擎按名称和版本号检索定义项并返回,完成一次“点菜翻账本”。
    F(v)=Lookup(name,version)\displaystyle F^{(v)} = \text{Lookup}(\text{name}, \text{version})

运维与决策

私厨不是开张就万事大吉。每天要盯火候、管库存、应对煤气管道检修、给厨师排班。自建特征平台也一样,搭建期的兴奋劲过去后,真正考验人的是日复一日的运维。

自建方案带来三方面运维负担。资源层面:Kafka、Flink、Redis 集群需要常驻机器,容量规划跟不上就会在流量洪峰时捉襟见肘。监控层面:消费者 Lag 堆积、Flink checkpoint 失败、Redis 内存打满,每一项都需要可观测告警。演进层面:开源组件迭代快,需要跟踪上游版本、打安全补丁并验证兼容性。这三点如同后厨的水电燃气,哪一路断了火都炒不成菜。

因此选型本质是一道多目标权衡题。灵活性、安全可控性、性能水平是自建的收益项;运维负担是自建的代价项。不同团队给各项的权重不同:数据敏感的金融团队将安全权重拉满,快速试错的创业团队则会把运维权重看得很重。这份权重表,就是私厨老板的生意经。

自建不是信仰,而是一道算术题。账房有余粮、后厨能手多、对菜谱有极致掌控欲的团队,自建私厨值得一搏;反之,外包吃现成也不丢人。算清账,再掌勺。

Score=w1F+w2S+w3M−w4O\displaystyle \text{Score} = w_1 F + w_2 S + w_3 M - w_4 O
通俗说明:方案评分等于各维度收益加权求和,再减去运维代价。总分高者胜出,自建与商业方案的 PK 最终落到这个算式上。
  1. 灵活性 F自建可对特征链路做任意定制,这是自建最大的加分项。
    F=flexibility(approach)\displaystyle F = \text{flexibility}(\text{approach})
  2. 安全可控 S数据不出内网、权限自主掌控,是合规场景的关键得分项。
    S=security(approach)\displaystyle S = \text{security}(\text{approach})
  3. 性能水平 M吞吐、延迟、稳定性等运行时指标。
    M=performance(approach)\displaystyle M = \text{performance}(\text{approach})
  4. 运维代价 O人力与资源成本,计算总分时需要减掉。
    O=operationCost(approach)\displaystyle O = \text{operationCost}(\text{approach})
  5. 权重 w_i按团队场景自行标定,反映不同决策者的价值取向。
    Score=w1F+w2S+w3M−w4O\displaystyle \text{Score} = w_1 F + w_2 S + w_3 M - w_4 O

AI 应用场景

电商大促的实时推荐特征平台

阶段:在线特征计算与特征检索

解决的问题:大促期间用户行为瞬息万变,离线特征 T+1 更新,用户刚点击的商品无法立刻进入推荐候选的考量特征中。传统方案要么全量重算特征(资源开销巨大),要么放弃实时性,推荐效果滞后。自建平台用 Kafka 接入点击流,Flink 秒级聚合用户实时兴趣特征并写入 Redis,推荐服务在候选生成时毫秒级读取,兼顾时效与成本。

具体案例:某头部电商对大促流量峰值做特征平台自建改造,Kafka 集群支撑百万 QPS 点击事件,Flink 在 5 秒窗口内产出用户与商品交互特征,Redis 缓存命中率 99.2%,推荐 CTR 提升 12%,大促期间无一次特征链路故障。

银行实时交易反欺诈

阶段:流式特征计算与特征资产管理

解决的问题:欺诈交易在几百毫秒内完成,模型需要在交易授权前完成跨渠道特征聚合。同时金融合规要求特征计算逻辑可审计、可追溯。自建方案能保证敏感交易数据不出内网,且 Feature Store 完整记录特征版本与血缘,满足监管要求。传统手工脚本算特征,既慢又查不清来源。

具体案例:某股份制银行建设自研风控特征平台,交易事件经 Kafka 进入 Flink,按账户维度实时滑动窗口聚合交易频次、金额方差等特征,Redis 缓存供风控决策引擎读取。上线后高风险交易识别延迟从 200ms 降至 50ms,特征变更从“改代码发版”变为“Feature Store 注册新版本并灰度”。

Python 演示

python84 行
import randomimport timefrom collections import deque  class FeatureMetaStore:    """Feature Store 元数据层: 注册特征定义、版本与血缘"""     def __init__(self):        self.registry = {}     def register(self, name, version, formula, source):        self.registry[name] = {            "version": version,            "formula": formula,            "source": source,        }        print(f"[登记] 特征 {name} v{version}, 来源: {source}")     def lookup(self, name, version=None):        if name not in self.registry:            raise KeyError(f"特征 {name} 未注册")        item = self.registry[name]        if version is not None and item["version"] != version:            raise ValueError(f"版本不匹配: 需要 v{version}, 现有 v{item['version']}")        return item  class WindowAggregator:    """模拟 Flink 滑动窗口聚合计算"""     def __init__(self, window_size):        self.buffer = deque(maxlen=window_size)     def push(self, event):        self.buffer.append(event["value"])        return sum(self.buffer) / len(self.buffer)  class FeatureCache:    """模拟 Redis 在线特征缓存, 带 TTL 过期与命中率统计"""     def __init__(self, ttl):        self.ttl = ttl        self.storage = {}        self.hit = 0        self.miss = 0     def write(self, key, value):        self.storage[key] = (time.time() + self.ttl, value)     def read(self, key):        item = self.storage.get(key)        if item is None or time.time() > item[0]:            self.miss += 1            return None        self.hit += 1        return item[1]     def hit_rate(self):        total = self.hit + self.miss        return self.hit / total if total else 0.0  def main():    meta = FeatureMetaStore()    meta.register("click_rate", 1, "最近5条点击均值", "user_click_events")     agg = WindowAggregator(window_size=5)    cache = FeatureCache(ttl=3)     for _ in range(100):        event = {"user_id": 1001, "value": random.randint(0, 10)}        feature = agg.push(event)        cache.write("user:1001:click_rate", feature)        cache.read("user:1001:click_rate")        time.sleep(0.01)     print(f"缓存命中率: {cache.hit_rate():.2f}")    print(meta.lookup("click_rate", 1))  if __name__ == "__main__":    main()
目的:用三个轻量类模拟自建特征平台的核心链路——Flink 式滑动窗口聚合、Redis 式特征缓存、Feature Store 元数据登记。
  1. def register(self, name, version, formula, source):特征上线前先在元数据层登记,相当于菜谱入账本。
  2. item = self.registry[name]按特征名从注册表取定义,实现“按名查找特征”。
  3. self.buffer = deque(maxlen=window_size)deque 自动丢弃最旧元素,天然实现滑动窗口。
  4. def write(self, key, value): self.storage[key] = (time.time() + self.ttl, value)写入时记录过期时间戳,模拟 Redis TTL。
  5. if item is None or time.time() > item[0]:读到过期键视为未命中,防止模型用陈旧特征。
  6. event = {"user_id": 1001, "value": random.randint(0, 10)}模拟一条用户行为事件从数据源进入平台。
  7. feature = agg.push(event)聚合器吃进一条事件,产出最新窗口均值特征。
  8. print(meta.lookup("click_rate", 1))查询特征定义,演示元数据追溯能力。

常见误区

误区“开源组件不要钱,自己拿 Kafka、Flink、Redis 拼一套,肯定比买商业平台省钱。”

正解开源组件的 license 免费,但平台≠组件。集群机器要钱、监控体系要开发、组件升级要人跟进、半夜告警要人爬起来看。就像私厨不用交加盟费,可厨师工资、灶具维修、食材耗损、水电燃气全是自己扛。把 TCO 算完整,自建五年总成本常常超过商业方案。

为何常见:人容易只盯着看得见的“采购费”,忽略看不见的“运维人力”。一次性的省,掩盖了长期的细水长流。

误区“我们特征算完写进 Redis,模型直接读,这不就是特征平台吗?”

正解有冰箱不等于有后厨。特征平台的核心不是存储,而是对特征全生命周期的治理:特征怎么定义、谁来维护、版本怎么变、被哪些模型使用。没有元数据层,换个人就说不清特征逻辑,特征复用靠口口相传——这离“平台”差着一个 Feature Store。

为何常见:架构图上最显眼的是 Redis,很多人把存储环节误当成平台全部,忽略了不可见的治理层。

误区“Kafka 接数据,Flink 算特征,Redis 存结果,三件套装完就是一个能上线的实时特征平台。”

正解这三件只是计算与存储链路。生产环境还需要:Schema 校验与压缩、消费位点监控、计算延迟告警、缓存数据回填、特征版本灰度。三件套帮你把路铺好,但路上的交通管制、天气预警、事故救援全得自己补。工程化程度才是平台和 Demo 的区别。

为何常见:Demo 跑通令人兴奋,人们容易误把“能跑”当“能扛”。

误区“特征逻辑改了,代码里加个注释'v2',上线群知会一声,产品就跑得了。”

正解模型出问题需要回滚时,没有登记过的版本无从回溯。六个月前的线上模型用了哪版特征?旧版计算逻辑是什么?没有元数据记录只能瞎猜。Feature Store 的版本管理就像菜谱的修订记录,看似繁琐,救急时才知道珍贵。

为何常见:版本管理在平时毫无存在感,只有线上事故时才凸显价值,因此容易被忽视。

面试题

Q1. 自建特征平台通常最不适合哪种团队?

单选题 · easy

  • A.有特殊数据安全要求的大机构
  • B.需要深度定制特征逻辑的团队
  • C.缺人且业务变化快的创业团队← 正确答案
  • D.有成熟数据工程团队的大厂

答案:C。自建方案运维成本高,需要专职工程师长期维护。缺人且业务快速变化的创业团队最不适合背负这套重资产。A、B、D 分别对应数据安全、深度定制、成熟工程能力,都是自建方案的典型适用场景。

Q2. Kafka在自建特征平台中扮演什么角色?

单选题 · easy

  • A.实时特征计算引擎
  • B.特征在线缓存数据库
  • C.数据接入消息管道← 正确答案
  • D.特征元数据注册中心

答案:C。Kafka 是分布式消息队列,担任数据接入层,负责缓冲和传递事件流,就像食材传送带。A 是 Flink 的职责,B 是 Redis 的职责,D 是 Feature Store 的职责。

Q3. Flink滑动窗口均值公式中 N 代表什么?

单选题 · mid

  • A.窗口内事件总数← 正确答案
  • B.窗口滑动步长
  • C.消息队列分区数量
  • D.特征存储版本号

答案:A。滑动窗口均值 $\bar{x}_t = \frac{1}{N}\sum x_{t-i}$ 中 N 是窗口内事件条数,相当于窗口这把“尺子”的长度。B 是窗口推进的间隔,C 是 Kafka 概念,D 是 Feature Store 概念,均与 N 无关。

Q4. Redis做特征在线存储的核心优势是?

单选题 · easy

  • A.支持SQL复杂查询
  • B.内存亚毫秒级读取← 正确答案
  • C.可持久化海量历史数据
  • D.内置流式窗口计算

答案:B。Redis 基于内存存取,读取延迟在亚毫秒级,适合在线推理场景。A 错误,Redis 不是关系型数据库;C 错误,Redis 不适合海量历史数据存储;D 是 Flink 的能力。

Q5. Feature Store元数据层应记录哪些信息?

多选题 · mid

  • A.特征计算公式与逻辑← 正确答案
  • B.特征版本与变更信息← 正确答案
  • C.特征对应数据血缘← 正确答案
  • D.模型最终预测结果

答案:ABC。元数据层记录特征的“菜谱”:计算逻辑、版本变更、数据血缘,目的是让特征可查询、可追溯、可复现。D 是模型输出,属于模型服务的产物,不属于特征元数据范畴。

Q6. 自建方案全成本 TCO 不包括以下哪一项?

单选题 · mid

  • A.开源软件许可费用← 正确答案
  • B.服务器与网络硬件
  • C.运维工程师人力成本
  • D.系统排障时间成本

答案:A。自建方案使用 Kafka、Flink、Redis 等开源组件,软件许可证免费,因此不产生许可费用。B、C、D 都属于 TCO 公式中建设成本、运维和人力成本的组成部分。

Q7. Kafka分区数增加一倍的直接目的是?

单选题 · hard

  • A.提高单分区消息顺序性
  • B.提升集群整体吞吐能力← 正确答案
  • C.减少Redis特征过期数量
  • D.降低Flink窗口计算延迟

答案:B。分区是 Kafka 并行读写的基本单位,分区数翻倍意味着并行通道翻倍,整体吞吐随之提升。A 错误,分区增多反而降低全局顺序性。C、D 与 Kafka 分区数无直接关系。

Q8. 模型上线后发现有特征计算逻辑Bug,正确做法是?

单选题 · hard

  • A.直接改线上代码发布新版本
  • B.注册新版本并灰度回放验证← 正确答案
  • C.删除旧特征并重建缓存数据
  • D.停用Redis让模型走离线特征

答案:B。正确的特征变更流程是在 Feature Store 注册新版本,灰度回放历史数据验证正确性后再逐步切换。A 缺少可追溯性;C 破坏历史版本;D 会显著增加推理延迟,都不是工程化做法。

Q9. 自建特征平台相对商业方案的劣势包括哪些?

多选题 · hard

  • A.初期搭建需投入更多研发资源← 正确答案
  • B.长期运维需要投入专职团队← 正确答案
  • C.功能迭代完全依赖内部能力← 正确答案
  • D.无法满足个性化业务需求

答案:ABC。自建需要从零搭建组件链路、承担长期运维、自主迭代功能,这些都是劣势。D 错误——自建恰恰擅长满足个性化定制需求,这正是团队选择自建的重要原因之一。

Q10. 某银行因合规要求决定自建特征平台,以下做法合理的有?

多选题 · extreme

  • A.用Kafka承接交易事件并缓冲流量← 正确答案
  • B.用Flink实时聚合特征防范欺诈← 正确答案
  • C.用Redis存特征供风控模型读取← 正确答案
  • D.用Feature Store管理版本血缘← 正确答案

答案:ABCD。A 用 Kafka 做数据接入缓冲,B 用 Flink 做实时聚合,C 用 Redis 做在线特征读取,D 用 Feature Store 做元数据治理,四者共同构成一条合规、可控、可审计的自建特征流水线,全部合理。