ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Jev决策系统架构解析:从概念到生产部署的完整链路

Jev决策系统架构解析:从概念到生产部署的完整链路 AI 决策系统这两年从论文里的概念一路卷到生产环境我前后参与过三个从零到一的落地项目踩过的坑比读过的论文还多。Jev 这套架构之所以值得单独拿出来聊是因为它把决策这件事从传统的规则引擎和单点模型预测里彻底拆了出来重新定义了一套可编排、可观测、可回滚的工程体系。如果你正在做智能风控、动态定价、推荐策略或者自动化运营这类需要系统自己做判断的业务那这套东西你大概率用得上。接下来我会把 Jev 从概念模型到生产部署的完整链路拆开讲包括架构分层、核心模块设计、接入方式、密钥管理、在 Codex 类工具里的协同用法以及那些只有真正上线跑过才会知道的坑。1. 先搞清楚 Jev 到底在解决什么问题1.1 传统决策系统的三个死结大部分团队做决策系统起步都是if-else 堆规则 一个模型打分。这套东西在业务早期跑得挺欢但一旦策略数量超过几十条、特征维度上百、上线频率从月变成天问题就集中爆发了。第一个死结是规则与模型割裂。规则写在配置中心模型部署在推理服务两边各自有一套版本管理出了线上事故你根本说不清是规则改错了还是模型漂移了。我见过最离谱的一次风控拦截率突然飙升排查了六个小时才发现是运营在配置平台改了一个阈值而模型侧完全不知情。第二个死结是决策过程不可观测。传统系统只告诉你结果是拒绝但不告诉你为什么拒绝。是命中哪条规则哪个特征贡献最大如果换成另一套策略会怎样这些信息在事后复盘时几乎拿不到导致策略迭代全靠拍脑袋。第三个死结是回滚成本极高。模型更新往往涉及特征工程、训练、部署一整条链路一旦新版本效果不及预期回滚要重新走一遍流程黄金救援时间早就过了。Jev 的设计思路本质上是把决策抽象成一个可编排的图结构规则、模型、外部服务调用都是图上的节点每个节点的输入输出、版本、执行耗时全部被记录。这样上面三个死结就都有了对应的解法。1.2 Jev 的核心抽象决策图与执行上下文Jev 里最核心的两个概念一个是决策图Decision Graph一个是执行上下文Execution Context。决策图你可以理解成一张有向无环图节点分几类特征节点负责从数据源拉取特征规则节点做条件判断模型节点调用推理服务动作节点执行最终的业务操作比如发券、拦截、调价。边代表数据流向一个节点的输出可以作为下游多个节点的输入。执行上下文则是每次决策请求的随身行李。它携带了请求入参、中间计算结果、每个节点的执行状态和耗时、最终决策输出以及一条完整的 trace ID。这条 trace ID 是后面做可观测性和问题排查的关键所有节点的日志都挂在它下面。我个人的经验是不要一上来就把所有策略都塞进一张大图。Jev 支持子图嵌套把风控、定价、推荐拆成独立的子图通过主图编排调用维护起来清晰得多。我们第一个项目就是所有逻辑堆一张图后来节点超过两百个改一个地方要重新理解半张图痛苦得不行。1.3 和规则引擎、工作流引擎的本质区别很多人第一次接触 Jev 会问这不就是个规则引擎吗或者这不就是个工作流引擎吗区别在于决策语义。规则引擎比如 Drools 那类的核心是条件-动作匹配它不关心模型也不关心决策的置信度和可解释性。工作流引擎比如各类 BPM 工具的核心是流程编排它关心的是任务流转和人工审批而不是实时决策。Jev 站在两者中间偏决策侧它既要像规则引擎一样低延迟执行又要像工作流一样可编排还要原生支持模型推理和决策解释。这个定位决定了它的架构必须同时具备低延迟执行引擎和策略编排能力这也是它比单纯规则引擎复杂得多的原因。2. 技术架构的分层拆解2.1 接入层请求怎么进来、怎么被路由接入层是 Jev 对外的门面主要职责是协议适配、鉴权、限流和路由。生产环境里决策请求的来源非常杂有来自业务后端的同步调用有来自消息队列的异步触发还有来自定时任务的批量决策。同步调用走 gRPC 或 HTTP我建议优先用 gRPC因为决策请求往往携带大量特征数据gRPC 的二进制序列化在吞吐上优势明显。异步触发走消息队列这里要注意消息的幂等性因为决策动作可能有副作用比如发券重复消费会导致重复发券。鉴权这块 Jev 用的是密钥机制每个接入方分配一对密钥请求时带上签名。密钥的管理后面单独讲这里先记住一个原则密钥绝对不能硬编码在业务代码里必须走配置中心或密钥管理服务。路由层负责根据请求里的决策场景标识把请求分发到对应的决策图。这里有个容易忽略的点决策图的版本要和路由规则绑定。我们曾经遇到过灰度发布时路由没更新导致一部分流量还在走老版本图排查了半天。2.2 编排层决策图的解析与调度编排层是 Jev 的大脑负责把决策图解析成可执行的计划然后调度执行。这里涉及几个关键设计。图的编译决策图在发布时会先编译成中间表示把节点依赖关系、并行可能性、超时配置都算好。编译期能发现的问题比如环依赖、节点缺失绝不拖到运行期。这一步很像数据库的查询计划生成目的是让运行期只做执行不做分析。并行调度图上没有依赖关系的节点应该并行执行。比如三个特征节点互不依赖就应该同时拉取而不是串行等待。Jev 的调度器会做拓扑排序把可以并行的节点分组用线程池或协程并发执行。实测下来一个包含 15 个节点的决策图串行执行平均 80ms并行优化后能压到 25ms 左右。超时与降级每个节点都可以配置超时时间超时后走降级分支。降级策略要提前设计好比如特征拉取超时就使用缓存值或默认值模型推理超时就回退到规则决策。没有降级设计的决策系统在生产环境就是一颗定时炸弹。2.3 执行层节点运行时与状态管理执行层负责真正跑每个节点。节点运行时需要处理几件事输入数据的准备、节点逻辑的执行、输出数据的序列化、执行状态的记录。状态管理是执行层最容易被低估的部分。每次决策请求的执行上下文需要被持久化一方面是为了故障恢复另一方面是为了事后审计。我们用的是执行快照机制每个节点执行完成后把上下文的关键状态写一次快照。这样如果某个节点失败可以从最近的快照恢复而不是从头重跑。这里有个性能权衡快照写得太频繁会影响延迟写得太少又影响恢复能力。我们的经验是只在关键节点模型节点、动作节点后写快照特征节点和规则节点不写因为它们的执行成本低重跑代价小。2.4 数据层特征存储与决策日志数据层分两块特征存储和决策日志。特征存储要解决的是决策时快速拿到特征的问题。Jev 本身不生产特征它从外部特征平台拉取。但为了降低延迟Jev 会做一层本地缓存热点特征缓存在内存里TTL 根据特征更新频率设置。这里要注意缓存一致性特征更新后要能及时失效否则决策会基于过期数据。决策日志记录每次决策的完整信息请求入参、执行路径、每个节点的输入输出、最终决策、耗时。这些日志是策略迭代的燃料。我们团队每周会做一次决策日志分析看哪些规则命中率高但效果差哪些特征贡献度低可以下线。没有决策日志分析的团队策略迭代基本靠猜。日志存储建议用列式存储比如 Parquet 格式落对象存储因为决策日志字段多、写入量大、分析时通常只查部分列列式存储的压缩率和查询效率都更好。3. 从概念到生产的关键落地步骤3.1 环境准备与依赖梳理落地 Jev 之前先把依赖梳理清楚。Jev 不是孤立运行的它依赖几个外部系统特征平台、模型推理服务、配置中心、消息队列、日志存储。我建议列一张依赖清单标注每个依赖的可用性等级和降级方案。比如特征平台是强依赖挂了决策就没法做那必须有本地缓存兜底模型推理服务是弱依赖挂了可以回退到规则那降级方案就是规则决策。环境上开发、测试、预发、生产四套环境要隔离。Jev 的决策图配置在不同环境要独立管理千万别图省事共用一套配置否则测试环境的改动会直接影响生产。3.2 决策图的建模与版本管理建模是落地中最花时间的环节。我的建议是从最小可用决策图开始先跑通一条最简单的链路一个特征节点 一个规则节点 一个动作节点。跑通之后再逐步加节点。版本管理上决策图要像代码一样管理每次修改生成新版本版本号语义化发布走审批流程。Jev 支持图的版本回滚但回滚的前提是版本管理规范。我们用的是图配置即代码的方式决策图定义存在 Git 仓库里通过 CI/CD 流水线发布这样每次变更都有记录、可追溯、可回滚。3.3 灰度发布与流量切分决策系统直接改业务结果绝不能全量一次性发布。灰度发布是必须的。灰度的维度可以按用户 ID 哈希、按地域、按业务线。Jev 支持在路由层配置流量切分规则比如 5% 流量走新版本图95% 走老版本。灰度期间要重点监控几个指标决策结果分布是否异常、延迟是否上升、错误率是否升高。我们踩过的一个坑是灰度只看了整体指标没看分群指标。结果新版本在整体上表现正常但在某个小众用户群体上决策结果完全跑偏等发现时已经影响了这批用户。灰度监控一定要分群看不能只看大盘。3.4 密钥管理与接入安全Jev 的接入需要密钥密钥管理是安全底线。几个原则密钥不落代码库走密钥管理服务或配置中心加密存储密钥定期轮换轮换时支持新旧密钥并存一段时间避免轮换期间请求失败每个接入方独立密钥不要共用方便审计和吊销密钥传输必须加密签名算法用成熟的方案不要自己造密钥泄露的后果很严重别人可以伪造决策请求直接操纵业务结果。所以密钥的权限要最小化一个密钥只能访问它被授权的决策场景。4. 在 Codex 类工具中协同使用 Jev 的实践4.1 为什么要在编码工具里接入 Jev现在很多团队用 Codex 这类 AI 编码工具辅助开发Jev 可以在里面扮演决策能力提供方的角色。具体场景是开发者在写业务代码时需要调用决策能力可以直接在编码工具里查询 Jev 的决策图定义、节点配置、接入示例甚至让工具生成调用代码。这样做的好处是降低接入门槛。以前接入 Jev 要读一堆文档现在开发者可以在熟悉的编码环境里直接拿到接入代码和配置说明效率提升明显。4.2 接入方式与配置要点在 Codex 类工具里接入 Jev核心是配置好 Jev 的服务地址和密钥。配置要点服务地址区分环境开发环境指向开发集群别指向生产密钥用只读权限的编码工具只需要查询决策图定义不需要执行决策配置好超时和重试编码工具查询失败不应该阻塞开发流程我实测下来把 Jev 的决策图定义以结构化格式暴露给编码工具工具生成的调用代码准确率能到 80% 以上剩下的 20% 主要是业务特定的参数需要人工调整。4.3 常见协同问题与处理最常见的问题是版本不一致编码工具里查到的决策图版本和实际生产版本不一致导致生成的代码调用了不存在的节点。解决办法是在查询接口里带上版本号工具生成代码时明确标注依赖的版本。另一个问题是密钥权限过大。有些团队图省事给编码工具配了执行权限的密钥这是安全隐患。编码工具只需要读权限执行决策应该由业务代码在运行时完成。5. 生产环境的问题排查与稳定性保障5.1 决策延迟突然升高的排查链路决策延迟升高是最常见的线上问题。排查链路我总结成一条先看是全局还是局部再看是哪个节点慢最后看是依赖问题还是自身问题。第一步看监控大盘确认是所有决策场景都慢还是某个场景慢。如果全局慢大概率是基础设施问题网络、数据库如果局部慢大概率是某个决策图或某个依赖的问题。第二步看决策日志里的节点耗时分布定位到具体慢的节点。Jev 的执行上下文里记录了每个节点的耗时直接查就能定位。第三步如果是特征节点慢查特征平台的响应时间如果是模型节点慢查推理服务的负载如果是规则节点慢查规则复杂度有没有嵌套过深的规则。我们遇到过一次延迟飙升最后定位到是一个规则节点里写了正则匹配正则表达式有回溯问题特定输入下耗时爆炸。规则节点里慎用复杂正则和循环这是血泪教训。5.2 决策结果异常的根因定位决策结果异常比延迟问题更难排查因为异常的定义本身就不清晰。我的做法是先定义基线正常情况下各决策结果的分布比例是多少偏离基线多少算异常。定位根因时用决策日志做对比分析拿异常时段的决策和正常时段的决策对比看执行路径有什么不同。常见根因有几类特征值异常上游数据问题、规则配置被误改、模型版本更新、依赖服务返回异常。这里要强调变更关联决策结果异常往往和某次变更相关。把决策异常的时间点和最近的配置变更、模型发布、上游数据变更对齐能快速缩小排查范围。我们团队的做法是维护一份变更日历所有变更都记录时间点排查时直接对照。5.3 降级与熔断的实战配置降级和熔断是稳定性的最后一道防线。配置要点每个外部依赖都要配熔断连续失败达到阈值就熔断避免雪崩熔断后走降级分支降级分支要提前测试别等真出事才发现降级逻辑有 bug降级要有明确的恢复条件熔断器半开状态要能自动探测依赖恢复我们配置的熔断阈值是10 秒内失败率超过 50% 且请求数超过 20 次触发熔断熔断 30 秒后进入半开状态探测。这个参数是根据实际流量调出来的流量小的场景要调低请求数阈值否则永远触发不了熔断。6. 几个只有上线后才会懂的坑6.1 特征缓存的一致性陷阱前面提过特征缓存这里展开说坑。缓存一致性最麻烦的场景是特征更新了但缓存还没失效决策基于旧特征做了判断。如果这个特征是关键特征比如用户风险等级后果可能很严重。我们的解法是关键特征不走缓存或者缓存 TTL 设得极短。非关键特征可以缓存久一点。另外特征平台更新特征时要主动通知 Jev 失效缓存而不是被动等 TTL 过期。6.2 决策图的隐式依赖决策图上的依赖是显式的边但实际执行中会有隐式依赖。比如两个节点都读同一个特征如果这个特征被更新了两个节点的行为都会变但图上看不出来。隐式依赖是排查问题的噩梦。我们的做法是在节点配置里显式声明它依赖的特征这样图编译时能检测出特征级别的依赖冲突也能在特征更新时知道影响哪些节点。6.3 批量决策的资源竞争批量决策比如定时任务一次性处理百万用户和实时决策共享资源容易造成资源竞争。批量决策跑起来实时决策的延迟就飙升。解法是资源隔离批量决策走独立的执行队列和线程池和实时决策物理隔离。如果资源有限至少要做优先级调度实时决策优先。6.4 决策日志的存储成本失控决策日志写入量大存储成本容易失控。我们第一个月没注意日志存储费用超预算三倍。控制成本的办法日志分级存储近期日志存热存储方便查询历史日志转冷存储日志字段做裁剪不是所有字段都需要长期保留设置日志保留期过期自动清理。决策日志要留但不是所有日志都值得留那么久。7. 关于 Jev 后续演进的一些个人判断Jev 这套架构目前解决的是决策可编排、可观测、可回滚的问题但我个人觉得还有几个方向值得关注。一是决策的自动化调优。现在策略参数还是人工调的未来如果能基于决策日志做自动调参迭代效率会再上一个台阶。二是决策的可解释性增强。现在能记录执行路径但为什么这个特征导致了这个决策的解释还不够直观尤其是在模型节点上。三是跨决策图的全局优化。多个决策图之间可能存在策略冲突比如风控图拒绝了某个用户但营销图又想给这个用户发券这种冲突目前靠人工协调未来应该有机制自动处理。我在实际项目里的体会是Jev 这类系统的价值不在于单次决策有多准而在于让决策这件事变得可管理。策略能快速迭代、问题能快速定位、变更能安全回滚这三点做到了决策系统的长期价值就出来了。至于单次决策的准确率那是模型和特征的事Jev 负责的是让它们高效、安全地协同工作。最后分享一个实操小技巧上线前一定要做一次全链路压测而且要用真实流量回放。我们第一次上线时用模拟流量压测一切正常结果真实流量一上来就出问题因为真实流量的特征分布和模拟流量差异很大某些在模拟流量里走不到的决策分支在真实流量里被大量触发。用真实流量回放压测能提前暴露这类问题。
返回列表