AI Agent 写库风险与数据库版本控制:从删库到 Git 式续命
1. 当 Agent 开始手滑一个被忽视的运维新风险过去一年我陆续帮几个团队处理过数据库被自动化程序误操作的事故。最典型的一次是一个负责数据清洗的 Agent 在批量处理任务时因为一条边界条件判断写错把生产库里一张核心业务表的数据全量覆盖了。等值班同学发现告警时已经是凌晨三点备份策略还停留在每天凌晨全量一次的节奏上中间八个小时的增量数据全部丢失。这件事之后我开始认真思考一个问题当越来越多的自动化 Agent 接入数据库传统的人管库模式还够用吗标题里说的Agent 习惯性删库跑路其实是个略带调侃的说法。它指向的是一个真实且正在快速蔓延的工程问题——AI Agent 或自动化脚本对数据库的写操作正在成为数据安全的新变量。传统场景下删库这种事要么是人为失误要么是恶意攻击频率低、可追溯。但 Agent 不一样它可能一天执行几千次写操作每一次都看起来合理直到某一次参数越界、逻辑跑偏灾难就发生了。而数据库纷纷学 Git 续命这个说法则点出了当前业界的一个应对思路给数据库加上类似 Git 的版本控制能力让每一次数据变更都可追溯、可回滚、可对比。这不是简单的备份而是把数据库的变更历史变成一条可以checkout的时间线。这篇文章适合三类人看一是正在做 Agent 开发、需要让 Agent 读写数据库的工程师二是负责数据库运维、正在寻找更细粒度保护方案的 DBA三是对数据版本控制这个方向感兴趣、想了解当前工具有哪些选择的技术负责人。我会从问题本质讲起拆解几种主流方案的原理和适用边界再给出可以直接落地的配置思路和踩坑经验。2. Agent 写库为什么比人写库更危险2.1 频率与批量单次失误的破坏力被放大人操作数据库一次 DELETE 忘加 WHERE 条件影响的是当前连接能触达的那部分数据。但 Agent 不一样它通常以批处理模式运行一次任务可能涉及成千上万行。更麻烦的是很多 Agent 框架默认使用连接池和事务批量提交一条错误的 UPDATE 语句可能在几秒内就作用到全表。我见过一个案例某个数据同步 Agent 在检测到源表和目标表结构不一致时自动执行了重建目标表的逻辑。这个逻辑在测试环境跑了几十次都没问题因为测试库数据量小、表结构简单。但到了生产环境重建过程中触发了外键级联删除把关联的三张表一起清空了。从触发到完成前后不到十秒。2.2 逻辑黑盒你很难预判它下一步做什么传统脚本的行为是确定的输入相同、输出相同。但基于大模型的 Agent 带有一定的自主决策成分它可能根据上下文选择不同的执行路径。这意味着即使你审查了它的提示词和工具定义也无法完全保证它在所有边界条件下都做出正确选择。注意这不是说 Agent 不可用而是说对 Agent 的数据库权限必须做更严格的约束。把 Agent 当成一个能力很强但偶尔会犯迷糊的实习生来管理比把它当成可靠的自动化工具更安全。2.3 事务边界模糊回滚不一定能救你很多人觉得只要 Agent 的操作在事务里出问题回滚就行了。但现实是Agent 的任务往往跨越多个事务甚至跨越多个数据库连接。比如一个从 A 库读数据、清洗后写入 B 库的 Agent它的读和写不在同一个事务里。如果写入到一半发现数据有问题已经提交的那部分事务是回滚不了的。更隐蔽的情况是Agent 可能会执行 DDL 语句如 ALTER TABLE、DROP TABLE。在多数数据库里DDL 是隐式提交的一旦执行就无法回滚。这就是为什么删库跑路这个说法虽然夸张但并非完全没有现实基础。3. 数据库学 Git到底学的是什么3.1 不是把数据塞进 Git而是借鉴版本控制的思想首先要澄清一个常见误解数据库学 Git并不是真的把数据库文件放到 Git 仓库里管理。数据库文件是二进制格式体积大、变更频繁直接放进 Git 会导致仓库爆炸。真正被借鉴的是 Git 的几个核心思想每次变更都有唯一标识类似 commit hash每次数据修改都生成一个可引用的版本号。变更历史可追溯能查到谁在什么时候改了哪些行、改成了什么。任意版本可检出可以回到过去某个时间点的数据状态而不只是恢复备份。分支与合并可以在不影响主库的情况下做实验性修改验证后再合并。3.2 几种主流实现路径的对比当前业界实现数据库版本控制的思路大致分为三类各有优劣方案类型代表思路优点局限日志级版本化解析 binlog/redo log生成变更流对业务无侵入性能影响小只能回放到某个时间点不能按行对比快照级版本化定期对表做快照存储差异实现简单恢复速度快快照间隔内的变更会丢失行级版本化每行数据带版本号保留历史版本可精确到行级回滚和对比存储开销大需要改造表结构我在实际项目中用过前两种。日志级方案适合整体回滚到某个时间点的场景比如发现 Agent 在下午两点到两点半之间写入了脏数据直接把库恢复到两点前的状态。但它没法回答这两点半小时内具体哪几行被改了这种问题。行级版本化则能精确到第 1024 行在 14:23:05 被 Agent 从 active 改成了 deleted但代价是每张表都要加版本字段写入性能会下降。3.3 seekdb 这类工具在做什么热词里提到的 seekdb以及类似的数据库版本管理工具核心思路通常是在数据库和应用之间加一层代理拦截所有写操作在写入前先记录变更前后的行数据形成一个独立的变更账本。这个账本本身可以用类似 Git 的结构来组织支持按时间线查看、按条件筛选、按版本回滚。这种方案的好处是对应用透明Agent 不需要改代码只要把连接指向代理层就行。坏处是代理层本身成为性能瓶颈和单点需要额外考虑高可用。4. 给 Agent 配数据库权限的正确姿势4.1 最小权限原则的具体落地很多团队给 Agent 配数据库账号时图省事直接给 root 或 db_owner。这是最危险的做法。正确的做法是按 Agent 的实际需求精确到表和操作类型-- 只允许 Agent 对 orders 表做 SELECT 和 INSERT GRANT SELECT, INSERT ON production.orders TO agent_writer%; -- 只允许对 order_status 表的特定列做 UPDATE GRANT UPDATE (status, updated_at) ON production.orders TO agent_updater%; -- 明确禁止 DELETE 和 DROP REVOKE DELETE, DROP ON production.* FROM agent_writer%;提示MySQL 8.0 支持列级权限PostgreSQL 也支持列级 GRANT。如果你的数据库版本较老至少要做到表级权限隔离不要让一个 Agent 账号能访问所有库。4.2 用只读副本做沙箱一个很实用的模式是让 Agent 的读操作走只读副本写操作走主库但限制在特定表。这样即使 Agent 的查询逻辑有问题也不会影响主库性能。对于写操作可以再套一层写入队列表的模式——Agent 只往一个中间表写意图由另一个受控的消费者进程去实际执行。这种模式下Agent 即使发疯最多也只能往中间表里灌垃圾数据不会直接碰到核心业务表。中间表的消费者可以做二次校验比如检查写入频率、数据格式、业务规则不通过就拒绝执行并告警。4.3 审计日志必须独立存储Agent 的所有数据库操作审计日志不能和业务数据放在同一个库实例上。原因很简单如果 Agent 有权限删业务数据它也可能有权限删审计日志。审计日志应该写到独立的日志服务或对象存储里并且设置为只追加、不可修改。我通常建议用这样的结构Agent 操作 → 数据库代理层记录变更 → 变更写入独立审计库只追加同时数据库自身的 general log 或 audit log 也开启写到本地文件后由日志采集器实时拉走两套日志互相印证任何一套被篡改都能通过另一套发现5. 实操用 Git 思路管理数据库变更的完整流程5.1 环境准备与工具选型假设我们要为一个数据清洗 Agent 搭建一套带版本控制能力的数据库环境。基础组件包括PostgreSQL 15支持逻辑复制和丰富的扩展一个变更捕获工具可以用 Debezium也可以用轻量的触发器方案一个版本存储层可以用对象存储 元数据库也可以直接用 seekdb 这类专用工具Git 本身用于管理 Schema 变更脚本先安装和配置基础环境# 安装 PostgreSQL 15 sudo apt-get install postgresql-15 postgresql-client-15 # 安装 Debezium 需要的插件如果使用 Kafka Connect 模式 # 这里以独立模式为例下载 Debezium PostgreSQL connector wget https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.4.0.Final/debezium-connector-postgres-2.4.0.Final-plugin.tar.gz tar -xzf debezium-connector-postgres-2.4.0.Final-plugin.tar.gz -C /opt/debezium/5.2 配置变更捕获让每一次写入都留下痕迹在 PostgreSQL 中开启逻辑复制让变更可以被外部消费-- 修改 postgresql.conf wal_level logical max_replication_slots 4 max_wal_senders 4 -- 创建复制槽 SELECT * FROM pg_create_logical_replication_slot(agent_changes, pgoutput); -- 创建发布指定需要捕获的表 CREATE PUBLICATION agent_pub FOR TABLE orders, order_items, customers;然后配置 Debezium 连接器把变更流写入一个独立的变更表{ name: agent-change-connector, config: { connector.class: io.debezium.connector.postgresql.PostgresConnector, database.hostname: localhost, database.port: 5432, database.user: debezium, database.password: your_password, database.dbname: production, table.include.list: public.orders,public.order_items, plugin.name: pgoutput, slot.name: agent_changes, publication.name: agent_pub, topic.prefix: agent, transforms: unwrap, transforms.unwrap.type: io.debezium.transforms.ExtractNewRecordState } }这样Agent 对 orders 表的每一次 INSERT、UPDATE、DELETE都会在变更流里留下一条记录包含变更前后的完整行数据。5.3 用 Git 管理 Schema 变更脚本数据变更用变更流捕获但表结构变更DDL建议用 Git 管理。每次 Agent 需要修改表结构时不直接执行 DDL而是提交一个迁移脚本到 Git 仓库由 CI 流程审核后执行# 创建迁移脚本目录 mkdir -p db/migrations cd db/migrations # 命名规范时间戳_描述.sql touch 20250115_add_agent_tracking_column.sql脚本内容示例-- 20250115_add_agent_tracking_column.sql -- 为 orders 表添加 Agent 操作追踪字段 ALTER TABLE orders ADD COLUMN agent_run_id UUID; ALTER TABLE orders ADD COLUMN agent_modified_at TIMESTAMPTZ; -- 创建索引方便按 Agent 运行批次查询 CREATE INDEX idx_orders_agent_run ON orders(agent_run_id);提交到 Git 后通过 CI 工具如 GitLab CI、GitHub Actions自动执行迁移并记录执行结果。这样每一笔 Schema 变更都有 commit 记录、有审核痕迹、可回滚。5.4 回滚演练确保续命方案真的能救命配置完不代表万事大吉。我强烈建议每个月做一次回滚演练模拟 Agent 误操作场景验证整个链路是否能在可接受时间内恢复。演练步骤在测试库上让 Agent 执行一次批量 UPDATE故意写错数据记录操作时间点和影响行数通过变更流定位到具体变更记录生成反向 SQL 并执行回滚验证数据是否恢复到正确状态记录从发现到恢复的总耗时我自己的经验是第一次演练通常会暴露很多问题变更流有延迟、反向 SQL 生成逻辑有 bug、权限不够导致回滚失败等等。这些问题在真实事故前发现比在事故中发现要好得多。6. 那些只有踩过才知道的坑6.1 变更流不是实时的延迟可能比你想象的大Debezium 从数据库 WAL 读取变更到写入目标存储中间有网络传输、序列化、反序列化的开销。在数据量大的时候延迟可能达到几十秒甚至几分钟。这意味着如果你发现 Agent 在 10:00:00 写入了脏数据变更流里可能到 10:00:30 才出现这条记录。如果你的回滚策略依赖变更流必须把这个延迟考虑进去。我的做法是在 Agent 的写操作和变更流之间加一个操作标记Agent 每次批量写入前先往一个 marker 表写一条记录包含批次 ID 和时间戳。回滚时以 marker 表的时间为准而不是变更流的时间。6.2 大事务会把变更流撑爆如果 Agent 在一个事务里更新了十万行变更流会一次性产生十万条变更记录。这不仅会撑大存储还可能导致消费端处理不过来出现积压。更麻烦的是某些数据库对单个事务的 WAL 大小有限制超大事务可能直接失败。解决办法是限制 Agent 的单次写入批量大小。我通常建议单事务不超过 1000 行超过就拆成多个小事务。虽然这样会牺牲一点原子性但换来了变更流的稳定和可回滚性。6.3 回滚不等于恢复原状这是最容易被忽视的一点。假设 Agent 把订单状态从待支付改成了已取消你通过变更流回滚把状态改回待支付。但在这期间可能已经有其他业务逻辑基于已取消状态做了后续操作比如释放了库存、发送了通知。简单地把状态改回去并不能撤销这些副作用。所以回滚方案必须和业务逻辑一起设计。对于关键业务表我建议在 Agent 写入前先做一次业务影响评估确认这个变更是否可逆。如果不可逆就应该走人工审核流程而不是让 Agent 自动执行。6.4 权限回收要及时Agent 完成任务后它的数据库账号应该被禁用或删除。我见过太多案例临时给 Agent 开的账号一直留着几个月后 Agent 代码已经更新了好几版但账号权限还是当初的宽泛配置。一旦新版本代码有 bug旧账号的宽权限就会放大破坏力。建议把 Agent 账号的生命周期和它的任务绑定任务创建时申请账号任务结束后自动回收。可以用数据库的账号过期策略或者用配置管理工具如 Ansible、Terraform来管理账号的创建和销毁。7. 从续命到免疫更进一步的思路7.1 写前校验让 Agent 的写操作先过一道安检与其等 Agent 写错了再回滚不如在写入前就拦住。可以在数据库代理层加规则引擎对 Agent 的写操作做实时校验单次影响行数超过阈值比如 5000 行时拒绝执行并告警更新或删除操作没有带 WHERE 条件时直接拦截写入的数据格式不符合预期比如状态字段出现了枚举外的值时拒绝在非工作时间比如凌晨执行大批量写操作时要求二次确认这些规则可以用代理层工具如 ProxySQL、PgBouncer 配合自定义插件实现也可以用数据库自身的触发器。触发器的好处是不依赖外部组件坏处是会增加数据库负担而且规则修改需要改表结构。7.2 影子表让 Agent 先在副本上跑一遍对于风险较高的 Agent 任务可以先用影子表模式Agent 的写操作先作用到一个和正式表结构相同的影子表上由另一个进程对比影子表和正式表的差异确认无误后再把变更应用到正式表。这种模式相当于给 Agent 加了一个预览步骤。缺点是实现复杂度高需要维护影子表和正式表的同步逻辑。但对于金融、医疗等对数据准确性要求极高的场景这个投入是值得的。7.3 把 Agent 的操作纳入 GitOps 流程更进一步可以把 Agent 的数据库操作也纳入 GitOps 体系。Agent 不直接连数据库而是生成一个变更提案类似 Pull Request提案里包含它打算执行的 SQL 和预期影响。这个提案经过自动校验和人工审核后由 CI 系统执行。这样做的好处是每一次数据变更都有完整的审批链路和版本记录完全符合数据库学 Git的理念。代价是实时性会下降不适合需要秒级响应的场景。但对于批量数据处理、报表生成这类可以容忍分钟级延迟的任务GitOps 流程能提供最高级别的安全保障。8. 一些个人体会我在过去两年里从完全信任 Agent 自动写库到给 Agent 加上层层约束中间交了不少学费。最大的体会是Agent 的能力越强对它写操作的约束就应该越严。这不是不信任技术而是承认一个事实——任何自动化系统在复杂生产环境中都可能遇到训练时没见过的边界情况。数据库学 Git 这个方向本质上是在给数据加上时间维度。有了这个维度你才能回答数据是怎么变成现在这样的以及怎么让它变回去。对于正在做 Agent 开发的团队我的建议是在 Agent 第一次连上生产库之前就把版本控制和回滚方案准备好。不要等到出了事故再补那时候补的成本会高得多。另外工具选型上不要追求一步到位。可以从最简单的方案开始先开启数据库的 binlog 或 WAL 归档确保有基础的回放能力再逐步加上变更流捕获和行级版本记录。每加一层都做一次回滚演练确认这一层真的能工作。这样循序渐进比一次性上一套复杂系统要稳妥得多。

相关新闻

STM32裸机人脸识别:无malloc、零拷贝、16KB内存全栈实现

STM32裸机人脸识别:无malloc、零拷贝、16KB内存全栈实现

简介:本资源是一套基于STM32 Cortex-M4平台的人脸识别嵌入式开发实战工程,面向嵌入式初学者、单片机开发者及计算机视觉入门者,解决在资源受限MCU上实现图像采集、人脸检测与识别的核心技术难点。压缩包含174个文件,主体为72个C源…

2026/10/17 7:35:11 阅读更多 →
知识库为什么搜不到答案:多向量检索与 Late Interaction

知识库为什么搜不到答案:多向量检索与 Late Interaction

文章目录1 -> 引言2 -> 一段文字压缩成一个向量,会发生什么3 -> Late Interaction 把一部分匹配工作留到查询时4 -> 用几行代码看见“平均后信息丢失”5 -> 检索更细,代价主要落在索引和评分6 -> 怎样确认它真的改善了知识库1 -> 引…

2026/10/17 7:34:11 阅读更多 →
深入理解 DOM 节点树:从结构到实战

深入理解 DOM 节点树:从结构到实战

1. 引言DOM(Document Object Model,文档对象模型)是浏览器将 HTML 文档解析后生成的一棵节点树,它把页面中的每一个元素、文本、属性都抽象为节点,并通过树形结构组织起来。理解 DOM 节点树,是掌握 JavaScr…

2026/10/17 7:34:11 阅读更多 →

最新新闻

2026技术暗流:AI Coding、智能体、开源与具身智能的工程落地

2026技术暗流:AI Coding、智能体、开源与具身智能的工程落地

1. 从一份 AI 日报里,我看到了 2026 年技术圈真正的暗流每天早上花二十分钟扫一遍 AI 日报,是我保持了两年多的习惯。2026 年 9 月 12 日这一期,表面上看还是那些熟悉的面孔——AI Coding、智能体、开源、具身智能,四个词翻来覆去…

2026/10/17 8:12:18 阅读更多 →
VC MFC 集成 QRDECODE:二维码识别从配置到调优实战

VC MFC 集成 QRDECODE:二维码识别从配置到调优实战

简介:这是一份面向Windows平台C开发者的二维码识别与解析工程源码,基于VC与MFC框架,借助开源ZBar库完成QR Code等二维码的解码,适合需要为桌面程序添加扫码能力的初中级开发者参考。压缩包共23个文件,约34KB&#xff0…

2026/10/17 8:12:18 阅读更多 →
图像空间推理:让AI在视觉特征中直接思考,突破文本思维链瓶颈

图像空间推理:让AI在视觉特征中直接思考,突破文本思维链瓶颈

1. 项目概述与核心问题这个项目其实只讲了一件事:让AI在思考问题时不再把所有信息都转成文字再处理,而是直接在图像层面进行推理。简单点说,以前的大模型是“看着图,在脑子里造句,再从句子里找答案”,而这次…

2026/10/17 8:12:18 阅读更多 →
OpenResearch实践指南:Claude Code、Codex、OpenCode、Cursor安装配置与协同工作流

OpenResearch实践指南:Claude Code、Codex、OpenCode、Cursor安装配置与协同工作流

1. 当"OpenResearch"这个词出现在我视野里时,我在想什么第一次看到"OpenResearch"这个项目名,配合着Claude Code、Codex、OpenCode、Cursor这一串热词,我的直觉是:这大概率不是一个单纯的学术研究工具&#x…

2026/10/17 8:12:18 阅读更多 →
OpenResearch多工具组合指南:Claude Code、Codex、OpenCode与Cursor实战

OpenResearch多工具组合指南:Claude Code、Codex、OpenCode与Cursor实战

1. 从“OpenResearch”这个标题说起:它到底想解决什么问题第一次看到“OpenResearch”这个标题,加上旁边一串 Claude Code、Codex、OpenCode、Cursor 的热搜词,我大概能猜到它想干的事:把当下最火的几个 AI 编程工具串起来&#x…

2026/10/17 8:12:18 阅读更多 →
以太网实战排障:物理层信号与MAC帧的工程真相

以太网实战排障:物理层信号与MAC帧的工程真相

1. 为什么今天还要从零讲透以太网——不是教科书,而是现场排障手册很多人看到“以太网基础知识”这几个字,第一反应是:这不就是课本第一章?配个双绞线图、背个OSI七层模型、默写MAC地址格式就完事了?我带过三届网络工程…

2026/10/17 8:11:18 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →