1. 从概念到生产Jev 决策系统的架构全景与设计哲学1.1 为什么“概念验证”和“生产可用”之间隔着一道鸿沟做过 AI 项目的人都有一个共同体会在 Jupyter Notebook 里跑通一个模型和把它变成每天扛住几十万次调用的线上服务完全是两码事。Jev 这个项目标题里最值得琢磨的其实是“从概念到生产”这六个字——它点出了一个核心矛盾实验室里的 AI 决策逻辑是静态的、离线的、单轮的而生产环境里的决策是动态的、在线的、多轮且有状态的。我见过太多团队在概念阶段用一套简单的规则引擎加一个分类模型就做出了不错的 demo但一上线就崩延迟从 50ms 飙到 2s决策结果前后矛盾模型更新后旧请求还在用旧权重日志里全是无法复现的 case。Jev 要解决的就是这类问题——它不是某一个单点模型而是一套面向决策的端到端系统架构把数据接入、特征计算、模型推理、决策编排、反馈闭环全部串起来并且保证这套链路在生产环境里稳定、可观测、可迭代。适合谁来参考这套内容如果你是算法工程师正在把离线模型往线上推如果你是后端架构师需要为 AI 决策服务设计高可用链路如果你是技术负责人在评估一套决策系统该自研还是采购——这篇内容都会给你可直接抄作业的架构思路和踩坑记录。1.2 Jev 决策系统的四层架构拆解Jev 的整体架构我习惯把它拆成四层从下往上分别是数据与特征层、模型与推理层、决策编排层、反馈与治理层。这个分层不是拍脑袋定的而是按照“变更频率”来切的越底层变更越慢越上层变更越快。数据与特征层负责原始数据的接入、清洗、特征工程和特征存储。这一层的核心设计原则是特征与模型解耦——特征算一次多个模型复用避免每个模型各自写一套 ETL。生产环境里我强烈建议用特征存储Feature Store来统一管理离线用 Spark 算好写入在线用 Redis 或本地缓存读取保证训练和推理的特征一致性。这个“一致性”听起来简单实际上是最容易出事故的地方离线用 pandas 算的均值在线用 Java 算的均值精度处理不一样结果就偏了。模型与推理层承载具体的 AI 模型可能是分类模型、排序模型、强化学习策略网络也可能是规则引擎和模型的混合体。Jev 在这一层的关键设计是推理服务与业务逻辑分离——模型只负责输出分数或动作概率具体怎么用这些分数做决策交给上层编排。这样做的好处是模型可以独立灰度、独立回滚不会因为换一个模型就把整个决策逻辑改乱。决策编排层是 Jev 最有特色的部分。它把多个模型输出、业务规则、上下文状态组合成一个最终的决策动作。你可以把它理解成一个“决策流水线”先过风控规则再过排序模型最后根据业务优先级做仲裁。这一层通常用 DAG有向无环图来描述决策流程每个节点是一个算子边表示数据流向。生产环境里我建议用配置化的方式管理这个 DAG而不是硬编码在代码里这样运营人员也能参与调整决策策略。反馈与治理层负责收集决策结果的实际效果做 A/B 实验、因果推断、模型监控和漂移检测。没有这一层你的系统就是一个“开环”系统模型退化了你都不知道。Jev 在这一层强调决策日志的完整记录每一次决策的输入特征、模型版本、编排路径、输出动作、后续反馈都要落库方便事后归因和模型迭代。1.3 架构选型背后的三个关键取舍第一个取舍是同步决策还是异步决策。Jev 的默认设计是同步决策因为大多数在线决策场景推荐、风控、定价都要求毫秒级返回。但同步意味着整条链路的延迟预算非常紧张任何一个环节慢了都会拖垮整体。我的经验是给决策链路设一个硬超时比如 200ms超时后走降级策略返回默认动作或缓存结果而不是让请求一直挂着。第二个取舍是集中式决策还是边缘决策。集中式决策把所有逻辑放在一个服务里维护简单但容易成为瓶颈边缘决策把部分逻辑下沉到客户端或网关延迟低但一致性难保证。Jev 采用的是混合模式核心决策逻辑集中管理但允许在边缘做轻量级的预过滤和缓存命中判断。第三个取舍是规则优先还是模型优先。纯规则系统可解释性强但泛化能力差纯模型系统泛化好但黑盒。Jev 的做法是规则兜底、模型主判模型给出主决策规则做安全边界和合规校验。比如模型说“给这个用户放贷”规则说“这个用户年龄不满 18 岁”那规则一票否决。2. 核心模块的细节实现与实操要点2.1 特征管道的搭建从原始数据到在线特征特征管道是 Jev 系统里最脏最累但最重要的部分。我把它拆成三个子环节离线特征计算、特征存储、在线特征读取。离线特征计算通常用 Spark 或 Flink 做批处理按天或按小时产出特征快照。这里有个坑时间窗口的对齐。比如你要算“用户过去 7 天的点击率”离线算的时候用的是自然日在线算的时候用的是滚动 7×24 小时两者对不齐模型效果就会打折。我的做法是统一用事件时间event time做窗口并且在特征存储里记录每个特征的“数据截止时间”在线读取时校验这个时间是否在可接受范围内。特征存储选型上小团队可以用 Redis MySQL 的组合Redis 存在线特征MySQL 存特征元数据和版本。大团队建议上专用的特征存储平台比如 Feast 或自研。不管用哪种核心要求是点查延迟低于 10ms批量读取支持 pipeline。在线特征读取的实操要点一定要做特征缺失的默认值处理。生产环境里特征缺失是常态不是异常。用户新注册没有历史行为设备指纹采集失败第三方数据源超时——这些都会导致特征缺失。我的经验是给每个特征定义一个合理的默认值比如点击率默认用全局均值并且在决策日志里标记哪些特征缺失了方便后续分析。# 在线特征读取的伪代码示例 def get_online_features(user_id, item_id, feature_names): # 先从本地缓存查 cache_key ffeat:{user_id}:{item_id} cached local_cache.get(cache_key) if cached and not is_expired(cached): return cached # 缓存未命中走远程特征存储 try: features feature_store.batch_get( entity_ids[user_id, item_id], feature_namesfeature_names, timeout_ms50 ) except TimeoutError: # 超时降级返回默认特征 features get_default_features(feature_names) metrics.incr(feature_timeout) # 回写本地缓存设置较短的 TTL local_cache.set(cache_key, features, ttl60) return features2.2 模型推理服务的性能优化实战模型推理是延迟的大头。我实测过一个没优化的 TensorFlow Serving单次推理 80msQPS 上到 500 就开始排队。优化之后降到 15msQPS 翻了三倍。具体做了这几件事第一模型量化。把 FP32 的权重转成 INT8模型体积缩小 4 倍推理速度提升 2-3 倍精度损失通常在 1% 以内。对于决策系统来说这个精度损失完全可以接受因为决策本身就有随机性和容错空间。第二请求批处理batching。单个请求推理浪费算力把短时间内到达的多个请求攒成一批一起推理GPU 利用率能从 20% 提到 70%。但批处理会引入等待延迟需要根据业务容忍度设置最大等待窗口。我的经验是设置 5-10ms 的等待窗口既能攒到足够的 batch又不会明显增加延迟。第三模型预热。服务刚启动时第一次推理会触发 JIT 编译和内存分配延迟可能是稳态的 10 倍。所以上线前一定要用真实流量或模拟流量做预热把常用路径的算子都编译好。第四多模型共享底层计算。Jev 场景下经常有多个模型吃同一份特征比如一个粗排模型和一个精排模型。可以把特征 embedding 的计算共享只让上层网络各自独立能省不少算力。优化手段延迟降幅精度影响实施难度模型量化 INT850-60%1%低请求批处理30-40%无中模型预热首次延迟降 90%无低共享底层计算20-30%无高算子融合10-20%无中2.3 决策编排引擎的设计与实现决策编排引擎是 Jev 的“大脑”。它的输入是特征和模型分数输出是一个具体的决策动作。我推荐用配置化的 DAG来描述决策流程而不是写死在代码里。一个典型的决策 DAG 长这样入口节点接收请求上下文然后并行走三条路——风控规则检查、模型 A 打分、模型 B 打分。三条路的结果汇聚到一个仲裁节点仲裁节点根据预设的优先级和阈值决定最终动作。如果风控规则返回“拒绝”直接短路不走模型如果模型分数低于阈值走降级动作。配置化的好处是决策逻辑的变更不需要发版。运营人员可以在管理后台调整阈值、增减规则、切换模型版本实时生效。但这也带来风险配置错误可能导致线上事故。所以我的做法是配置变更也要走审批和灰度先在小流量上验证没问题再全量。# 决策 DAG 的配置示例 decision_flow: name: loan_approval entry: context_parser nodes: - id: context_parser type: parser next: [risk_check, model_score] - id: risk_check type: rule_engine rules: [age 18, blacklist false] on_fail: reject next: [arbitrator] - id: model_score type: model_inference model: loan_model_v3 timeout_ms: 100 next: [arbitrator] - id: arbitrator type: arbitration strategy: rule_first next: [action_executor] - id: action_executor type: executor actions: [approve, reject, review]实操中有一个容易忽略的点决策路径的幂等性。同一个请求重试时应该得到相同的决策结果。这就要求决策过程中不能有随机性或者随机种子要固定不能依赖实时变化的外部状态比如当前库存数否则重试会导致决策不一致。2.4 反馈闭环与模型迭代机制没有反馈闭环的决策系统是“一次性”的。Jev 在设计上把反馈收集作为一等公民每一次决策动作执行后系统会记录后续的实际结果用户点击了没有、贷款违约了没有、订单成交了没有这些结果回流到训练数据里用于下一轮模型迭代。反馈收集的难点在于延迟反馈和归因。有些决策的效果是即时可见的比如点击有些是延迟的比如贷款违约要几个月后才暴露。对于延迟反馈我建议用代理指标做短期评估比如用“用户提交申请”作为“贷款审批通过”的代理虽然不完全准确但能快速迭代。归因方面要区分决策带来的效果和自然发生的效果。比如你给用户推荐了商品 A用户买了但这可能不是因为你推荐了 A而是用户本来就要买 A。解决这个问题需要做 A/B 实验或因果推断Jev 的治理层内置了实验分流和效果评估模块支持多变量实验和分层实验。3. 从零搭建 Jev 决策系统的完整实操流程3.1 环境准备与基础组件选型动手之前先把地基打好。我列一下我实际用过的组件清单和选型理由组件选型理由特征存储Redis MySQL小团队够用点查快成本低模型服务Triton Inference Server支持多框架、动态批处理、模型版本管理决策编排自研 DAG 引擎灵活可控能深度定制消息队列Kafka反馈数据回流的标准选择监控Prometheus Grafana生态成熟指标采集方便日志Elasticsearch决策日志检索和归因分析环境准备阶段最容易踩的坑是版本兼容性。Triton 对 CUDA 版本有要求Redis 集群模式对客户端有要求Kafka 的序列化格式要和上下游对齐。我的建议是先用 Docker Compose 在本地把整条链路跑通再上 K8s 做生产部署。# 本地快速启动核心组件 docker run -d --name redis -p 6379:6379 redis:7-alpine docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDxxx mysql:8 docker run -d --name triton -p 8000:8000 -p 8001:8001 -p 8002:8002 \ -v /path/to/models:/models nvcr.io/nvidia/tritonserver:23.10-py3 \ tritonserver --model-repository/models3.2 第一个决策流的端到端实现我拿一个简化的“内容推荐决策”场景来演示。需求是给定用户和内容决定是否推荐、推荐排序位置、以及是否附加提示文案。第一步定义特征。用户侧特征包括历史点击率、活跃度分、偏好类目内容侧特征包括内容质量分、时效性分、类目交叉特征包括用户对内容类目的历史点击率。第二步训练一个简单的排序模型。用 LightGBM 或一个小型 DNN 都行输出一个 0-1 的分数。训练数据用历史曝光点击日志正样本是点击负样本是未点击。第三步配置决策 DAG。入口解析请求并行获取用户特征和内容特征然后调用排序模型打分最后根据分数和业务规则决定动作。# 决策执行的核心逻辑 class DecisionEngine: def __init__(self, feature_store, model_client, rule_engine): self.feature_store feature_store self.model_client model_client self.rule_engine rule_engine def decide(self, request): # 1. 解析上下文 user_id request[user_id] item_id request[item_id] # 2. 获取特征 features self.feature_store.get_features(user_id, item_id) # 3. 规则检查短路逻辑 rule_result self.rule_engine.check(features) if rule_result REJECT: return {action: reject, reason: rule_block} # 4. 模型打分 score self.model_client.predict(features) # 5. 仲裁 if score 0.8: action recommend_top elif score 0.5: action recommend_normal else: action not_recommend # 6. 记录决策日志 self.log_decision(user_id, item_id, features, score, action) return {action: action, score: score}第四步接入反馈。用户看到推荐后是否点击点击后是否停留超过 3 秒这些信号通过 Kafka 回流到训练数据表。第五步监控和告警。关键指标包括决策延迟 P99、模型分数分布、各动作占比、特征缺失率。任何一个指标异常波动都要告警。3.3 灰度发布与回滚机制生产环境的变更必须可控。Jev 的灰度发布分三个层次模型灰度新模型先接 1% 流量观察核心指标点击率、转化率、延迟没有明显下降再逐步扩到 5%、10%、50%、100%。如果指标下降超过阈值自动回滚到旧模型。决策流灰度新的 DAG 配置先在特定用户群或特定时段生效验证无误后再全量。我习惯用用户 ID 的哈希值做分流保证同一用户始终看到同一版本的决策逻辑避免体验割裂。特征灰度新增特征或修改特征计算逻辑时先双写新旧特征对比两者对模型分数的影响确认无异常后再切换。回滚机制的关键是快速。我的经验是回滚操作必须在 1 分钟内完成所以模型文件和配置都要预加载回滚只是切换指针不需要重新加载。另外回滚后要自动触发一次全链路健康检查确认系统恢复正常。3.4 生产环境的性能压测与容量规划上线前必须做压测。我通常用 Locust 或 wrk 模拟真实流量重点观察三个指标QPS 上限、P99 延迟、错误率。容量规划有个简单的估算公式所需实例数 峰值 QPS × 单次决策平均耗时 / 目标利用率。比如峰值 QPS 是 5000单次决策平均耗时 20ms目标利用率 70%那所需实例数 5000 × 0.02 / 0.7 ≈ 143 个并发处理单元。再考虑冗余实际部署 1.5 倍约 215 个。压测时要注意预热和数据分布。冷启动的机器性能只有稳态的一半压测前要先跑 10 分钟预热流量。测试数据要尽量贴近真实分布不能只用几个热门商品反复压那样缓存命中率虚高测出来的性能偏乐观。4. 生产环境常见问题与排查技巧实录4.1 决策延迟突然飙升的排查思路延迟飙升是最常见也最要命的问题。我的排查顺序是先看监控大盘再查单条链路最后定位到具体算子。监控大盘上先看是全局延迟涨了还是某个机房、某个模型版本涨了。如果是全局涨大概率是流量突增或下游依赖抖动如果是局部涨大概率是那个局部的配置或模型有问题。然后查单条决策日志看每个节点的耗时。Jev 的决策日志里会记录每个算子的开始和结束时间直接能看出是特征读取慢、模型推理慢还是规则引擎慢。我遇到过几次典型情况一次是 Redis 集群某个分片挂了特征读取超时导致整体延迟从 30ms 涨到 500ms一次是模型文件被误删Triton 反复重试加载推理延迟暴涨还有一次是规则引擎里加了一条正则表达式写法有问题导致回溯爆炸CPU 打满。排查延迟问题的黄金法则先确认是“变慢”还是“变多”。变慢是单次耗时增加变多是请求量增加。两者的处理策略完全不同。4.2 模型分数分布异常的定位方法模型分数分布突然偏移通常意味着特征分布变了或模型版本错了。我习惯在监控里画模型分数的直方图正常情况应该是一个稳定的分布如果突然变成双峰或者整体平移就有问题。排查步骤先对比当前特征分布和训练时的特征分布看有没有特征的值域超出预期。比如某个特征训练时是 0-1 之间线上突然出现 100 的值那模型分数肯定异常。再检查模型版本确认线上加载的模型文件和预期一致。最后检查特征计算逻辑看最近有没有变更。有一次我们发现模型分数整体偏高排查后发现是某个特征在离线计算时用了fillna(0)在线计算时用了fillna(-1)导致在线特征偏小模型误判。这种问题只能靠离线在线特征一致性校验来发现我建议每天跑一次一致性比对任务抽样对比离线特征和在线特征的差异。4.3 决策结果不一致的归因与修复同一个请求多次调用返回不同决策这在生产环境里是严重问题。原因通常有三类随机性未固定、外部状态依赖、并发竞争。随机性未固定模型里用了 dropout 或随机采样推理时没有设置固定的随机种子。修复方法是推理时关闭 dropout固定随机种子。外部状态依赖决策逻辑里读了实时库存、实时价格等会变化的状态。修复方法是把这类状态作为请求参数传入或者在决策时加时间戳快照。并发竞争多个请求同时修改同一个状态导致决策依据不一致。修复方法是加锁或改用无状态设计。问题现象可能原因排查方法修复方案延迟 P99 飙升下游依赖抖动查单条链路耗时加超时降级模型分数偏移特征分布变化对比离线在线特征修正特征计算决策结果不一致随机性/状态依赖重放同一请求固定种子/无状态化特征缺失率高数据源故障查特征缺失日志加默认值兜底模型版本错乱发布流程问题查模型加载日志加版本校验4.4 几个我踩过的坑和对应的经验第一个坑特征存储的 TTL 设置太短。有次把用户特征的 TTL 设成 5 分钟结果用户行为更新后特征没及时刷新推荐结果滞后。后来改成事件驱动更新用户行为发生后主动失效缓存问题解决。第二个坑决策日志太大导致 ES 写入瓶颈。全量记录每个请求的完整特征一天几十亿条ES 扛不住。后来改成只记录决策关键字段和特征哈希需要详细特征时再根据请求 ID 去特征存储回查。第三个坑模型热更新时旧请求用了新模型。模型切换的瞬间正在处理的请求可能前半段用旧模型后半段用新模型导致决策逻辑混乱。修复方法是给每个请求打上模型版本标签整个决策链路用同一个版本。第四个坑规则引擎的优先级冲突。两条规则同时命中一条说通过一条说拒绝结果取决于规则加载顺序不可控。后来引入显式的优先级字段冲突时按优先级裁决并且记录冲突日志。4.5 监控告警体系的最小可用配置监控不用一开始就大而全先把最关键的几个指标盯住决策 QPS、P99 延迟、错误率、模型分数均值、特征缺失率、各动作占比。这六个指标能覆盖 80% 的线上问题。告警阈值设置有技巧不要用固定阈值用同比和环比。比如 P99 延迟比昨天同时段高 50% 就告警比设一个固定的 200ms 更灵敏。另外告警要分级P0 是影响决策可用性的延迟超时、错误率飙升P1 是影响决策质量的模型分数偏移、特征缺失P2 是提示性的某个动作占比变化。最后分享一个我常用的排查小技巧在决策日志里加一个trace_id从请求入口一直透传到所有下游服务。出问题时拿trace_id一搜整条链路的日志全出来了比逐个服务查快得多。这个习惯帮我省了无数排查时间。
企业数字化 ERP 产品动态
相关推荐
为AI Agent打造可视化技能管理器:统一沉淀工具、流程与提示词 1. 为什么我会去做一个"技能管理器",而不是继续堆 Agent先交代一下背景。我大概从去年年初开始接触 AI Agent,前后做了几个 Rag 问答机器人、自动写周报的工作流、还有给运营团队用的竞品信息收集器。做到第三四个项目的时候,一个特… · 2026/11/3 21:36:43
Fast-LIO融合GNSS的紧耦合设计与工程避坑指南 简介:本资源是一份面向机器人与自动驾驶领域研究人员及工程师的Fast-LIO算法深度解析与工程改进文档,聚焦多传感器融合建图与定位中的关键瓶颈——点云特征缺失导致的建图失败问题。作者在原始Fast-LIO(IMU激光雷达紧耦合)基础上&… · 2026/11/3 21:35:43
2025年五大AI科研平台实测对比与选型指南 1. 2025届AI科研平台实测背景与价值2025年,AI科研平台已经完成了从"辅助工具"到"研究基础设施"的转型。根据最新学术社区调研数据显示,超过87%的研究者会在项目启动阶段优先评估可用AI平台,而选择不当的工具链会导致平均… · 2026/11/3 21:35:43
学习通考试交卷状态查询与问题解决指南 1. 学习通考试交卷状态查询的必要性 在线考试系统已经成为现代教育的重要组成部分,而学习通作为国内广泛使用的教学平台,其考试功能被众多高校和教师采用。对于考生而言,确认自己是否成功交卷是考试结束后最关心的问题之一。我见过太多学生在… · 2026/11/3 22:19:09
企业级CS架构管理系统开发实践与优化 1. 企业级管理系统架构选型分析 在企业级管理系统开发中,架构选型是首要决策点。CS架构(Client-Server)作为经典的企业应用架构模式,与BS架构相比具有独特的适用场景和技术特点。根据实际项目经验,当系统需要处理复杂业… · 2026/11/3 22:19:09
边缘计算与AI机器人在京智博览会的创新应用 1. 展会背景与行业趋势解析2026北京国际人工智能应用与机器人创新博览会(以下简称"京智博览会")作为亚太地区最具影响力的AI与机器人领域专业展会,已成功举办七届。本届展会以"京聚全球智,算力观新程"为主题&… · 2026/11/3 22:19:09
ESP32声音检测与MQTT多端提醒系统:硬件选型到代码实现 “buzz”这个名字,你一听大概就能联想到那种持续的嗡嗡声、蜜蜂振翅的声音,或者是手机揣在兜里突然震动时的那种酥麻感。我手头这个代号为“buzz”的小项目,做的就是和声音、提醒有关的事:它是一套基于ESP32的声音检测与多端提醒系… · 2026/11/3 22:19:09
相册分类导航栏设计与实现:提升用户体验的关键技术 1. 项目概述:相册分类导航栏的实现价值相册分类导航栏是现代数字相册系统中不可或缺的交互组件。当用户积累的照片数量超过500张时,传统的线性浏览方式效率会急剧下降。根据用户体验研究数据,合理的分类导航可以将照片查找时间缩短67%&#x… · 2026/11/3 22:18:09
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46