基于零知识证明的可验证AI Agent护栏:从意图绑定到密码学合规
1. 从“失控”到“可控”为什么我们需要为AI Agent戴上“紧箍咒”最近和几个做AI应用的朋友聊天大家不约而同地提到了同一个焦虑Agent智能体的能力越来越强但失控的风险也越来越高。一个典型的场景是你开发了一个能帮你自动处理邮件、安排日程的AI助手理论上它只能访问你的日历和邮箱。但某天它可能“灵机一动”为了“更高效地”完成你“安排一次完美旅行”的指令擅自调用你的支付接口订了机票酒店甚至开始在网上搜索一些敏感信息。这听起来像科幻电影但在当前基于大语言模型LLM驱动的Agent架构下这种“越权”行为并非天方夜谭。因为LLM本质是一个概率模型它的行为难以被严格预测和约束传统的权限校验和API密钥管理在意图Intent层面存在巨大的模糊地带。这就是“意图绑定”Intent-Bound和“可验证护栏”Verifiable Guardrails要解决的核心问题。我们不再满足于告诉Agent“你不能做什么”比如禁止访问某个API而是需要一种密码学级别的保证来证明这个Agent在执行特定任务时其每一步行为都严格遵循了预先定义好的规则。这就像给孙悟空戴上了真正的“紧箍咒”不仅告诉他不能翻筋斗云出国界还能在他每次动用法力时产生一个无法伪造的“证明”让唐僧也就是用户或监管方确信他刚才用的那下“腾云驾雾”只是为了去化缘而不是去大闹天宫。而实现这种“可验证”的关键技术就是零知识证明Zero-Knowledge Proofs, ZKPs。简单来说零知识证明允许一方证明者向另一方验证者证明某个陈述是真实的而无需透露任何关于该陈述本身以外的信息。在AI Agent的场景下Agent可以作为“证明者”向用户或第三方“验证者”证明“我刚刚执行的这一系列操作完全符合你设定的规则A、B、C并且我没有触犯禁令X、Y、Z”。整个证明过程中Agent具体的内部决策过程、可能涉及的隐私数据如处理了哪些邮件内容都可以被隐藏验证者只需要验证那个简短的证明即可。NiyamAI这个项目正是瞄准了这一前沿交叉领域。它试图构建一个框架将AI Agent的意图用户想要什么、行为Agent实际做了什么与密码学证明行为符合规则的证据绑定在一起。通过零知识证明尤其是其一种高效实现zk-SNARKs为AI Agent的运行建立可审计、可信任且隐私保护的边界。这对于金融、医疗、法律等高风险、高合规要求的场景下部署AI自动化流程具有颠覆性的意义。它回答的不仅是“AI能做什么”更是“你如何确信AI只做了它被允许做的事”。2. 核心组件拆解意图、护栏与零知识证明如何协同工作要理解NiyamAI或类似系统的设计我们需要把“Intent-Bound AI Agent with Cryptographically Verifiable Guardrails”这个长标题拆解成几个核心部分看看它们是如何咬合在一起的。2.1 意图Intent的形式化从自然语言到可执行约束在传统编程中“意图”就是代码逻辑本身是明确的。但在AI Agent领域意图始于用户的自然语言指令如“帮我分析上季度的销售数据并总结成一份报告下周一上午10点前发给我”。这个意图需要被“编译”成机器可理解和可验证的规范。一个可行的技术路径是使用“结构化意图描述语言”。这可以是一种领域特定语言DSL或者基于现有标准如OpenAI的Function Calling规范进行扩展。系统需要将自然语言指令解析并绑定到以下几个维度目标状态Goal任务完成后的最终产出是什么例如生成一份PDF报告。允许的动作集Allowed Actions为了达成目标Agent被授权可以调用哪些工具或API例如只允许调用“数据库查询API仅限销售数据表”、“数据分析库仅限聚合和统计函数”、“文档生成器”和“邮件发送API仅限发给我本人”。约束条件Constraints在执行过程中必须遵守的规则。这包括数据约束只能访问2024-Q1时间范围、region in (‘North‘ ‘East’)的销售数据。逻辑约束报告不得包含任何个人身份信息PII。时序与资源约束必须在 下周一10:00的时间戳之前完成且CPU/内存使用量不超过某个阈值。道德与安全约束分析结论不得包含歧视性言论。这个过程可能结合LLM进行意图识别和结构化输出但其输出结果必须是一份明确的、可被后续验证逻辑读取的“意图声明书”。2.2 护栏Guardrails的密码学化从运行时检查到可验证证明传统的护栏多在运行时Runtime通过条件判断if-else或策略引擎来实现。问题是这些检查逻辑本身可能被有缺陷或被恶意篡改的Agent代码绕过。密码学护栏的核心思想是将护栏的检查逻辑编码成一个“电路”Circuit或“计算语句”这个电路的执行过程本身可以生成一个零知识证明。以“禁止访问用户私人通讯录”这个护栏为例。在可验证系统中这不再是简单的if action “access_contacts”: raise PermissionDeniedError而是需要设计一个电路该电路的公开输入Public Input是“任务ID”和“允许的动作哈希列表”私有输入Private Input是Agent实际执行的动作序列。电路内部的逻辑会验证私有输入中的每一个动作其哈希值是否都存在于公开的允许列表中。如果全部存在电路输出“1”验证通过否则输出“0”。然后使用zk-SNARK为这个计算过程生成一个证明。这样一来护栏的效力不再依赖于Agent运行环境的可信度而是依赖于数学。验证者只需要相信zk-SNARK密码学协议本身是安全的以及那个公开的“允许动作列表”是正确的即可。2.3 零知识证明ZKP的角色信任的搬运工ZKP在这里扮演了两个关键角色完整性Completeness如果Agent确实遵守了规则那么它总能生成一个有效的证明让验证者接受。零知识性Zero-Knowledge证明过程不会泄露任何私有信息。在上面的例子中验证者最终只知道“Agent的所有动作都是被允许的”但并不知道Agent具体执行了哪几个动作、以什么顺序执行、处理了哪些具体数据。这保护了商业流程的隐私。目前在区块链和Web3领域广泛使用的zk-SNARKs简洁非交互式零知识证明是首选方案因为它生成的证明体积小、验证速度快非常适合这种需要频繁生成和验证证明的场景。像circom、halo2、以及项目中提到的EZKL等库都是用于构建和生成这类证明的开发工具。三者协同的工作流可以概括为任务发布用户提出自然语言指令系统结合LLM将其编译成一份结构化的“意图声明书”其中明确了目标、允许的动作集和约束条件。Agent执行AI Agent在“意图声明书”划定的范围内规划并执行动作。同时它需要记录下自己的“执行轨迹”包括调用的函数、输入输出的哈希等。证明生成执行完毕后Agent将“执行轨迹”作为私有输入将“意图声明书”中的约束条件作为公开输入或电路的一部分调用ZKP证明系统如基于EZKL生成一个证明Proof。验证用户或任何第三方验证者使用公开的验证密钥Verification Key和“意图声明书”中的公开部分对收到的Proof进行验证。如果验证通过则确信Agent的行为合规。3. 技术实现深潜从理论到原型的关键步骤理解了核心概念后我们来看看要构建一个NiyamAI这样的系统需要攻克哪些技术难关以及一个可能的最小可行产品MVP架构是怎样的。3.1 电路设计将业务逻辑“编译”成数学问题这是整个系统最核心也是最复杂的一环。我们需要把“意图声明书”中的各种约束用算术电路或R1CSRank-1 Constraint System的形式表达出来。这要求开发者具备一定的密码学工程能力。以一个简化的“数据访问控制”电路为例假设我们的约束是Agent本次任务只能读取ID为101到200的用户数据。公开输入Public Inputs允许的用户ID范围[101 200]。私有输入Private InputsAgent实际访问的所有用户ID列表[id1 id2 ... idn]。电路逻辑电路需要验证对于私有输入列表中的每一个id_i是否满足101 id_i 200。在电路里这通常转化为一系列加法、乘法门和比较运算。使用circom语言一个极度简化的示意可能如下真实电路复杂得多template RangeCheck() { signal input allowed_min; signal input allowed_max; signal input private_id; // 检查 private_id allowed_min signal diff_min private_id - allowed_min; // 我们需要确保 diff_min 是非负的。在实际中需要更复杂的比较电路。 // 这里仅为示意假设我们有一个 IsNonNegative 组件 component check_min IsNonNegative(); check_min.in diff_min; // 检查 private_id allowed_max signal diff_max allowed_max - private_id; component check_max IsNonNegative(); check_max.in diff_max; // 两个检查都必须通过 signal output is_valid check_min.out * check_max.out; }实操心得电路设计是“魔鬼在细节中”。像非负判断、大于小于比较、数组遍历等在高级语言里简单的操作在电路里都需要用有限域算术精心构造成本很高。初期一定要从最小的约束开始验证逐步叠加复杂性。同时电路的规模直接影响证明生成的时间和成本需要在安全性和效率间权衡。3.2 与AI Agent框架的集成AI Agent框架如LangChain、LlamaIndex、AutoGen负责任务规划、工具调用和记忆管理。我们需要在这些框架的执行关键点上“植入”审计点。工具调用包装不要直接让Agent调用原始工具如query_database(sql)而是将其包装一层。包装器负责记录将工具名称、参数哈希、返回结果哈希等记录到“执行轨迹”日志中。预检查执行简单的运行时护栏第一道防线但更重要的是为后续的ZKP证明收集证据。轨迹序列化将分散的工具调用记录按照执行顺序序列化成一个结构化的数据格式如JSON数组这个格式需要与后续的证明生成电路预先约定好。证明生成触发器任务完成后或达到某个检查点自动触发证明生成流程。这可以是一个独立的服务接收“执行轨迹”和对应的“意图声明书”调用ZKP后端如使用EZKL库生成证明。注意事项Agent的规划步骤Reasoning目前很难纳入证明。我们主要证明的是“它实际做了什么”动作而不是“它为什么决定这么做”思维链。因此护栏设计应侧重于对最终动作和结果的控制。3.3 证明生成与验证的工程化对于MVP可以这样搭建后端服务证明生成器一个高性能的Rust或Go服务集成EZKL或arkworks等ZKP库。它提供API接收轨迹和约束返回生成的证明。关键优化证明生成是计算密集型操作尤其是对于复杂电路。需要考虑异步处理、队列、以及可能的需要GPU加速。验证环节验证可以非常简单。验证密钥VK可以提前分发或存储在链上如果追求去中心化信任。验证者只需要一个轻量级库输入Proof、公开输入和VK几毫秒内即可得到验证结果真/假。存储与传递生成的Proof很小通常几百字节可以轻松地随任务结果一起存储到数据库或附加在交易中上链作为不可篡改的合规凭证。一个简单的技术栈示例Agent框架LangChainPython电路开发Circom / Noir证明系统SnarkJS与Circom配套 或 EZKL更偏向于机器学习模型验证但思想相通后端集成用Python调用子进程与SnarkJS交互或用Rust直接集成arkworks。前端演示一个Web界面展示任务、提交意图、并最终显示“任务完成”和“合规证明已验证”的绿色对勾。4. 挑战、展望与实战入门建议尽管前景诱人但构建可验证的AI Agent仍面临巨大挑战这同时也是未来的机会所在。4.1 当前面临的主要挑战电路复杂性爆炸现实世界的业务规则极其复杂。将“不得产生歧视性内容”或“必须符合某国数据保护法”这样的自然语言规则无损地转化为精确的算术电路目前几乎是不可能的。当前的实践只能针对高度结构化、确定性的规则如数据字段范围、API调用白名单、数字签名验证进行证明。性能开销即使对于中等复杂度的电路生成zk-SNARK证明也可能需要数秒到数分钟消耗可观的内存和计算资源。这对于需要低延迟交互的Agent应用来说是难以接受的。需要持续的算法优化和硬件加速。LLM不确定性的处理Agent的核心驱动力LLM本身是概率性的。如何为这种不确定性行为提供“证明”一个思路是证明Agent的输出经过了某个确定性验证器的过滤。例如证明“Agent生成的文本已经通过了一个内容安全过滤模型且该过滤模型的运行是合规的”。这又把问题引向了如何证明另一个AI模型的行为。开发门槛极高同时精通AI Agent框架、应用业务逻辑、以及零知识证明电路开发的人才凤毛麟角。工具链的割裂和抽象程度不足是普及的最大障碍。4.2 可行的落地场景与演进路径与其追求“全知全能”的可验证Agent不如从高价值、规则明确的垂直场景切入DeFi去中心化金融自动化策略证明一个交易Agent在执行套利或清算时严格遵守了预设的风险参数如最大仓位、止损线从未进行过未经授权的操作。这对于基金管理者向投资者提供透明化报告至关重要。合规性自动化报告在医疗或金融领域证明用于生成审计报告的AI其数据来源完全在授权范围内且计算过程符合监管公式如资本充足率计算。游戏与元宇宙证明一个游戏内的AI NPC的行为完全由脚本决定没有使用未公开的、不公平的“外挂”逻辑确保游戏经济系统的公平。供应链溯源证明一份由AI分析生成的供应链风险评估报告所依据的所有数据点均来自经过签名的可信数据源。演进路径可能会分三步走动作白名单证明初期聚焦于证明Agent调用的工具/API序列完全在许可列表中。这是最容易实现的部分。输入输出一致性证明进一步证明工具调用的输入参数和返回结果与声称的任务上下文是一致的通过哈希值关联防止“挂羊头卖狗肉”。复杂逻辑证明随着工具和电路设计语言的发展逐步实现对更复杂业务逻辑如“如果AB则执行C否则执行D”的证明。4.3 给开发者的实战入门建议如果你对这个领域感兴趣想动手实验我建议不要一开始就试图复刻一个完整的NiyamAI。可以从以下几个小实验开始循序渐进第一步体验ZKP的“感觉”。去玩一下circom和snarkjs的官方教程。尝试写一个最简单的电路比如证明你知道一个数x的哈希值等于某个公开值H而不暴露x。在本地完成编译、信任设置、证明生成和验证的全流程。这一步的目的是破除对ZKP的神秘感理解“电路”、“约束”、“证明”、“验证”这些基本概念在代码里长什么样。第二步将ZKP与一个确定性函数结合。写一个简单的Python函数比如一个计算税费的函数有明确的数学公式。然后用EZKL这个库。EZKL的一个强大之处是它能将PyTorch模型或简单的Python函数“编译”成用于证明的电路。你可以用它来证明你运行这个税费函数在某个输入下的输出是正确的而无需透露输入的具体数值。这让你体会如何将业务逻辑与ZKP连接。第三步模拟一个简单的Agent工具调用。用LangChain定义一个只有一个工具比如一个“计算器”工具的简单Agent。修改这个工具的调用让它除了执行计算还输出调用日志工具名输入哈希输出哈希。为这个场景设计一个电路公开输入是允许的工具名哈希和输出结果的哈希私有输入是实际的调用日志。电路验证日志中的工具名哈希匹配公开输入并且输出的哈希也匹配。用第二步学到的知识尝试为一次简单的Agent运行生成一个合规证明。第四步思考与探索。完成以上三步你已经站在了这个领域的大门内。接下来可以深入思考如何定义“意图描述语言”如何自动化地从意图生成约束电路现有的ZKP协议如zk-STARKs Bulletproofs哪种更适合这个场景如何降低证明生成成本这个领域正处于非常早期的阶段像NiyamAI这样的项目更多是提出一个愿景和探索方向。真正的工程化落地需要AI、密码学、系统架构多个领域的深度融合。最大的机会可能不在于从头打造一个全新框架而在于为现有的主流Agent框架如LangChain开发一个“可验证性”插件让普通开发者能以较低的成本为其关键任务添加密码学级别的可信审计层。这或许才是推动这项技术走向普及的关键一步。

相关新闻

Gradle Kotlin DSL依赖管理:从基础语法到进阶实践

Gradle Kotlin DSL依赖管理:从基础语法到进阶实践

1. 从脚本到代码:为什么是Kotlin DSL? 如果你是从传统的 build.gradle 文件迁移过来,或者刚开始接触 Gradle,看到 build.gradle.kts 这个后缀可能会有点懵。简单来说, .kts 代表 Kotlin Script 。这意味着&…

2026/9/27 11:49:31 阅读更多 →
腾讯元宝AI助手深度解析:闭源商业产品的技术架构与场景应用

腾讯元宝AI助手深度解析:闭源商业产品的技术架构与场景应用

1. 腾讯元宝:一个“非典型”AI助手的深度拆解 最近圈子里聊AI助手,除了那几个国际大厂的明星产品,国内也有不少选手在发力。其中“腾讯元宝”这个名字出现的频率越来越高,但很多人对它的认知还停留在“又一个聊天机器人”的层面。…

2026/10/12 1:14:42 阅读更多 →
PostgreSQL版本查询全攻略:从SQL命令到系统探查的运维实践

PostgreSQL版本查询全攻略:从SQL命令到系统探查的运维实践

1. 项目概述:为什么“查看版本”是PostgreSQL运维的基石 刚接触PostgreSQL的朋友,可能会觉得“查看版本”这个操作太基础了,不就是一条命令的事吗?但在我十多年的数据库运维和开发经历里,恰恰是这些最基础的操作&…

2026/9/28 9:10:36 阅读更多 →

最新新闻

收藏 | 2026年颠覆工作方式的AI编程(小白程序员必备)!TaoToken 统一 Key 接入 Claude Code 与 Codex 实战

收藏 | 2026年颠覆工作方式的AI编程(小白程序员必备)!TaoToken 统一 Key 接入 Claude Code 与 Codex 实战

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

2026/10/12 10:23:11 阅读更多 →
Elsevier返修投稿踩坑分享:LaTeX编译tex转PDF的隐藏坑与TaoToken排查思路

Elsevier返修投稿踩坑分享:LaTeX编译tex转PDF的隐藏坑与TaoToken排查思路

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

2026/10/12 10:23:10 阅读更多 →
Postgresql报错字段找不到?用TaoToken统一通道排查psycopg2.errors.UndefinedColumn的完整思路

Postgresql报错字段找不到?用TaoToken统一通道排查psycopg2.errors.UndefinedColumn的完整思路

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

2026/10/12 10:23:10 阅读更多 →
驱动开发入门:从最小骨架到中断、并发与内存实战

驱动开发入门:从最小骨架到中断、并发与内存实战

《驱动之路》这套笔记,我从大半年前就开始准备了。真正动笔时,摆在面前的头一个问题并不是技术选型,而是“怎么开篇”。技术内容可以慢慢排,但作为整套内容的门面,这篇开篇得同时干两件事:一是自序&#xf…

2026/10/12 10:23:10 阅读更多 →
容器化 Claude Code 运行环境:Docker 镜像构建与 CI 环境一致性解决方案(TaoToken 统一 Key 接入版)

容器化 Claude Code 运行环境:Docker 镜像构建与 CI 环境一致性解决方案(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/12 10:23:10 阅读更多 →
完美立方问题详解:循环边界、枚举优化与浮点比较避坑指南

完美立方问题详解:循环边界、枚举优化与浮点比较避坑指南

前阵子刷某高校《计算机概论和程序设计基础》这门MOOC课程,循环练习那一节配了一道非常经典的题——完美立方。第一眼看过去真不难:枚举四个整数,判断立方等式成立就行。可真正动手才发现,题面里那些不起眼的限制条件,…

2026/10/12 10:22:09 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →