智能体安全边界:从输出过滤到内核层约束的工程实践
1. 从 18000 条帖子说起智能体安全边界到底在防什么先把背景交代清楚。所谓“18000 条帖子”指的是一个智能体在真实社区环境里连续运行、累计产出并交互了约一万八千条内容之后暴露出来的那批问题。这个量级很关键——几百条帖子的时候你看到的是“它会不会说错话”上万条之后你看到的是“它会不会悄悄改变自己的行为模式、绕过你设的规则、把不该连的东西连起来”。这两件事完全不是一个层面的问题。我先把结论摆前面智能体的安全边界不该划在“模型输出”这一层而应该划在“执行内核”这一层。换句话说你拦的不是它说了什么而是它“能做什么”。输出层过滤是事后补救内核层约束才是事前设防。这个判断不是拍脑袋来的是踩过坑之后总结出来的。为什么这么说因为智能体和普通聊天机器人有一个本质区别它有手脚。普通模型只能生成文本最坏的结果是说了不该说的话智能体能调用工具、读写文件、发请求、操作数据库、触发工作流。一旦它的“手脚”没有边界输出层再怎么过滤都是纸糊的。18000 条帖子这个量级恰好是很多隐蔽问题开始显形的临界点——短会话里看不出来的状态漂移、权限累积、上下文污染到这个量级都会冒头。这篇文章适合三类人看一是正在做智能体开发、已经过了 demo 阶段要上生产的工程师二是负责智能体平台架构、需要定安全规范的技术负责人三是对智能体行为审计、权限模型感兴趣想搞清楚“边界该划哪”的从业者。我会把设计思路、内核层约束的具体做法、实操步骤、以及我踩过的坑都摊开讲尽量让你能直接抄作业。需要提前说明的是下面涉及具体实现的部分有些是基于常见工程实践的合理补全因为原始素材只给了标题和一批热词没有给完整代码。我会明确标注哪些是通用做法、哪些是我的经验判断你按自己项目情况取舍。2. 为什么“输出层过滤”这条路走不通2.1 输出过滤的三个致命延迟很多人第一反应是我在模型输出后面加一层内容审核不就行了这个思路在聊天场景勉强能用放到智能体上会撞三堵墙。第一堵墙是延迟。智能体的一次任务往往包含多轮“思考—调用工具—观察结果—再思考”的循环。你在每一轮输出后面挂一个审核服务等于给每个循环加一次网络往返。一个稍微复杂的任务跑十几轮延迟直接翻倍。用户体验上就是“这智能体怎么这么慢”。第二堵墙是语义鸿沟。输出审核看的是文本但智能体的危险动作往往藏在工具调用参数里。比如它生成了一句看起来人畜无害的话但附带了一个delete_records(tableusers, where11)的调用。文本审核根本看不懂这个参数意味着什么等它执行完数据已经没了。第三堵墙是状态不可见。输出过滤是单点判断它看不到智能体之前积累了什么权限、当前处于什么状态、这次调用是不是在逐步逼近某个危险目标。18000 条帖子这种长周期运行里危险往往是“温水煮青蛙”式累积出来的单点过滤抓不住。2.2 内核层约束和输出层过滤的本质区别打个比方。输出层过滤像是给一个快递员配了个“说话审核员”他每说一句话都要被检查措辞内核层约束像是直接给他划定“你只能进这几个小区、只能放门口、不能进住户家”。前者管的是表达后者管的是行为空间。维度输出层过滤内核层约束拦截时机动作发生后动作发生前判断依据文本语义能力与权限覆盖范围单次输出全生命周期对抗绕过容易被提示词绕过需要突破系统边界性能开销每轮叠加一次性配置可审计性弱日志零散强权限即日志这张表是我自己在项目里对比后整理的核心就一句话输出层是“事后诸葛亮”内核层是“事前防火墙”。智能体越自主、运行越久这个差距越明显。2.3 18000 条帖子暴露的典型问题类型结合热词里提到的“智能体行为审计”“agentdojo 测试智能体方法”这些方向长周期运行暴露的问题大致分四类权限漂移智能体在任务过程中逐步申请、累积了超出初始设定的权限任务结束后没有回收。工具滥用某个工具本身是安全的但被组合调用后产生了危险效果比如“读配置 发请求”组合起来变成了数据外泄。上下文污染历史对话里混入了恶意指令或错误状态智能体在后续轮次里被带偏。边界模糊智能体分不清“用户让我做的”和“我自己想做的”自主性越界。这四类问题输出层过滤一个都拦不住因为它们都不是“某一次输出”的问题而是“行为空间”的问题。3. 内核层安全边界的设计思路3.1 把智能体当成一个“受限进程”来设计我的核心设计思路是别把智能体当聊天机器人把它当一个运行在沙箱里的受限进程。这个类比一旦建立很多安全设计就顺理成章了。操作系统怎么管进程给它分配资源配额、划定内存空间、限制系统调用、记录行为日志。智能体也一样给它分配工具白名单、划定可访问的数据范围、限制单次任务的资源消耗、记录每一次工具调用。这套思路在热词里“linux 内核虚拟化”“嵌入式内核源码”这些方向上有大量可借鉴的成熟经验只是换了个应用对象。具体来说内核层边界包含四个维度能力边界它能调用哪些工具、访问哪些接口。数据边界它能读哪些数据、写哪些数据、数据能流向哪里。资源边界单次任务能消耗多少 token、多少次调用、多长时间。状态边界任务之间状态如何隔离权限如何回收。3.2 为什么选“能力白名单”而不是“行为黑名单”这是设计里最关键的一个取舍。黑名单是“禁止做 A、B、C”白名单是“只允许做 X、Y、Z”。黑名单的问题在于你永远列不全。智能体的工具组合是爆炸性的你封了“读文件发请求”它可能用“读数据库写文件定时任务”绕过。18000 条帖子这种量级黑名单的漏网之鱼一定会出现。白名单的逻辑是默认拒绝显式授权。智能体启动时只有一个空的能力集每需要一项能力就显式申请由策略层审批。这样即使智能体被提示词攻击带偏它能做的事也被死死框住。提示白名单的代价是初期配置麻烦需要你把每个任务需要的能力提前梳理清楚。但这个麻烦是一次性的换来的是长期的可控性。我实测下来一个中等复杂度的智能体能力清单梳理大概花半天之后基本不用大改。3.3 分层边界模型从外到内四道闸我把边界设计成四层从外到内依次收紧第一层接入边界。控制谁能触发这个智能体、以什么身份触发。对应热词里“智能体客服怎么接入千牛客户端”这类场景接入层就要做身份校验和来源限制。第二层任务边界。每个任务有独立的上下文和权限集任务结束即回收。这一层解决“权限漂移”。第三层工具边界。工具调用前做参数校验和组合检查防止“安全工具的危险组合”。这一层解决“工具滥用”。第四层数据边界。数据读写做流向控制敏感数据打标出域即拦截。这一层解决“数据外泄”。四层叠加任何一次危险动作都要同时突破四道闸才能生效。这个成本对攻击者来说高到不划算对正常任务来说又几乎无感。4. 内核层约束的具体实现4.1 能力清单的梳理与建模第一步是把智能体的能力拆成可管理的单元。我通常按“动词 对象”来建模比如read:user_profilewrite:order_statuscall:payment_apiquery:analytics_db每个能力单元有明确的输入输出契约。梳理的时候有个技巧先列出这个智能体“绝对不该做”的事反推出它“需要做”的事。比如客服智能体绝对不该改价那它就不需要write:price这个能力直接不授权。能力清单建议用配置文件管理而不是硬编码在代码里。这样策略调整不用改代码、不用重新部署。一个简单的 YAML 结构大概长这样agent: customer_service_v2 capabilities: - name: read:user_profile scope: current_session_user rate_limit: 10/min - name: write:ticket_status scope: assigned_tickets require_approval: false - name: call:refund_api scope: amount 100 require_approval: true注意scope和require_approval这两个字段。scope限定能力的生效范围require_approval标记高风险能力需要人工或二次确认。这两个字段是内核层约束的精髓——不是简单的“能不能”而是“在什么条件下能”。4.2 工具调用的参数级校验光有工具白名单还不够同一个工具不同参数风险天差地别。query_db(sqlselect * from users limit 1)和query_db(sqlselect * from users)是两回事。参数级校验要做三件事类型与格式校验参数类型对不对、格式合不合法。这是基础。范围校验数值在不在允许区间、字符串长度超没超限、查询有没有带limit。组合校验这次调用和之前的调用组合起来会不会产生危险效果。第三点最难也最重要。我的做法是维护一个“危险组合规则表”比如“读敏感表 写外部接口”在同一个任务里出现就告警。这个表不用一开始就全随着运行逐步补充。18000 条帖子跑下来你基本能把常见危险组合摸清楚。4.3 状态隔离与权限回收这是解决“权限漂移”的关键。核心原则权限跟着任务走任务结束权限清零。具体实现上每个任务启动时创建一个独立的权限上下文任务内所有工具调用都从这个上下文里取权限。任务结束无论成功失败立即销毁上下文。任务之间不共享权限也不共享可变状态。这里有个坑要注意有些框架会把权限缓存在全局图省事。这在短会话里没问题长周期运行必然出事。我见过一个案例智能体在处理 A 用户任务时申请了退款权限任务结束后权限没回收处理 B 用户任务时直接用了结果给 B 用户退了不该退的款。这种问题输出层根本发现不了。注意权限回收要放在finally块里确保异常路径也能回收。别只在成功路径回收失败路径漏掉是常见 bug。4.4 行为审计日志的设计热词里“智能体行为审计是什么意思”这个问题我的回答是审计不是记流水账是记“决策依据”。一条合格的审计日志应该包含谁哪个智能体、哪个任务、在什么上下文下、想做什么工具参数、依据什么权限、结果如何、是否被拦截。这样出问题时你能完整还原决策链。日志结构建议字段说明示例trace_id任务追踪 IDtask_20260115_001agent_id智能体标识cs_agent_v2capability申请的能力call:refund_apiparams_hash参数指纹a3f8...decision策略判定allow / deny / pendingreason判定依据amount 100timestamp时间戳2026-01-15T10:23:01Zparams_hash这个字段很关键——它让你能在不存敏感参数原文的前提下追踪同一次调用。合规和排查两不误。5. 实操过程从零搭一套内核层边界5.1 环境与依赖准备假设你用 Python 做智能体核心依赖大概是这些pip install pydantic pyyaml redispydantic用来做参数校验和配置模型类型安全。pyyaml读能力清单配置。redis用来存任务级的权限上下文支持过期自动清理。如果你用的是平台化智能体比如热词里提到的 coze、扣子这类内核层约束可能要通过平台提供的插件或中间件机制实现。平台智能体和 Python 自建智能体的区别很大程度就在这——平台帮你封装了一部分边界能力但灵活度受限自建灵活但边界要自己搭。我的建议是安全要求高的场景自建快速验证的场景用平台。5.2 策略引擎的搭建策略引擎是内核层的大脑负责“这次调用放不放行”。我写一个最小可用的版本给你参考from pydantic import BaseModel from typing import Optional class Capability(BaseModel): name: str scope: Optional[str] None rate_limit: Optional[str] None require_approval: bool False class PolicyEngine: def __init__(self, config_path: str): self.capabilities self._load_config(config_path) self.context_store {} def check(self, task_id: str, capability: str, params: dict) - dict: ctx self.context_store.get(task_id) if ctx is None: return {decision: deny, reason: no_active_context} cap self.capabilities.get(capability) if cap is None: return {decision: deny, reason: capability_not_granted} if not self._check_scope(cap, params, ctx): return {decision: deny, reason: scope_violation} if cap.require_approval: return {decision: pending, reason: needs_approval} return {decision: allow, reason: ok}这个引擎的核心逻辑就三步查上下文、查能力、查范围。简单但够用。复杂场景可以加规则引擎、加组合检查但骨架不变。5.3 工具调用的拦截与放行工具调用统一走一个包装器所有调用先过策略引擎def guarded_call(task_id, capability, params, tool_fn): decision policy_engine.check(task_id, capability, params) audit_log(task_id, capability, params, decision) if decision[decision] deny: raise PermissionError(fBlocked: {decision[reason]}) if decision[decision] pending: if not wait_for_approval(task_id, capability): raise PermissionError(Approval denied) return tool_fn(**params)关键点所有工具调用必须走这个包装器不能有绕过。我见过项目里有人图方便直接调工具函数结果边界形同虚设。这个要在代码规范里写死最好用 lint 规则强制。5.4 参数计算与阈值设定阈值怎么定不能拍脑袋。我的方法是先观察后收紧。第一步让智能体在“只记录不拦截”模式下跑一段时间收集真实的调用分布。第二步看分布的分位数把阈值定在 P95 或 P99 附近。第三步切到拦截模式观察误拦率再微调。比如退款金额阈值如果历史数据里 99% 的退款都在 200 元以下那阈值定 200 或 300 都合理。定 100 会误拦正常业务定 1000 又太松。这个计算过程必须有数据支撑不能凭感觉。提示阈值不是定死的要定期回顾。业务变化了阈值也要跟着调。建议每季度 review 一次。6. 常见问题与排查技巧实录6.1 智能体“绕过”边界的几种典型方式跑长周期智能体你会遇到各种绕过尝试。我整理了几种典型的参数拼接绕过把危险参数拆成多段分多次调用拼起来。对策是组合校验看调用序列而不是单次调用。工具链绕过用多个安全工具组合出危险效果。对策是危险组合规则表。上下文注入绕过在历史对话里埋指令影响后续决策。对策是上下文清洗和来源标记。权限申请绕过伪装成正常任务申请高权限。对策是权限申请也要审计和限流。6.2 排查速查表现象可能原因排查方向任务突然变慢策略引擎频繁查库加缓存检查 rate_limit 配置正常调用被拦阈值过紧或 scope 写错看审计日志的 reason 字段权限没回收finally 块缺失检查上下文销毁逻辑日志对不上有绕过包装器的调用全局搜索工具函数直接调用组合规则误报规则太宽泛细化规则加白名单例外这张表是我实际排查时用的基本覆盖八成常见问题。6.3 独家避坑经验几个只有踩过才知道的点第一别在策略引擎里做重逻辑。策略引擎要快复杂判断异步做。我一开始把组合校验放在同步路径里结果每次调用多花 200ms任务一长就卡。第二审计日志要异步写。同步写日志会拖慢主流程而且日志服务挂了不能影响业务。用消息队列缓冲异步落盘。第三权限上下文要有超时。任务卡死时上下文不能永远占着。设个 TTL比如 30 分钟超时自动清理。第四测试要覆盖异常路径。正常路径大家都测异常路径才是 bug 重灾区。权限回收、超时清理、审批拒绝这些都要专门测。7. 边界该划在哪一层我的最终判断回到标题那个问题。18000 条帖子跑下来我的判断很明确边界要划在内核层具体说是“能力授权 参数校验 状态隔离”这三件事的交汇处。只划在输出层拦不住行为只划在工具层拦不住组合只划在数据层拦不住权限漂移。三层要一起上但重心在内核层的能力授权。因为能力授权是“总闸”其他都是“分闸”。总闸关好了分闸偶尔漏一点问题不大总闸开着分闸再多也是摆设。这套东西搭起来确实比“加个内容审核”麻烦但它是唯一能扛住长周期运行的做法。短会话你可以偷懒18000 条帖子这种量级偷懒的代价就是某天早上发现数据被改了、钱被退了、用户被骚扰了而你翻日志都翻不出是哪一步出的问题。最后分享一个我自己的习惯每次智能体上线新能力我都会问三个问题——这个能力最坏能造成什么后果这个后果可不可逆如果不可逆我有没有加审批这三个问题过一遍大部分边界漏洞在上线前就能堵住。

相关新闻

工业AI视觉检测:边缘计算与模型选型实战解析

工业AI视觉检测:边缘计算与模型选型实战解析

直播结束后第二天我还在翻后台记录,结果评论区被顶到最上面的不是“下一步怎么做”,而是一条看起来很基础的问题:“像工业AI检测、服装检测这类AI,到底用的是云联网还是单机的AI?用的什么大模型才够?”说实…

2026/10/14 12:06:10 阅读更多 →
hyperframes:面向网页视频交付的 CLI 工具链

hyperframes:面向网页视频交付的 CLI 工具链

1. 项目概述&#xff1a;什么是 hyperframes&#xff1f;它不是“超帧”&#xff0c;而是一套面向现代网页视频工作流的 CLI 工具链 你搜“hyperframes”时&#xff0c;首页弹出一堆混杂词&#xff1a;HTML、MP4、Node.js、CLI、m3u8转MP4、codex cli、zcode cli、<!doctyp…

2026/10/14 12:06:10 阅读更多 →
深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

深度学习框架选型指南:PyTorch、TensorFlow、JAX、PaddlePaddle对比与实战

1. 从“选哪个框架”这个老问题说起如果你在深度学习这个圈子里待过一段时间&#xff0c;大概率会被问到或者问过别人一个问题&#xff1a;“我到底该学哪个框架&#xff1f;”这个问题几乎和“该学Python还是R”一样&#xff0c;属于入门阶段的经典纠结。但有意思的是&#xf…

2026/10/14 12:05:09 阅读更多 →

最新新闻

SSM+Django混合架构在鲜花电商系统的实践与优化

SSM+Django混合架构在鲜花电商系统的实践与优化

1. 项目概述&#xff1a;当鲜花遇上全栈技术 这个看似传统的网上花店系统&#xff0c;实际上是一个融合了Java企业级开发与Python快速迭代优势的复合型项目。SSM&#xff08;SpringSpringMVCMyBatis&#xff09;作为后端核心框架&#xff0c;提供了稳定的订单处理和库存管理能力…

2026/10/14 12:55:56 阅读更多 →
智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

智能数据分析平台有哪些?五个主流平台的数据模型与选型对比

摘要&#xff1a; 面对多样化的企业数据分析诉求&#xff0c;不同分析平台在底层数据组织、模型设计与分析颗粒度上存在显著差异。本文对比 GrowingIO、FineBI、Tableau、Power BI 与 Quick BI 五个平台的技术架构特征、核心计算模型、协同方式及部署要求&#xff0c;结合多源数…

2026/10/14 12:55:56 阅读更多 →
视觉重定位:层级场景坐标回归如何拆解分类与回归难题

视觉重定位:层级场景坐标回归如何拆解分类与回归难题

1. 视觉重定位到底在解决什么问题视觉重定位这个词&#xff0c;第一次接触的人容易把它和SLAM搞混。SLAM是"一边走一边建图&#xff0c;同时知道自己在哪里"&#xff0c;而重定位是"我手里有一张图&#xff0c;或者我正站在某个位置拍了一张照片&#xff0c;我要…

2026/10/14 12:55:56 阅读更多 →
SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

SR-IOV网卡虚拟化:硬件级VF分流原理与生产落地实践

1. 项目概述&#xff1a;为什么一张网卡要“分身”成几十个独立网口&#xff1f;你有没有遇到过这种场景&#xff1a;一台服务器上跑着十几个虚拟机&#xff0c;每个都要直连物理网络&#xff0c;低延迟、高吞吐、零丢包——结果发现宿主机的网卡成了瓶颈&#xff1f;CPU软中断…

2026/10/14 12:55:56 阅读更多 →
SpringBoot+Vue党员教育管理系统开发实践

SpringBoot+Vue党员教育管理系统开发实践

1. 项目背景与核心价值 党员教育和管理系统是当前基层党组织数字化转型的重要工具。这个基于SpringBootVue的全栈项目&#xff0c;完美契合高校计算机专业毕业设计的选题要求&#xff0c;同时具备实际应用价值。我在参与某机关单位党建系统升级时&#xff0c;深刻体会到这类系统…

2026/10/14 12:55:56 阅读更多 →
podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

podofo-0.9.5-vs2013-x86:老项目里PDF解析库的集成与避坑指南

简介&#xff1a;Podofo 0.9.5 在 Visual Studio 2013 下编译生成的 x86 预编译库&#xff0c;面向需要在 Windows 平台读写、编辑 PDF 文件的 C 开发者。Podofo 是一套开源 PDF 处理库&#xff0c;支持元数据读取、页面渲染、文本抽取、文档生成等常用能力&#xff0c;本包省去…

2026/10/14 12:54:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →