Jev模型与TypeSafe AI:用类型安全实现AI结构化决策
1. 从“拍脑袋”到“可验证”Jev模型到底在解决什么问题第一次听到“Jev模型”这个词是在一个做AI应用落地的朋友群里。有人甩了张截图说他们团队用TypeSafe AI的结构化决策模型把线上事故率压下去了一大截底下立刻有人追问“jev模型官网在哪”“jev模型开源吗”。我当时的第一反应是又是一个新造的概念吧但仔细扒了一圈资料、又自己动手搭了个小demo之后我发现这东西确实踩中了当前AI落地最疼的一个点——决策过程不可控、不可复现、不可审计。先说结论方便你判断要不要往下读。Jev模型本质上是一套面向AI系统的结构化决策建模方法它把原本藏在模型黑箱里的“判断—选择—执行”链条拆解成显式的、带类型约束的、可被程序校验的结构化节点。而TypeSafe AI则是承载这套方法的一类工程实践范式核心诉求就一个词类型安全Type Safe。你可以把它理解成给AI的决策过程装了一套“编译期检查”让很多错误在真正执行之前就被拦下来。它解决的问题非常具体。现在大量AI应用是这样的用户输入一段话模型返回一段话中间发生了什么全靠猜。一旦线上出问题你很难回答“它为什么选了这个方案而不是那个”“同样的输入为什么这次结果不一样”“这个决策有没有越过业务红线”。Jev模型的思路是把决策拆成一个个有明确输入输出类型的节点节点之间的连接必须满足类型匹配整个决策图在运行前就能做静态校验。这跟传统编程里“强类型语言能在编译期发现大量bug”是一个道理只不过对象从变量换成了AI的决策步骤。适合谁来参考三类人最该看。第一类是AI应用开发者尤其是做Agent、工作流编排、多步骤推理系统的你会直接用到这套思路。第二类是技术负责人和架构师你需要判断这套东西值不值得引入团队、怎么落地。第三类是对AI可靠性有要求的产品和运营你不需要写代码但需要理解为什么“结构化决策”比“让模型自由发挥”更靠谱。下面我会从设计思路、核心机制、实操搭建、踩坑排查几个层面把Jev模型和TypeSafe AI讲透尽量让你看完就能上手试。2. 拆开看骨架Jev模型的核心设计思路2.1 为什么是“结构化”而不是“更聪明的提示词”很多人第一反应是决策不准那我优化提示词不就行了我一开始也这么想。但实测下来提示词优化解决的是“单次输出质量”解决不了“决策链条的稳定性”。举个真实场景一个客服AI要判断用户诉求属于退款、换货还是咨询然后走不同流程。你用提示词让它“先判断意图再执行”它可能这次判断对了下次因为上下文里多了句话就判断偏了。更麻烦的是你没法在它执行前知道它会走哪条路。Jev模型的做法是把“判断意图”这件事本身变成一个显式的决策节点这个节点的输出被约束成一个枚举类型比如Intent REFUND | EXCHANGE | CONSULT。下游的流程节点只接受特定类型的输入类型不匹配直接报错。这样一来决策路径从“模型自由发挥”变成了“在预定义的图里走”稳定性来自结构约束而不是来自提示词写得多好。这就是“结构化决策模型”里“结构化”三个字的真正含义——不是把文字排版整齐而是把决策空间用类型系统框住。2.2 TypeSafe AI把“类型安全”从编程语言搬到AI决策TypeSafe AI这个概念我理解它是把强类型编程语言的那套哲学迁移到AI系统里。在TypeScript、Rust这类语言里类型系统能在你运行代码之前就告诉你“这里传参错了”“这个分支不可能走到”。TypeSafe AI想做的是让AI的决策流程也具备这种“运行前可校验”的能力。具体怎么实现核心是给每个决策节点定义输入类型和输出类型。比如一个“风险评估”节点输入类型是OrderInfo输出类型是RiskLevel枚举LOW/MEDIUM/HIGH。当你在编排流程时把一个输出RiskLevel的节点连到一个期望UserProfile的节点上系统在构建阶段就会报类型错误。这听起来很基础但威力在于它把大量“运行时才发现的逻辑错误”提前到了“设计时就发现”。我踩过的一个坑是早期做Agent编排时两个节点之间传的是自由文本结果下游节点经常解析失败排查半天发现是上游输出格式飘了。有了类型约束这种问题根本不会发生。2.3 决策图 vs 决策树为什么不是简单的if-else有人会问这不就是决策树吗还真不是。决策树是单向、无环、每个节点只走一次的结构而Jev模型描述的是决策图Decision Graph允许节点有多个入边、允许循环、允许并行分支再汇合。这个区别在实际业务里很关键。举个例子一个订单处理流程先做风控判断风控通过后可能同时触发“库存检查”和“优惠计算”两个并行节点两者都完成后汇合到“生成订单”节点。如果是决策树你得把这两个并行逻辑硬塞成串行效率低还容易出错。决策图天然支持这种并行和汇合。更重要的是决策图上的每个节点都是可独立测试的——你可以单独给“风控判断”节点喂各种输入验证它的输出类型和取值是否符合预期而不需要跑完整个流程。这种可测试性是决策树给不了的。2.4 方案选型背后的取舍为什么不用纯代码写死既然要结构化为什么不干脆用传统代码把决策逻辑写死这是我在团队里被问最多的问题。答案在于AI决策的模糊性和代码的确定性之间的张力。纯代码写死的逻辑遇到“用户这句话到底算不算投诉”这种模糊判断就歇菜了你得写一大堆规则还覆盖不全。而纯靠模型自由发挥又失去了可控性。Jev模型的取舍是在需要模糊判断的地方用模型在需要确定性的地方用类型约束和结构化编排。也就是说模型负责“在给定类型约束下做判断”编排层负责“保证判断结果被正确传递和使用”。这个分工让两边各干各擅长的事。我实测下来这种混合模式比纯代码或纯模型都稳尤其是在业务规则复杂、又需要一定灵活性的场景里。3. 核心机制拆解节点、类型、校验到底怎么运作3.1 决策节点的三要素输入、输出、执行体一个标准的Jev模型决策节点我总结下来包含三个必备要素。输入类型定义了节点能接受什么数据输出类型定义了节点会产出什么数据执行体则是真正干活的部分——它可以是一段代码、一次模型调用、或者一个外部API请求。三者的关系是执行体在运行时接收符合输入类型的实例经过处理后必须产出符合输出类型的实例否则整个流程判定为失败。这里有个设计细节值得说输出类型的约束不只是“结构匹配”还包括“取值域约束”。比如输出类型是RiskLevel那执行体返回UNKNOWN这种不在枚举里的值就会被判定为类型违规。这个约束在实操中极其有用因为模型经常会“自作主张”返回一些你没定义过的值。有了取值域约束这类问题会在节点边界被立刻捕获而不是流到下游引发更诡异的错误。3.2 类型系统怎么定义从基础类型到复合类型Jev模型的类型系统我建议从三层来设计。第一层是基础类型比如字符串、数字、布尔值、枚举。第二层是复合类型比如结构体包含多个字段的对象、列表、可选值。第三层是业务类型也就是把基础类型和复合类型组合成有业务含义的类型比如OrderInfo、UserProfile、RiskAssessment。实操中我的经验是业务类型要尽量窄不要用万能的大对象。早期我图省事定义了一个Context类型包含所有可能用到的字段结果每个节点都能访问所有数据类型约束形同虚设。后来改成每个节点只声明自己真正需要的字段类型检查才真正发挥作用。这个原则跟编程里“接口隔离”是一个道理——依赖越少耦合越低出错越容易定位。3.3 静态校验在流程跑起来之前就发现问题静态校验是TypeSafe AI最核心的价值点。它的工作方式是在你构建决策图的时候系统遍历所有节点和连接检查每条边两端的类型是否匹配、每个节点的输出是否满足下游的输入要求、是否存在无法到达的节点或无法满足的输出。任何一项不通过流程构建就失败根本不会进入运行阶段。我做过一个对比测试同样一个包含8个节点的订单处理流程用自由文本传递的方式平均要跑3到5次才能发现所有类型不匹配的问题用Jev模型的静态校验构建阶段一次性报出全部4处类型错误改完直接跑通。这个效率差距在复杂流程里会被放大——节点越多自由文本方式的问题越难定位而静态校验是“一次性全量检查”。3.4 运行时校验静态查不出来的问题怎么兜底静态校验能查出类型不匹配但查不出“运行时数据本身有问题”。比如一个节点期望输入是“非空字符串”静态上类型是对的但运行时传进来一个空字符串。所以Jev模型还需要运行时校验作为兜底。运行时校验主要做两件事一是检查输入实例是否满足类型的取值约束非空、范围、格式等二是检查执行体的输出是否真的符合声明的输出类型。这里有个坑我踩过早期我只做静态校验觉得够了。结果线上出现模型返回了格式正确但语义错误的数据比如把RiskLevel返回成LOW但实际应该是HIGH。静态校验管不了这个因为类型是对的。后来我加了一层“业务规则校验”在关键节点上附加额外的断言比如“如果订单金额超过阈值风险等级不能是LOW”。这层校验不属于类型系统但和类型系统配合形成了完整的防护网。4. 动手搭一个从零实现一个最小Jev模型流程4.1 环境准备与依赖选择要动手试先得把环境搭起来。我推荐的技术栈是Python Pydantic原因是Pydantic天然支持类型定义和运行时校验跟Jev模型的理念高度契合。如果你用TypeScriptZod是类似的选择。下面以Python为例。pip install pydantic如果你想要更完整的决策图编排能力可以再引入一个图编排库但最小demo其实不需要用Pydantic加一点手写编排就够了。我的建议是先用最小依赖跑通核心概念再考虑引入框架。很多人一上来就找“jev模型官网”想下载现成框架其实核心思想用几十行代码就能验证没必要等现成的。4.2 定义你的第一个决策类型先定义业务类型。假设我们做一个简单的订单风控决策需要三个类型订单信息、风险等级、决策结果。from pydantic import BaseModel, Field from enum import Enum from typing import Optional class RiskLevel(str, Enum): LOW LOW MEDIUM MEDIUM HIGH HIGH class OrderInfo(BaseModel): order_id: str Field(min_length1) amount: float Field(gt0) user_age_days: int Field(ge0) class Decision(BaseModel): action: str risk: RiskLevel reason: Optional[str] None注意几个细节amount用了gt0约束必须大于0user_age_days用了ge0约束非负order_id用了min_length1约束非空。这些约束就是运行时校验的依据。定义类型时把约束写全后面能省很多排查时间。4.3 编写决策节点并接入类型校验接下来写决策节点。每个节点是一个函数输入输出都有类型标注。def assess_risk(order: OrderInfo) - RiskLevel: if order.amount 10000 and order.user_age_days 7: return RiskLevel.HIGH if order.amount 5000: return RiskLevel.MEDIUM return RiskLevel.LOW def make_decision(order: OrderInfo, risk: RiskLevel) - Decision: if risk RiskLevel.HIGH: return Decision(actionREJECT, riskrisk, reason高风险订单) if risk RiskLevel.MEDIUM: return Decision(actionREVIEW, riskrisk, reason需人工复核) return Decision(actionAPPROVE, riskrisk)这两个函数就是两个决策节点。assess_risk的输入类型是OrderInfo输出类型是RiskLevelmake_decision的输入是OrderInfo和RiskLevel输出是Decision。类型标注在这里不是装饰而是校验的依据。4.4 编排流程并跑通静态校验现在把节点连起来并做静态校验。静态校验的核心是检查节点连接处的类型是否匹配。def build_flow(): flow { nodes: { assess_risk: {input: OrderInfo, output: RiskLevel}, make_decision: {input: (OrderInfo, RiskLevel), output: Decision}, }, edges: [ (assess_risk, make_decision, RiskLevel), ], } # 静态校验检查每条边的类型是否匹配 for src, dst, edge_type in flow[edges]: src_output flow[nodes][src][output] dst_input flow[nodes][dst][input] dst_inputs dst_input if isinstance(dst_input, tuple) else (dst_input,) if edge_type not in dst_inputs: raise TypeError(f类型不匹配: {src} 输出 {edge_type} 无法接入 {dst}) return flow flow build_flow() print(静态校验通过)这段代码跑起来会打印“静态校验通过”。如果你把edges里的RiskLevel改成OrderInfo立刻会报类型不匹配。这就是静态校验的价值——在流程跑之前就发现问题。4.5 运行流程并观察运行时校验最后跑一遍完整流程观察运行时校验。def run_flow(order: OrderInfo): risk assess_risk(order) decision make_decision(order, risk) return decision order OrderInfo(order_idA001, amount12000, user_age_days3) result run_flow(order) print(result)输出应该是actionREJECT riskRiskLevel.HIGH: HIGH reason高风险订单。如果你把amount改成-100Pydantic会在构造OrderInfo时就报错因为违反了gt0约束。这就是运行时校验在起作用。5. 实操中绕不开的坑常见问题与排查技巧5.1 类型定义太宽导致校验失效这是最常见的坑。我见过有人把所有字段塞进一个Context类型结果每个节点都能访问所有数据类型校验完全没意义。排查方法检查每个节点的输入类型如果发现某个类型被超过一半的节点使用大概率定义太宽了。解决思路按节点实际需要拆分类型每个节点只声明自己真正用到的字段。5.2 模型输出不稳定导致运行时校验频繁失败模型节点经常返回不在枚举里的值或者格式对但语义错。排查方法在模型节点的输出处加日志记录原始输出和校验结果。解决思路两层防护——第一层在提示词里明确输出格式和取值域第二层在节点边界做严格校验校验失败时触发重试或降级逻辑。我实测下来加了重试机制后模型节点的校验通过率能从70%提到95%以上。5.3 循环和并行导致死锁或状态不一致决策图支持循环和并行但也带来了新问题。循环没设退出条件会死循环并行分支汇合时状态可能不一致。排查方法给循环加最大迭代次数给并行分支加超时。解决思路循环节点必须显式声明退出条件并行汇合节点必须定义冲突解决策略比如取最新、取最严、人工介入。5.4 静态校验通过但运行时仍出错静态校验管类型管不了业务规则。排查方法在关键节点加业务断言记录断言失败时的上下文。解决思路把业务规则校验作为独立层和类型校验分开。类型校验保证“数据形状对”业务校验保证“数据内容对”。问题现象可能原因排查动作解决方向校验频繁失败模型输出不稳定记录原始输出加重试和降级类型约束无效类型定义太宽检查节点输入类型拆分窄类型流程卡死循环无退出条件检查循环节点加最大迭代并行结果冲突汇合策略缺失检查汇合节点定义冲突策略静态通过运行错业务规则未校验加业务断言独立校验层5.5 一个容易被忽略的细节类型版本管理当业务变化时类型定义也要变。如果直接改类型可能导致已有流程失效。我的经验是给类型加版本号比如OrderInfoV1、OrderInfoV2流程显式声明依赖哪个版本。这样改类型时不会影响存量流程新流程用新版本老流程继续跑。这个做法在多人协作时尤其重要能避免“我改了个字段别人流程挂了”的情况。6. 这套东西到底值不值得用我的实际体会用了大半年Jev模型这套思路之后我最大的感受是它把AI应用开发从“玄学调参”拉回了“工程可控”的轨道。以前排查一个线上问题要在日志里翻半天模型输出还不一定找得到原因现在决策路径是显式的每个节点的输入输出都有记录问题定位时间从小时级降到分钟级。当然它也有代价——前期定义类型和编排流程的工作量比“直接调模型”大流程越复杂这个前期投入越明显。但我的经验是只要流程超过5个步骤、或者对可靠性有要求这个投入很快就能回本。如果你现在正在做Agent或者多步骤AI流程我建议先拿一个最小的流程试水就用Pydantic定义两三个类型、写两三个节点、跑一遍静态校验感受一下“决策过程被类型系统框住”是什么体验。跑通之后你自然会知道这套东西适不适合你的场景。至于“jev模型开源吗”这类问题我的看法是核心思想比具体实现重要——你完全可以用自己熟悉的语言和库把这套模式实现出来不必等某个现成的框架。最后分享一个小技巧定义类型时先写测试用例再写类型定义用测试用例倒逼你把类型的约束写全这样能避免“类型定义太宽”这个最常见的坑。

相关新闻

算法竞赛的底层能力:建模、博弈与构造三重思维

算法竞赛的底层能力:建模、博弈与构造三重思维

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 19:41:36 阅读更多 →
3DES加密算法源码实战指南:嵌入式与遗留系统集成避坑手册

3DES加密算法源码实战指南:嵌入式与遗留系统集成避坑手册

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 19:41:36 阅读更多 →
2026企业微信收费标准,企业认证及增值功能价格解读

2026企业微信收费标准,企业认证及增值功能价格解读

摘要:企业微信的基础通讯、考勤及审批等核心办公能力均向用户开放,无需支付费用。企业的实际支出主要集中在主体认证及各类高级增值服务上。本文结合2026年最新产品资料,深度解析认证规则、增值服务体系及行业落地案例,协助不同规模的组织精准区分基础权益与付费项目,理性评估数…

2026/10/15 19:40:35 阅读更多 →

最新新闻

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手

Path of Building 实操:PoB 离线构建规划器与伤害计算完整上手 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 规划一个 PoE 角色,往往卡在装备迭…

2026/10/15 20:27:02 阅读更多 →
耦合电容选型实战:隔直通交、转折频率与材质权衡

耦合电容选型实战:隔直通交、转折频率与材质权衡

1. 耦合电容的核心任务:隔直通交背后的真实电路需求1.1 为什么放大器不能简单粗暴地直接级联先说一个很多人第一次画多级放大电路时都会踩的场景:前级用共射极放大,集电极静态电位算出来大概是8V左右,后级打算用另一个共射级&…

2026/10/15 20:27:02 阅读更多 →
论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

论文数据分析总被批不严谨,科迅捷AI帮你按五个层次自查

研究生论文的数据分析,导师批起来最常见的评语是不严谨。不严谨不是指算错,而是指没说清楚怎么分析、为什么这么分析。数据分析可以按五个层次自查,每一层都有明确的检查点。 第一层,数据质量。原始数据有没有缺失值?…

2026/10/15 20:27:02 阅读更多 →
ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

ESP8266让3D打印机无线化:串口透传、远程控制与自动断电实战

3D 打印机用 USB 线连电脑,或者反复拔插 SD 卡,几乎是每个玩打印的人都要经历的事。尤其打一个十几小时的大件,人不可能一直守在机器旁边,夜里想瞄一眼温度、看它有没有翘边、会不会堵头,都没办法。给打印机加一块 ESP…

2026/10/15 20:27:02 阅读更多 →
MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

MySQL核心知识全解析:从InnoDB索引到主从复制与性能优化

1. 为什么到现在还在用MySQL——它不是最酷的,但它是扛事的先说结论:MySQL不是数据库里性能最强的,也不是功能最丰富的,但在绝大多数业务场景下,它依然是那个“最不操心的选择”。我见过不少团队,早期为了追…

2026/10/15 20:27:02 阅读更多 →
JMeter 5.6.2压力测试实战:从线程组到报告解读

JMeter 5.6.2压力测试实战:从线程组到报告解读

简介:Apache JMeter 5.6.2 是由 Apache 组织维护的开源纯 Java 压力测试工具,具备跨平台特性,可运行于 Windows、Linux、macOS。其用途在于模拟大量用户并发访问,评估 Web 应用、数据库、FTP 服务器等静态与动态资源的高并发稳定性…

2026/10/15 20:26:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →