多智能体系统核心循环设计:从Loop Engineering到稳定协作架构
刚开始接触多智能体系统的时候我在网上搜来搜去看各种论文和开源项目总会撞见一个有点玄乎的词Loop Engineering。当时没太当回事觉得不就是让几个AI角色来回对话嘛搞个for循环不就行了。真等自己把一个带三五个协作节点的系统推到线上才发现问题全出在循环上智能体之间来回对话容易空转任务拆下去后结果收不回来还有莫名其妙的重复调用、上下文越积越长、费用越烧越离谱。这时候再回头理解Loop Engineering才发现它不是什么花哨的新框架而是一整套把AI来回协作这件事从不可控的对话流变成可设计、可观测、可收敛的工程方法论。这篇文章我想把这些实际踩坑后沉淀下来的经验整理出来重点聊聊多智能体协作架构里到底有哪些核心循环、每一层循环怎么设计才能既灵活又稳定以及我实测下来觉得最值得抄作业的工程化实践。不管你是刚打算用多个大模型智能体做复杂任务编排还是已经跑了几个原型但总觉得系统不够可控这篇内容应该都能给你一些可落地的参考。我会用我自己做过的一个代码审查与重构场景作为贯穿全文的例子这样每个设计决策都能对应到真实代码而不是悬在理论层面。1. 多智能体系统的循环到底指的是什么1.1 从单次调用到循环协作的思维转变我们先用最直白的视角看问题。传统上调用一个LLM就是一次推理你给一段Prompt它给你一段回复整个过程是一锤子买卖模型内部有没有多轮思考对调用方来说是个黑盒。这种模式的问题在于一次生成的质量天花板固定在那里而且没有纠错机会。你问它一个问题它答得不对你得自己发现问题、改Prompt、再调一次控制权完全在人手里。多智能体系统把这个流程倒过来了。系统里同时存在多个具备不同角色定义的智能体比如一个负责拆解需求一个负责写代码一个负责审查代码。它们之间通过消息互相协作一轮不行就再来一轮审查者发现问题就反馈给写作者写作者修改后再交回来。这个再来一轮的机制就是最直观的Loop。Loop Engineering要解决的正是怎么让这种多轮协作既不是无脑重复也不是无休止的空转而是每个循环都能确确实实逼近目标。我在实际项目中有一个很深的感受单智能体像是一个人埋头干活能力强但容易钻牛角尖多智能体像是一个小团队开会人多想法多但主持人要是控制不住节奏会议能开到天荒地老。Loop Engineering在团队协作这个比喻里相当于会议规则、议程管理、决策机制和散会标准的总和。它不是某个具体算法而是贯穿系统设计始终的一套约束。1.2 三层循环模型任务循环、对话循环、反思循环在我做的代码审查系统里我把循环拆成了三个层级各自频率不同、控制方式不同但共同构成整个系统的主干。第一层是任务级循环对应的是执行-验证-重试这个宏观闭环。系统接到一个重构需求后拆解出子任务分发给对应智能体然后等待它们的结果统一汇总。如果某个子任务的结果没有通过校验整个任务要么重跑要么带着反馈进入修正流程。这层循环关心的是正确性和完成度通常以任务为单位控制次数。第二层是对话级循环发生在具体的两个智能体之间。比如写代码的智能体和审查代码的智能体它们会围绕某个Issue来回讨论。写代码的提出一个方案审查的指出问题写代码的修改后再交回来。这层循环频率最高、最容易失控也是最需要设置明确的终止条件和轮次上限的地方。我在实践中发现对话层循环如果不加约束经常出现改A - 引入B问题 - 改B - 引入C问题 - 回到A这种震荡所以一定要设置独立的收敛判断。第三层是反思级循环也就是智能体对自己的输出或者整个系统的阶段性产出做复盘。这个循环在不同系统里叫法不同有的叫Self-Refine有的叫Critic。它不产生新的执行动作而是产出改进意见喂给下一轮任务级或对话级循环。反思循环是提升系统质量上限的关键但也是成本最容易被忽视的地方后面我会专门讲怎么控制它的调用频率。这三层循环不是嵌套那么机械执行时往往是交错的。一个任务循环里包含若干对话循环对话循环中某个节点触发了一次反思反思的意见又作用于任务循环的下一步。Loop Engineering的工程化本质就是把这三个层级的循环分别设计成明确的数据结构、控制逻辑和观察指标而不是任由它们在Prompt的模糊指示里自然发生。2. 协作架构的核心设计模式与取舍2.1 编排者-工作者模式最适合落地的起点多智能体协作架构的拓扑结构有很多种最常见的是中心化编排模式也就是有一个主控智能体负责任务分解和结果汇总其他智能体作为工作者接收指令、执行并返回结果。另一种是对等协商模式智能体之间可以直接通信没有强制的中控节点适合高度开放的讨论场景但控制复杂度高得多。我在项目里强烈建议第一次做多智能体的团队从编排者-工作者模式起步。原因特别简单这种模式下的循环边界最清晰出问题时最容易定位。编排者负责维护全局状态每个工作者只跟编排者通信不互相直连。这样任务分发给谁、发了几次、结果收回来没有都天然有日志可查。对等协商模式听起来更酷但智能体之间两两连接的话消息路径组合爆炸排查一个问题可能要翻十几个会话链。从工程角度说编排者模式把复杂度集中在一个节点上这个节点本身不负责复杂的领域推理只负责流程控制所以可以用相对工程化的代码把它写得很稳。我甚至见过一种做法编排者本身不调用大模型只写规则代码来路由和判断只有工作者才真正调用LLM。这种设计进一步降低了系统的不确定性我觉得值得借鉴。2.2 任务分解的粒度与依赖关系处理任务分解是编排者最核心的工作但分解粒度这件事非常微妙。拆得太粗每个工作者拿到的还是一个大而全的任务它的输出质量和直接问主模型没区别拆得太细子任务之间的交接成本大于收益而且每一层的上下文传递都可能丢信息。我常用的判断标准是一个智能体在一个循环内能否聚焦完成。比如代码审查系统里我不会让一个智能体既审查架构问题又审查代码风格又找安全漏洞而是把审查职责拆成三个独立智能体架构审查、静态缺陷审查、安全审查。每个智能体只关注一个维度输出格式统一这样结果回收后进行比较和汇总时自然能形成多角度视图。依赖关系处理是另一个关键点。任务之间如果没有依赖可以并行分发提高吞吐量。如果有依赖比如重构方案确定后才能动手改代码编排者就必须把任务序列化前一个完成后才能发下一个。我在代码实现里会为每个子任务显式声明depends_on字段由编排者根据依赖图决定发任务的批次。这里有个工程细节值得记住不要让智能体自己在Prompt里理解依赖关系要让编排者在代码层面强制执行顺序否则一定会出现某个智能体拿到不完整信息就开跑的场面。2.3 结果汇聚与冲突仲裁多个智能体各自产出了结果接下来怎么合成一个最终答案是架构里另一个容易出问题的环节。结果汇聚通常有几种模式简单拼接、投票表决、层级仲裁、以及让一个独立的汇总智能体综合所有结果生成最终输出。我对简单拼接和投票表决都保留意见。简单拼接适合信息互补型任务比如不同智能体分别查不同资料拼起来就是完整答复但代码审查这种场景里不同审查者可能对同一个问题给出互相矛盾的意见直接拼接会让人无所适从。投票表决在小规模智能体群体里意义不大三五个智能体投来投去多数方未必是对的。我实际用的是层级仲裁加汇总智能体。每个审查智能体返回结构化的问题列表每条问题带严重级别和建议修复方案。汇总智能体负责剔除重复项、按严重级别排序并给每个问题生成一个综合性的修复建议。最关键的是汇总智能体必须能看到所有审查者的原始输出而不是只看经过压缩的摘要因为摘要过程本身就是信息丢失的过程。为了控制上下文长度我会让每个审查者限制输出条数上限比如最多返回10条问题保证汇总阶段的输入可控。3. 从零搭建一个多智能体代码审查系统3.1 场景定义与角色分工前面聊了那么多抽象的设计模式我们来点具体的。我拿自己实际做过的一个多智能体协作代码审查与重构系统做例子完整说说搭建过程。这个场景很有代表性因为它天然需要多角度审视同一份代码非常适合多智能体协作而且结果的好坏比较容易被验证。我先定义了四个角色。项目经理智能体本质就是编排者负责接收用户需求、拆解任务、调度其他智能体。架构审查智能体负责分析代码的结构设计、模块耦合度、可扩展性。缺陷审查智能体负责查找潜在的逻辑错误、边界条件、资源泄漏问题。安全审查智能体专门关注注入风险、敏感信息硬编码、依赖漏洞。这里有一个经验角色定义越窄效果越好。我一开始曾试图让一个智能体同时承担架构和缺陷审查结果它在输出里经常把两者混在一起后来拆开之后每个智能体的输出都明显更聚焦。角色定义要用System Prompt固定下来并且明确告诉它你只负责XX不要输出其他方面的内容否则智能体会忍不住越界。3.2 核心循环的代码实现框架下面这段是我精简过后的编排者核心逻辑用Python伪代码展示重点看循环控制的部分。它不是完整可运行的代码但反应了我在真实项目里是怎么组织循环的。class Orchestrator: def __init__(self, llm_client, max_task_rounds3, max_debate_rounds5): self.llm llm_client self.max_task_rounds max_task_rounds # 任务级循环上限 self.max_debate_rounds max_debate_rounds # 对话级循环上限 self.workers { architecture: ArchitectReviewer(llm_client), defect: DefectReviewer(llm_client), security: SecurityReviewer(llm_client), } def run(self, user_request: str, code_snapshot: str) - ReviewReport: task_round 0 context {request: user_request, code: code_snapshot} while task_round self.max_task_rounds: task_round 1 # 1. 并行分发给三个审查智能体 results self._dispatch_reviews(context) # 2. 汇总智能体合并结果 merged self._merge_results(results) # 3. 判断是否需要进入修正循环 if self._is_acceptable(merged): return merged # 4. 如果存在严重问题触发修正智能体 fix_feedback self._generate_fix_feedback(merged) context[prev_feedback] fix_feedback context[code] self._apply_fix(context[code], fix_feedback) return self._degrade_gracefully(context)这段代码里最关键的就是那行部署在循环边界的计数器。每进一次while循环task_round就加1一旦达到max_task_rounds就不再继续进入降级逻辑。很多新手做多智能体系统时把终止条件写在Prompt里让模型自己判断比如在Prompt里写如果问题都解决了就停止这个基本是无效的模型对是否解决的判断本身就不可靠。正确做法是让代码层面对循环做硬限制。我通常把任务级循环上限设为3对话级上限设为5。为什么是这两个数字这是成本和成功率之间的一个折中。根据我的实测大多数代码审查场景在3轮任务循环内都能收敛超过3轮还解决不了的问题大概率是任务拆解本身出了问题这时候继续重试只是烧钱不如降级返回当前最优结果并附带警告。3.3 终止条件、超时与降级策略的设计循环工程里最容易被忽视的是退出路径也就是系统如何体面地结束。很多多智能体demo跑起来很热闹但你要问它什么时候停止它自己也说不清。我在设计阶段就明确画了三条退出路径正常收敛、达到轮次上限退出、异常超时退出。正常收敛依赖于验证器。每个循环结束后系统会对结果跑一次确定性校验这个校验不依赖LLM而是写规则代码。比如检查返回的JSON格式是否合法、必填字段是否都存在、问题列表是否为空。只有校验通过的循环结果才被允许作为最终输出。依赖LLM判断是不是没问题了太虚了规则校验更靠得住。达到轮次上限退出时系统不能直接抛一个失败给用户而是把当前已获得的、尽管不完美的结果整理输出同时明确标注系统在最大重试轮次内未完全收敛以下结果仅供参考。这里有一个降级策略的细节即使最终结果不完美也要让用户能看到每一轮反馈的轨迹这样至少可以人工接手。超时退出则依赖异步任务框架每个子任务设置比如60秒的超时时间超时后把该智能体的本次结果视为空由汇总层标记为缺失。缺失的审查意见总比整个系统卡死要好。4. 工程化最佳实践与踩坑复盘4.1 可观测性多智能体系统的仪表盘多智能体系统是个典型的分布式状态系统但它比普通的微服务更难排查因为每个节点的行为不是完全确定的同一个输入跑两次可能得到不同结果。所以可观测性建设不能等系统上线后再补必须从第一行代码开始就考虑。我要求系统里每一个环节都输出结构化的事件日志。一条事件日志至少包含事件ID、对应的智能体ID、消息的方向发送还是接收、消息摘要、耗时、Token消耗、循环轮次。这些日志汇聚后用来回答几类高频问题这个任务到底调用了多少次LLM哪一轮循环产生了最大的成本某个智能体是不是在反复输出同样的意见如果没有结构化日志这些问题你一个都答不上来。我还会给每个任务生成一份会话轨迹报告把完整的协作过程渲染成类似聊天记录的格式这个对调试非常有用。有一次我发现某个审查智能体在第三轮和第五轮给出了完全相同的输出直接看原始日志很难注意到但把轨迹渲染出来后一目了然。后来我在编排逻辑里加了重复检测如果某个智能体连续两轮输出相似度超过阈值就强行终止对话循环并提示上层。这个机制在对话震荡场景里特别管用。4.2 成本与延迟控制的五个实用手段多智能体系统的成本比单次LLM调用高一个数量级这是很多人没有心理准备的地方。我做一个代码审查任务平均要消耗十几万Token。所以成本控制不是锦上添花而是系统能不能活下去的前提。我整理了自己实际在用的几个控制手段。第一共享上下文压缩。每个子任务分发给工作者之前编排者会把与该任务相关的上下文做一次摘要而不是把全部历史对话一股脑塞进去。我会在Prompt里明确要求忽略与本次任务无关的过往内容减少重复阅读。第二并行调用。三个审查智能体之间没有依赖我用asyncio并发执行整个审查阶段的延迟只等于最慢的一个智能体的耗时而不是三者之和。第三动态调整模型选择。架构审查和缺陷审查用强模型安全审查可以先让一个轻量级模型做初筛只有初筛命中高风险特征时才升级到强模型复核。第四结果长度限制。每个智能体返回的结果都限制条数和每条的长度评审意见超过十条的部分直接丢弃避免汇总层的输入膨胀。第五缓存落地。同一份代码片段在这一轮审查过下一轮如果没有变化就直接复用结果节省重跑费用。这套手段用下来我的系统单任务成本从最初的平均80元降到了35元左右而且质量没有明显下降。我特别建议你在项目初期就把Token消耗埋点做起来不然账单出来的时候真的很痛。4.3 高频问题排查速查表最后把我实际运行中遇到的高频问题整理成了一张速查表按症状、原因和解决办法分类。这张表里的每一条都是我或者身边朋友真实踩过的坑。症状典型原因解决办法系统陷入无限循环费用飙升对话层缺少轮次硬上限只靠Prompt暗示模型适可而止在编排代码中设置max_debate_rounds达到即终止并回收结果某个智能体反复输出相同意见上下文里积累了太多雷同反馈模型找不到新角度加入重复检测连续两轮高相似度时触发终止并注入尝试不同思路指令汇总结果信息丢失严重汇总智能体只看压缩摘要丢失了原始细节让汇总智能体读取每个工作者的原始输出同时限制原始输出条数控制成本任务明明很复杂却早早退出任务级重试上限设得太小比如1轮根据历史数据调整max_task_rounds同时对不同复杂度任务动态设置上限子任务结果格式五花八门无法解析Prompt里对输出格式约束不硬模型自由发挥使用JSON Schema约束输出格式并在代码侧做格式校验不合法则直接重试一次某个工作者调用超时导致全任务卡死没有为子任务设置独立超时机制改用异步框架为每个子任务单独设置超时时间超时后按缺失结果处理这张表之外还有一个我特别想强调的经验多智能体系统的稳定性不是靠把Prompt写得更详细实现的而是靠代码层面的结构约束。Prompt是给模型划定行为边界的约束是靠代码做的。两者配合系统才能既灵活又可控。我见过太多团队在一个智能体的Prompt上反复打磨几十个版本却忽略了编排层的状态管理结果整个系统照样乱成一锅粥。从我个人的操作体会来看Loop Engineering教会我最重要的一件事是把智能体协作当作一个真实的分布式系统来对待而不是一群聊天机器人在群里互相艾特。把循环显式化、把边界代码化、把过程可观测化这三件事做好之后多智能体系统才真正从demo走向了可用。现在我在设计任何新的多智能体项目时都会先画一遍循环图和退出条件清单这个习惯帮我避免掉了至少一半的线上事故也希望这篇文章里的思路能帮你在自己的项目里少走几条弯路。

相关新闻

多人多AI协同系统架构:代理代为交互与五层设计实践

多人多AI协同系统架构:代理代为交互与五层设计实践

最近在帮团队搭一套多人多AI协同系统,第一道坎儿不是模型能力,而是"到底由谁来做交互"。我们最初的产品形态很简单:每个人一个AI代理助手,大家在同一套工作流里各干各的。但跑了一周之后就发现问题了——代理和代理之间…

2026/10/15 12:35:03 阅读更多 →
多Agent协同系统架构:代理中介层与消息总线设计实践

多Agent协同系统架构:代理中介层与消息总线设计实践

1. 为什么非要多一个“代理代为交互”的中间层1.1 市面主流Agent框架的“单用户假设”去年我们内部准备把一个多Agent协作平台从Demo推向生产时,卡了整整两周,问题不在模型效果,而在架构。任务本身听起来很简单:一个项目组五个人&…

2026/10/15 12:35:03 阅读更多 →
Python分布式爬虫实现高效社交舆情监测系统

Python分布式爬虫实现高效社交舆情监测系统

1. 项目背景与核心价值社交舆情监测已经成为企业市场分析、品牌管理和公关决策的重要工具。传统人工监测方式效率低下且容易遗漏关键信息,而商业舆情系统往往价格昂贵且定制化程度低。这个Python爬虫项目正是为了解决这些痛点而生。MediaCrawler是一个基于Python的分…

2026/10/15 12:35:03 阅读更多 →

最新新闻

Spring Boot 部署实践:jar、war、Docker与Compose

Spring Boot 部署实践:jar、war、Docker与Compose

部署这事,看起来简单,实际坑不少。刚学 Spring Boot 的时候,我都是本地mvn spring-boot:run跑起来就完事,直到有一次要把一个“某订单服务”项目丢到测试服务器上给同事联调,才真正体会到“跑起来”和“部署好”是两码…

2026/10/15 13:21:53 阅读更多 →
python爬虫使用正则爬取网站的实现

python爬虫使用正则爬取网站的实现

前言 用正则表达式从网页里提取内容,是很多人接触爬虫的第一步:拿到 HTML 源码,用 re.findall 把链接、标题、价格抠出来。这条路学习成本低,但也最容易被用歪——既容易写出脆弱的模式,也容易忽视抓取的分寸。 本文要…

2026/10/15 13:21:53 阅读更多 →
图像超分辨入门:三种经典插值算法原理与实战对比

图像超分辨入门:三种经典插值算法原理与实战对比

从大一开始接触数字图像处理,我就发现“图像超分辨”这个名字有点劝退。很多人一上来就把它想成需要显卡、需要庞大训练集、需要跑上几天才能完成的深度学习任务。但实际上,在深度学习普及之前,甚至到现在很多工程场景里,基于插值…

2026/10/15 13:21:53 阅读更多 →
教育专用大模型:从问答工具到教学认知协作者

教育专用大模型:从问答工具到教学认知协作者

简介:本资源是之江实验室联合中国教育科学研究院发布的《重构教育图景:教育专用大模型研究报告(简版)》,面向教育技术研究者、AI教育产品开发者、K12学校信息化负责人及教育政策制定者,系统回应教育大模型‘…

2026/10/15 13:21:53 阅读更多 →
FFmpeg音频重采样与AAC编码优化实战指南

FFmpeg音频重采样与AAC编码优化实战指南

1. 音频重采样技术背景解析在数字音频处理领域,重采样(Resampling)是一项基础但至关重要的技术。简单来说,它就像把不同尺寸的图片进行缩放转换,只不过我们处理的对象是音频数据。当我们需要将音频从48kHz降到44.1kHz&…

2026/10/15 13:21:52 阅读更多 →
贪心算法实战:Prim最小生成树从原理到堆优化

贪心算法实战:Prim最小生成树从原理到堆优化

1. 从一个真实场景说起:为什么我们需要最小生成树很多人第一次接触最小生成树这个概念,是在算法课上听老师念PPT,什么“带权无向连通图”“边权和最小”“无环子图”,听完一头雾水,考试前背个模板就过去了。但如果你真…

2026/10/15 13:20:52 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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