ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Jev决策系统架构实战:从特征工程到决策层的三层分离与生产落地

Jev决策系统架构实战:从特征工程到决策层的三层分离与生产落地 1. 从概念到生产Jev 决策系统到底在解决什么问题第一次听到“Jev”这个词很多人会以为又是一个套壳的 AI 概念。我最初也是这么想的直到在一个风控决策项目里被规则引擎的维护成本折磨了三个月才开始认真研究这套东西。Jev 本质上是一套面向生产环境的 AI 决策系统架构范式它的核心主张很朴素把“模型推理”和“业务决策”这两件事彻底拆开让决策逻辑可以独立于模型版本进行迭代、回滚和审计。这件事为什么重要做过线上决策系统的人都有体会。传统做法是把模型分数直接接到 if-else 规则里比如“分数大于 0.8 就拒绝0.5 到 0.8 转人工”。上线初期没问题但半年后你会发现模型换了三代规则改了十几版没人说得清当前线上到底是哪套逻辑在跑。更麻烦的是当业务方要求“把上周那个拒绝策略回滚一下”你得翻 Git 记录、找模型版本、重新跑一遍回归测试运气不好还要重新训练。Jev 要解决的就是这个“决策逻辑与模型耦合”的顽疾。它把整个决策链路抽象成三层特征层负责数据加工模型层负责打分预测决策层负责根据分数和业务规则输出最终动作。三层之间通过标准化的接口通信任何一层变更都不影响其他层。这个思路听起来简单但真正落地时每一层的边界怎么划、接口怎么定、版本怎么管全是坑。适合谁来参考这套东西如果你正在做推荐系统、风控引擎、智能客服路由、动态定价这类需要“模型输出业务规则”共同决策的场景Jev 的架构思路可以直接抄作业。如果你只是跑个离线分析、做个 demo那没必要上这套重架构杀鸡用牛刀反而拖慢迭代速度。我见过不少团队在日请求量不到一万的时候硬上决策中台结果光维护那套基础设施就耗掉两个人力得不偿失。还有一个容易被忽略的点Jev 这套东西对“可解释性”的重视程度远超普通 ML 流水线。每个决策结果都要能追溯到具体是哪条规则、哪个模型版本、哪些特征值共同作用的结果。这在金融、医疗、保险这类强监管行业几乎是刚需。我参与过一个信贷审批项目监管方要求每一笔拒绝都要给出可复核的理由当时用传统方案折腾了两个月才勉强达标后来换成 Jev 的分层架构决策日志天然就带完整溯源信息省了大量返工。2. 核心架构拆解三层分离到底怎么分2.1 特征层别把特征工程做成特征堆积特征层是 Jev 架构的地基也是最容易被做烂的一层。我见过太多团队把特征层当成“数据搬运工”从数仓拉一堆字段出来直接塞给模型结果线上推理时特征缺失率高达 15%模型效果直接打七折。Jev 对特征层的核心要求是每个特征必须有明确的时效性声明和缺失处理策略。时效性分三类静态特征如用户注册渠道天级更新、准实时特征如近 7 天点击率小时级更新、实时特征如当前会话时长秒级更新。不同时效性的特征走不同的计算链路静态特征走离线数仓准实时特征走流批一体实时特征走内存计算。缺失处理策略更关键。很多团队的做法是“缺失填 0”这在某些场景下是灾难。比如“用户历史逾期次数”这个特征缺失可能意味着“新用户无记录”也可能意味着“数据同步失败”。前者填 0 合理后者填 0 就是误导模型。Jev 的做法是给每个特征配一个缺失标识位模型同时接收特征值和缺失标识让模型自己学习缺失模式的影响。实操心得特征层的 schema 一定要版本化。我踩过的坑是上游数仓改了一个字段类型从 int 变成 string下游模型直接报错。后来强制要求所有特征变更必须走 schema registry变更前先跑兼容性测试这个问题再没出现过。特征层的另一个重点是特征复用。同一个特征可能被多个模型使用如果每个模型各自计算一遍不仅浪费资源还可能因为计算逻辑不一致导致线上线下效果偏差。Jev 的做法是建立统一的特征平台所有特征注册后生成唯一 ID模型通过 ID 引用特征平台负责保证线上线下计算逻辑一致。这个“一致性”说起来容易做起来需要一套完整的特征回填和校验机制。2.2 模型层多模型编排比单模型调参更重要模型层在 Jev 架构里不是“一个模型”而是“一组模型的编排”。生产环境里很少只跑一个模型常见的是一个主模型负责主要打分若干辅助模型负责特定场景如新用户冷启动、异常检测再加一个兜底规则模型防止主模型失效时系统崩溃。Jev 对模型层的管理有几个硬性要求。第一每个模型必须有独立的版本号和灰度策略。新模型上线不能直接全量替换要先跑 shadow mode影子模式把新模型的打分结果和旧模型对比确认分布没有剧烈偏移后再逐步放量。第二模型输入输出必须标准化。不管底层是 XGBoost、深度网络还是规则引擎对外统一暴露 predict(features) - score 接口决策层不关心模型内部实现。这里有个容易踩的坑模型版本和特征版本的对应关系。我见过一个事故模型升级到 v3 版本但特征平台还是 v2 版本的特征结果模型效果暴跌。原因是 v3 模型训练时用了新特征但上线时特征平台没同步升级。Jev 的解法是在模型元数据里强制记录依赖的特征版本上线时自动校验不匹配直接拒绝发布。模型层的性能优化也值得单独说。线上推理对延迟极其敏感P99 超过 100ms 就可能影响用户体验。Jev 的常见优化手段包括模型量化FP32 转 INT8精度损失通常小于 1%但推理速度提升 2-3 倍、请求批处理把多个请求合并成一个 batch 推理、模型缓存对相同特征组合缓存打分结果。这些手段不是银弹需要根据具体场景权衡。比如风控场景对精度极度敏感量化就要慎重推荐场景对延迟更敏感量化收益就很大。2.3 决策层业务规则的工程化管理决策层是 Jev 架构里最“业务”的一层也是最能体现这套架构价值的地方。传统做法把业务规则硬编码在代码里改一条规则要走完整的发布流程快则半天慢则一周。Jev 把决策逻辑抽象成规则集决策流的模型规则集是原子条件的集合决策流是规则集的编排。举个例子。一个信贷审批的决策流可能是先过反欺诈规则集命中则直接拒绝未命中则过信用评分规则集根据分数区间走不同分支高分直接通过中分转人工低分拒绝。每个规则集可以独立配置、独立测试、独立发布。业务方改一条规则只需要在管理后台调整规则集保存后实时生效不需要研发介入。决策层的规则引擎选型是个关键决策。常见方案有三种Drools老牌 Java 规则引擎功能全但重、JSON 规则轻量自己解析灵活但容易失控、DSL 规则领域特定语言平衡灵活性和可控性。我的经验是规则数量少于 50 条时用 JSON 规则足够超过 100 条建议上 DSL超过 500 条才需要考虑 Drools 这类重型引擎。过早引入重型引擎学习成本和维护成本会拖垮小团队。注意决策层一定要有“模拟运行”功能。改规则前先用历史数据跑一遍模拟看看新规则会影响多少请求、多少比例的结果会变化。我见过一次事故业务方改了一条阈值规则没做模拟直接上线结果当天通过率从 60% 掉到 30%客服电话被打爆。决策层的另一个重点是决策日志。每条决策请求都要记录请求 ID、时间戳、输入特征快照、各模型打分、命中的规则、最终决策、决策耗时。这些日志不仅是排查问题的依据也是后续模型迭代的训练数据来源。日志存储建议用列式存储如 Parquet 格式方便后续做批量分析。3. 从零搭建一套 Jev 决策系统的完整实操3.1 环境准备与基础组件选型动手之前先把技术栈定下来。以下是我在多个项目里验证过的一套组合适合日请求量在百万级以内的场景组件选型理由特征存储Redis MySQLRedis 扛实时读写MySQL 做特征元数据管理模型服务Triton Inference Server支持多框架模型自带批处理和动态批处理决策引擎自研 DSL Python 执行器灵活可控规则热更新方便消息队列Kafka解耦特征计算和决策请求削峰填谷日志存储ClickHouse列式存储聚合查询快适合决策日志分析监控告警Prometheus Grafana生态成熟指标采集和可视化都方便这套组合的部署成本不高三台 8 核 16G 的机器就能跑起来。如果请求量更大把 Redis 换成集群版、Triton 加副本、Kafka 加分区即可水平扩展。环境准备阶段有几个容易忽略的细节。第一时钟同步。决策链路涉及多个服务如果各服务时钟不一致决策日志的时间戳会对不上排查问题时极其痛苦。所有节点必须配 NTP 同步。第二网络延迟。特征层、模型层、决策层如果跨机房部署网络延迟可能吃掉大部分性能预算。尽量部署在同一可用区。第三资源隔离。模型推理是 CPU 密集型特征计算可能是 IO 密集型决策执行是逻辑密集型三类服务混部会互相干扰。建议至少做进程级隔离有条件的话做容器级隔离。3.2 特征管道的搭建与校验特征管道是整套系统里最耗时的部分通常占整个项目 60% 以上的工作量。搭建流程分四步第一步特征盘点。把业务方、算法方、数据方拉到一起列出所有候选特征标注来源、时效性、缺失率、预期重要性。这一步不要怕花时间我见过太多项目因为特征盘点不充分做到一半发现关键特征拿不到被迫返工。第二步特征注册。每个特征在特征平台注册分配唯一 ID填写元数据特征名、数据类型、时效性、缺失处理策略、负责人、依赖的上游表。注册完成后生成特征 schema后续所有引用都通过 ID 进行。第三步特征计算。离线特征走 Spark 任务准实时特征走 Flink 任务实时特征走 Redis 读写。每个特征计算任务都要配数据质量校验空值率、分布偏移、枚举值范围。校验不通过时告警严重时阻断下游。第四步线上线下一致性校验。这是最关键也最容易偷懒的一步。做法是用同一批请求 ID分别走线上特征管道和离线特征管道对比两边产出的特征值。差异率超过阈值通常 0.1%就要排查原因。常见原因包括时间窗口边界不一致、数据源更新延迟、计算逻辑实现差异。# 特征一致性校验的简化示例 def validate_feature_consistency(request_ids, online_features, offline_features): mismatches [] for rid in request_ids: online online_features.get(rid, {}) offline offline_features.get(rid, {}) for feat_name in online: if feat_name not in offline: mismatches.append((rid, feat_name, missing_in_offline)) continue if abs(online[feat_name] - offline[feat_name]) 1e-6: mismatches.append((rid, feat_name, online[feat_name], offline[feat_name])) mismatch_rate len(mismatches) / (len(request_ids) * len(online_features)) if mismatch_rate 0.001: raise Alert(fFeature consistency check failed: {mismatch_rate:.4f}) return mismatches实操心得特征一致性校验要定期跑不要只在上线时跑一次。上游数据源变更、计算任务升级、甚至集群扩容都可能引入不一致。我现在的做法是每天凌晨用前一天的真实请求 ID 跑一次校验结果自动推到监控面板。3.3 模型服务的部署与灰度模型服务部署的核心目标是高可用、低延迟、易回滚。Triton 的配置有几个关键参数需要调优max_batch_size最大批处理大小。设太小浪费 GPU设太大增加延迟。经验值是 32 或 64根据模型大小和延迟要求调整。dynamic_batching动态批处理。开启后 Triton 会自动把短时间内到达的请求合并成 batch显著提升吞吐。instance_group实例数。每个模型可以起多个实例并行推理实例数根据 CPU/GPU 核数和模型计算量决定。灰度发布流程分四个阶段shadow mode新模型只记录打分不参与决策、小流量灰度1% 流量走新模型、逐步放量10% → 50% → 100%、全量切换。每个阶段至少观察 24 小时重点看打分分布是否偏移、决策结果变化率、下游业务指标如通过率、转化率是否异常。回滚机制必须自动化。一旦监控到异常指标如模型 P99 延迟超过阈值、决策结果分布剧烈偏移自动切回上一版本。手动回滚在凌晨三点出事的时候根本来不及。3.4 决策流的配置与测试决策流用 DSL 配置一个典型的 DSL 片段长这样decision_flow credit_approval { step anti_fraud { ruleset: anti_fraud_rules_v3 on_hit: reject on_miss: next } step credit_score { model: credit_model_v5 branches: [ { condition: score 0.8, action: approve }, { condition: 0.5 score 0.8, action: manual_review }, { condition: score 0.5, action: reject } ] } fallback: manual_review }这个 DSL 的设计要点步骤可编排、条件可组合、动作可扩展。步骤之间是串行关系每个步骤可以引用规则集或模型。条件表达式支持基本的比较和逻辑运算。动作包括通过、拒绝、转人工、加验证等。配置完成后必须做三类测试单元测试单个规则集的逻辑正确性、集成测试整个决策流的端到端行为、回归测试新配置与旧配置在历史数据上的结果对比。回归测试尤其重要我习惯用最近 7 天的真实请求做回归对比新旧配置的决策差异率差异率超过 5% 就要人工 review 每一条差异。4. 生产环境踩坑实录与排查手册4.1 特征类问题缺失、漂移、不一致特征问题是生产环境最高频的故障来源没有之一。我整理了一份速查表现象可能原因排查方法解决方案模型效果突然下降特征分布漂移对比近 7 天特征分布与训练集分布重新训练模型或调整特征部分请求决策异常特征缺失检查特征缺失率监控补数据或启用缺失兜底策略线上线下效果不一致特征计算逻辑差异跑一致性校验统一计算逻辑修复差异特征延迟高实时特征计算慢检查 Redis 慢查询、Flink 反压优化计算逻辑或加缓存特征漂移是最隐蔽的问题。模型训练时用的是三个月前的数据上线后用户行为变了特征分布跟着变模型效果自然下降。Jev 的做法是给每个特征配漂移监控计算近 7 天特征均值、方差、分位数与训练集对比偏移超过阈值就告警。这个监控救过我很多次有一次发现“用户近 1 小时点击次数”这个特征的均值从 3.2 涨到 8.7排查发现是上游埋点逻辑改了把曝光也计入了点击。4.2 模型类问题版本错配、性能退化、冷启动模型版本错配是低级但致命的错误。我见过一次模型服务加载的是 v5 模型但决策流配置里引用的是 v4 模型 ID结果决策层拿到的打分和预期完全对不上。根因是模型注册和决策流配置是两个团队维护缺乏联动校验。后来我们在发布流程里加了强制校验决策流引用的模型 ID 必须在模型服务里存在且状态为 active否则拒绝发布。性能退化通常发生在模型更新后。新模型可能参数量更大、计算更复杂导致推理延迟上升。上线前必须做性能压测用生产流量的 1.1 倍压力跑 30 分钟观察 P50、P95、P99 延迟和错误率。压测不通过不允许上线。冷启动问题在推荐和风控场景都很常见。新用户没有历史行为特征大量缺失模型打分不可靠。Jev 的解法是配一个冷启动决策流检测到关键特征缺失率超过阈值时自动切换到基于规则的兜底策略等积累足够行为数据后再切回模型决策。4.3 决策类问题规则冲突、优先级混乱、日志缺失规则冲突是决策层最头疼的问题。两条规则条件重叠但动作相反系统按什么顺序执行Jev 的规则引擎采用优先级首次命中策略每条规则有优先级按优先级从高到低匹配命中第一条就执行后续规则不再评估。这个策略简单可控但要求规则配置时必须显式指定优先级不能依赖默认顺序。优先级混乱通常发生在规则数量膨胀后。我的经验是规则超过 50 条就要做分组每组内部再排优先级。分组维度可以按业务场景反欺诈组、信用组、额度组或按决策阶段前置校验组、主决策组、后置校验组。分组后每组指定一个负责人避免所有人都在同一个规则集里改来改去。日志缺失是排查问题的最大障碍。决策日志必须包含请求 ID、时间戳、输入特征快照、各步骤执行结果、最终决策、总耗时。特征快照尤其重要没有它就无法复现问题。日志存储建议保留至少 30 天金融场景建议保留 180 天以上。避坑技巧决策日志的写入不要同步做用异步消息队列解耦。我早期版本同步写日志结果 ClickHouse 抖动时整个决策链路超时。改成异步后日志写入失败不影响决策只是丢日志后续补采即可。5. 性能优化与成本控制的实战经验5.1 延迟优化从 200ms 压到 50ms 的实操记录延迟优化要先定位瓶颈。用链路追踪工具如 Jaeger把每个环节的耗时打出来通常会发现 80% 的时间花在 20% 的环节上。我经手的一个项目初始 P99 延迟 210ms拆解后发现特征读取 80ms、模型推理 90ms、决策执行 20ms、网络传输 20ms。特征读取优化把高频特征预加载到本地缓存如 Caffeine减少 Redis 往返。批量读取特征一次 MGET 拿多个 key而不是循环 GET。优化后特征读取从 80ms 降到 25ms。模型推理优化开启 Triton 动态批处理把 batch size 从 1 调到 32。单次推理延迟从 90ms 涨到 120ms但吞吐提升 20 倍平均延迟反而降到 40ms。再加模型量化FP32 转 INT8进一步降到 25ms。决策执行优化DSL 解释执行改成预编译。规则集在保存时编译成 Python 字节码执行时直接调用省去解析开销。从 20ms 降到 5ms。网络传输优化特征层、模型层、决策层部署在同一可用区内网延迟从 20ms 降到 2ms。最终 P99 延迟 52ms满足业务要求。这套优化手段不是每个项目都要全上按瓶颈优先级逐个击破即可。5.2 成本控制别让决策系统变成吞金兽决策系统的成本主要在三块计算资源、存储、人力。计算资源方面模型推理是最大头。优化手段包括模型蒸馏大模型教小模型精度损失可控的前提下参数量降 10 倍、模型共享多个相似场景共用一个基础模型只微调头部、弹性伸缩低峰期缩容高峰期扩容。存储成本主要是特征存储和日志存储。特征存储用 Redis 成本较高可以把冷特征访问频率低的下沉到磁盘型存储如 RocksDB热特征留 Redis。日志存储用 ClickHouse开启压缩后存储成本能降 60% 以上。人力成本最容易被忽略。一套决策系统上线后需要有人维护特征管道、有人管理模型版本、有人配置决策规则。如果架构设计得不好这三拨人天天互相扯皮。Jev 的分层架构本质上也是在降低协作成本每层有明确的接口和职责变更影响范围可控。6. 这套架构的边界与后续演进方向Jev 这套架构不是万能的。它的优势场景是“多模型多规则强审计”的决策类业务劣势场景是“端到端深度学习”的场景。比如图像识别、语音合成这类任务模型本身就是端到端的硬拆成三层反而增加复杂度。后续演进有几个方向值得关注。第一决策流的自动化优化。目前决策流配置靠人工经验未来可以用强化学习自动搜索最优规则组合。第二特征和模型的联合优化。目前特征工程和模型训练是分离的联合优化可能带来额外收益。第三决策系统的可解释性增强。除了记录决策日志还可以用 SHAP 值等方法解释每个特征对最终决策的贡献度这在强监管场景价值很大。我在实际项目里最大的体会是架构的价值不在于技术多先进而在于让正确的事情容易做让错误的事情难做。Jev 的分层设计强制要求特征版本化、模型灰度、决策可追溯这些约束在初期会觉得麻烦但系统跑上半年后你会发现这些“麻烦”省掉了无数救火时间。最后分享一个小技巧决策系统的监控面板不要只给研发看把业务方关心的指标通过率、转人工率、平均决策耗时也放上去让业务方对系统状态有感知很多需求变更会因此变得更理性。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进