openJiuwen DeepSearch 大纲模式路由:从 system.md 规则到 hybrid 路由的源码级解析
人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载导读大纲模式路由outline mode router是 openJiuwen DeepSearch 中决定一次研究任务的大纲应如何组织的关键决策点它判断查询是应该走并行大纲各章节独立采集与写作、最后统一汇总还是走依赖驱动大纲后置章节必须消费前置章节产出的结论、定义与证据。本文以 outline_mode_router/system.md 这一系统提示词为骨架逐条拆解其判定规则并结合 outline_mode_router.py、config.py 与单元测试讲清该提示词如何被加载、LLM 输出如何被严格解析、以及 hybrid 模式下如何通过execution_method配置接入整体研究流程。读完本文你将掌握该路由器的全部判定标准、源码调用链、兜底机制与可执行配置方式。一、为什么需要大纲模式路由并行与依赖驱动两种大纲的差异在 openJiuwen DeepSearch 的研究工作流中报告大纲的生成方式直接影响后续信息采集、章节写作与推理链溯源的执行效率与正确性。仓库将大纲执行方式抽象为三种模式见 config/method.py 中的ExecutionMethod枚举模式值含义适用场景parallel并行工作流执行各章节独立采集、独立写作章节之间无强依赖可并行展开dependency_driving依赖驱动工作流执行章节按依赖关系串行推进后置章节依赖前置章节的推理产物hybrid混合大纲路由模式由意图识别节点调用 LLM 选择普通大纲或依赖驱动大纲需要由 LLM 依据查询内容动态决策hybrid本身不是最终执行方式而是一个入口决策模式它把该走哪条路的判断交给 LLM而承载这份判断的正是 outline_mode_router/system.md 这份系统提示词。二、system.md 的角色定位与输出契约2.1 提示词的加载方式从源码看该提示词通过统一的提示词渲染框架被加载。message_builder.py 中的build_prompt_messages(prompt_name, context)以提示词目录名为参数会渲染{prompt_name}/system.md作为 system 消息并渲染{prompt_name}/user.md作为 user 消息。对 outline_mode_router 而言system 模板outline_mode_router/system.md纯静态文本无运行时变量因此被_assert_static_template_tree校验通过user 模板outline_mode_router/user.md内容仅一个占位符{{ question }}即原始用户查询。两者组合后形成一次标准 LLM 调用system 侧提供完整判定规则user 侧携带本次查询原文。2.2 严格的输出契约system.md 的第一部分明确规定了输出格式Respond with exactly one label: parallel or dependency_driving. No spaces, punctuation, explanations, markdown, or extra text.也就是说路由器 LLM 的合法输出只有两个字符串parallel或dependency_driving不允许出现空格、标点、解释、Markdown 或任何额外文本。这一契约在源码层被严格执行outline_mode_router.py 中的parse_outline_execution_method对输出先做strip()再校验其是否精确命中VALID_OUTLINE_METHODS集合{parallel, dependency_driving}任何带标点、带多余文字的输出都会被判为非法并触发兜底。单元测试 test_outline_mode_router.py 对该契约做了参数化验证parallel、\nparallel\n合法parallel.、choose parallel、dependency均被判定为非法返回None。这正是提示词与解析器双向强约束的体现。2.3 领域约束的定位不作为唯一判据system.md 还有一条容易被忽略的规则Source/domain constraints should not alone determine the outline mode; still treat them as task constraints when identifying whether chapter dependencies are required.这明确规定了来源/领域约束如仅限某个垂直领域、某类信源不能单独决定大纲模式。也就是说不能因为查询涉及某个领域就机械地选择 dependency_driving领域约束仍然作为任务约束存在只在是否真的存在章节间依赖的判断中发挥作用。这一规则防止了路由器被领域先验误导保证决策始终基于章节依赖关系本身。三、默认选择 parallel何时走并行大纲system.md 规定默认情况下Choose parallel by default应选择parallel并给出四类典型场景。这些场景的共同特征可以概括为报告可以拆分为基本相互独立的章节后置内容不需要强依赖前置内容的推理产物。3.1 查询类型覆盖性、描述性与综述类任务以下查询主题优先选择parallelcoverage覆盖面梳理、description描述、comparison对比、survey调研literature review文献综述、status summary现状总结market or product profile市场/产品画像、policy or legal overview政策/法规概述historical background历史背景、technical review技术评审impact review影响回顾、challenge and solution review挑战与方案回顾、broad research宽泛研究。这类查询的典型特征是广覆盖、多维度、可并行枚举每个维度如技术、市场、政策、历史都可以独立完成采集与写作。3.2 信息呈现形态表格、时间线、综述与对比当报告的主体信息呈现形态是以下任一种时默认并行Tables表格、timelines时间线、literature summaries文献汇总、performance comparisons性能对比、case descriptions案例描述、final conclusions最终结论——这些内容主要呈现可以独立采集的信息最终的 synthesis综合、comparison对比、trend趋势、challenge挑战、implication影响、conclusion结论——可以通过拼装各自独立研究好的章节完成而不是必须串行推导。3.3 结构要素仅用于组织报告的定义与背景当 introductory definitions开篇定义、background背景或 category headings分类标题仅用于组织报告结构而不作为后续推理必须复用的产出时选择parallel。这是判断的关键分水岭背景章节如果只是摆在那里供阅读就是并行结构如果后续章节必须消费这些背景定义的结论就构成依赖。四、选择 dependency_driving何时走依赖驱动大纲与 parallel 相对system.md 给出了选择dependency_driving的充分条件其核心是后置章节明确需要前置章节的推理产物。4.1 存在真实的产物依赖链当后置章节明显需要以下前置产物之一时应选择依赖驱动conclusions结论、frameworks框架、definitions定义、evidence证据tables表格、timelines时间线、classifications分类、data summaries数据汇总model results模型结果、entity lists实体清单、case lists案例清单、reasoning products推理产物。也就是说前置章节产出的不是背景资料而是后续章节推理必须引用的输入。研究应当从前置条件推进到综合、判断、建议或行动规划progress from prerequisites to synthesis, judgment, recommendation, or action planning。4.2 结构化推理模式当查询呈现以下过程式结构时依赖驱动比并行更合适staged reasoning分阶段推理diagnosis-to-solution从诊断到方案problem-to-mechanism从问题到机制framework-to-application从框架到应用scenario-to-decision从场景到决策evidence-to-recommendation从证据到建议data-to-relationship从数据到关系。这类查询本质上是先建立基础再基于基础推出上层结论章节之间存在天然的先后消费关系。4.3 识别—分类/评估的两阶段查询一个非常典型的依赖驱动模式是两阶段查询查询先要求识别案例、项目、实体、组件、指标、变量、机制、方法、目标或治疗方案identify随后再要求基于这些识别结果进行分类、解释、对比、评估或推荐categorize/explain/compare/evaluate/recommend。第二阶段的产出必须消费第一阶段的识别清单构成明确依赖。4.4 单一事件/声明的深度解读当后置章节必须解释某个具体事件、声明、政策变化、矛盾、理论、概念或案例而解释的依据来自更早章节建立的时间线、背景、定义、争论或概念框架时选择依赖驱动。例如先梳理某政策演变时间线再解读最新一次政策调整的含义后者必须消费前者。4.5 定量/统计/因果/模型对比章节当定量、统计、因果、相关性或模型对比类章节依赖更早章节的变量定义、数据汇总、模型配置或证据表时应选择依赖驱动。这些章节的严谨性直接取决于前置数据的定义与口径不能并行拼装。五、反模式清单不要因为这些原因选择 dependency_drivingsystem.md 专门列出了不要因为以下原因选择 dependency_driving的约束这些规则对实际部署调优至关重要能显著减少误路由报告很长、很详细、很学术或很复杂——长度与复杂度和依赖关系没有必然联系章节有自然的阅读顺序——读起来顺不等于后文必须消费前文的推理产物查询包含 analysis、synthesis、impact、challenge、solution、trend、implication、comparison、conclusion 等词语——这些词汇只是任务属性不是依赖关系的证据某张表重复或汇总了前面章节已请求的条目——这种重复仅为可读性服务不构成下游消费技术、政策、历史、人物、市场、法律或文献综述用分类作为组织结构——分类标题只是组织工具若后置章节并不消费前置章节的输出仍应走并行。最后system.md 给出明确的兜底原则If unsure, choose parallel不确定时选择并行。这是因为并行工作流的成本更低、失败风险更小误判为并行通常只损失少量效率而误判为依赖驱动则可能引入不必要的串行等待与前置失败传导。六、源码级实现router 的完整调用链6.1 入口仅 hybrid 模式触发 LLM 路由路由器并非每次研究都调用而是由 main_graph_nodes.py 中的IntentRecognitionNode._resolve_outline_execution_method决定何时调用execution_method current_inputs.get(execution_method) or ExecutionMethod.PARALLEL.value if execution_method ExecutionMethod.DEPENDENCY_DRIVING.value: selected_method ExecutionMethod.DEPENDENCY_DRIVING.value elif execution_method ExecutionMethod.HYBRID.value: selected_method await route_outline_execution_method( current_inputs.get(original_query) or , current_inputs.get(llm_model_name) or , ) else: selected_method ExecutionMethod.PARALLEL.value可见配置为dependency_driving时直接映射为依赖驱动配置为hybrid时才调用route_outline_execution_method让 LLM 决策其余情况含默认parallel直接映射为并行。决策结果写入全局状态search_context.outline_execution_method类型契约见 search_context.py该字段只允许、parallel、dependency_driving三个取值hybrid仅作为外部入口、不作为内部状态。6.2 路由函数与兜底机制outline_mode_router.py 的route_outline_execution_method(question, llm_model_name)实现了完整的调用—解析—兜底逻辑其失败路径设计体现了 fail-open 原则触发条件行为查询为空或全空白不调用 LLM直接返回parallelLLM 调用抛异常如 API 不可用记录 warning返回parallelLLM 输出无法精确解析为合法标签记录 warning含原始输出返回parallelLLM 输出parallel返回parallelLLM 输出dependency_driving返回dependency_driving调用细节上它通过build_prompt_messages(outline_mode_router, {question: q})构造消息以llm_typebasic、独立的agent_nameAgentLlmName.OUTLINE_MODE_ROUTER常量定义见 node_constants.py且不携带工具的方式调用 LLM保证该决策调用与主报告流程的 LLM 调用在统计与日志上可区分。6.3 下游消费大纲节点与编辑团队分流路由结果写入search_context.outline_execution_method后专业版OutlineNode依据该值选择普通大纲或依赖驱动大纲的 prompt/tool schema依赖驱动大纲工具dep_driving_generate_outline见 outliner.py大纲生成后parallel进入EditorTeamNodedependency_driving进入DependencyEditorTeamNode对应 workflow.py 中的DeepresearchDependencyAgent及其_build_research_dependency_workflow依赖驱动工作流。完整流程见仓库文档 research-workflow.md 的核心流程章节。七、配置方式如何启用 hybrid 路由在 openJiuwen DeepSearch 中execution_method是 config.py 中AgentConfig的一个字段配置项定义与说明如下execution_method: Literal[dependency_driving, parallel, hybrid] Field( defaultparallel, description( 执行方法 parallel并行工作流执行 dependency_driving依赖驱动工作流执行 hybrid混合大纲路由模式由意图识别节点调用LLM选择普通大纲或依赖驱动大纲。 ), )默认值parallel不额外调用路由器 LLM所有研究任务按并行大纲执行dependency_driving固定走依赖驱动大纲与依赖驱动编辑团队不调用路由器hybrid在意图识别节点额外调用一次大纲模式路由 LLM按 system.md 的规则动态决策本次查询走哪种大纲。从部署角度看hybrid适合查询类型多样、希望系统自动为每条查询选择最优大纲结构的通用场景对查询形态稳定、章节强依赖明确的业务直接固定dependency_driving反而更省一次 LLM 调用。注意report_typebrief时不消费outline_execution_method因此 hybrid 的入口路由结果只带来额外的入口决策调用Brief 支路后续流程不随模式变化见 research-workflow.md 数据契约章节。八、工程约束与测试保障8.1 提示词契约测试tests/algorithm/prompts/test_deepresearch_prompt_contracts.py 将outline_mode_router声明为依赖上下文变量question的提示词模板确保 system.md 为纯静态模板不含运行时变量、user.md 只接收question变量。这保证了提示词在演进过程中不会意外引入渲染错误或上下文键冲突。8.2 路由行为测试tests/algorithm/query_understanding/test_outline_mode_router.py 覆盖了路由器的全部关键行为严格解析只有完整合法标签被接受parallel.、choose parallel、dependency全部拒绝空查询不调用 LLM、直接兜底 parallelLLM 返回parallel/dependency_driving时分别正确路由LLM 输出非法内容或抛出异常时兜底 parallel消息构造正确性首条为 system 消息内容不含{{ question }}占位符残留、不含Current Time之类模板注入内容第二条为{role: user, content: 用户问题}且以llm_typebasic、agent_nameOUTLINE_MODE_ROUTER、toolsNone调用。此外仓库开发文档 research-workflow.md 建议在修改 hybrid 大纲路由后补充运行uv run pytest tests/algorithm/query_understanding/test_outline_mode_router.py tests/node/test_agent_node.py tests/node/test_outline_interaction_node.py tests/workflow/test_create_agent.py tests/workflow/test_dependency_workflow.py tests/server/test_deepsearch_run.py进行回归验证。九、总结一份提示词背后的完整决策系统outline_mode_router/system.md看似只是一份几百字的系统提示词但在 openJiuwen DeepSearch 中它对应着一套完整的决策子系统判定标准以章节间是否存在真实的产物依赖为唯一核心判据并配套了详尽的正面信号两阶段查询、诊断到方案、数据到关系等与反模式清单长报告、阅读顺序、关键词命中均不构成依赖输出契约只允许parallel/dependency_driving两个精确标签由 outline_mode_router.py 的严格解析与全链路 fail-open 兜底保证鲁棒性流程接入仅hybrid配置触发 LLM 路由结果写入search_context.outline_execution_method进而分流到大纲节点与依赖驱动编辑团队质量保障提示词契约测试与路由行为测试双重覆盖确保提示词、解析器、状态契约三者始终一致。理解这份提示词就等于理解了 DeepSearch 如何在广覆盖并行综述与串行依赖深度推理之间为每条查询做出正确取舍——这是其研究报告生成能力在工程层面的关键支点之一。赞分享人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载相关推荐ThinkPHP 8路由系统深度解析从基础规则到高级域名路由ThinkPHP 8路由系统深度解析从基础规则到高级域名路由 ThinkPHP 8框架提供了功能强大且灵活的路由系统让开发者能够轻松构建RESTful APopenJiuwen DeepSearch Agent 与服务运行配置详解从 Pydantic 契约到工作流路由openJiuwen DeepSearch Agent 与服务运行配置详解从 Pydantic 契约到工作流路由 本文以 openJiuwen DeepSea人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体ASP.NET Core MVC路由配置从基础路由到高级路由模式的终极指南ASP.NET Core MVC路由配置从基础路由到高级路由模式的终极指南 想要构建高效、可维护的Web应用程序ASP.NET Core MVC路由配置就是后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MagicDraw UML 16.6实战指南:模型验证、代码生成与工作流整合

MagicDraw UML 16.6实战指南:模型验证、代码生成与工作流整合

简介:MagicDraw UML 16.6是一款面向软件架构师、系统设计师与开发团队的企业级UML建模工具,支持UML 2.5完整规范,可绘制用例图、类图、序列图等多种模型,并具备自动化代码生成与反向工程能力,适合在需求分析、系统设计…

2026/10/12 15:26:40 阅读更多 →
编译原理词法分析器实现:正则转DFA与Java实战解析

编译原理词法分析器实现:正则转DFA与Java实战解析

简介:一份面向北京邮电大学编译原理课程实验的词法分析器实现资料,适合正在学习编译器前端、需要完成Lexer设计与编码的本科生参考。资源围绕词法规则定义、输入字符流处理、符号栈管理与错误恢复等关键环节展开,对应编译器构造中的扫描器实现…

2026/10/12 15:26:40 阅读更多 →
豆瓣评论情感分析实战:SnowNLP与词云可视化

豆瓣评论情感分析实战:SnowNLP与词云可视化

简介:这份资源面向Python数据挖掘初学者与教学场景,围绕豆瓣《肖申克的救赎》评论文本,演示如何调用SnowNLP库完成情感分析,并配合词频统计与词云可视化,帮助读者理解中文文本情感倾向判定的基本流程。压缩包共10个文件…

2026/10/12 15:26:40 阅读更多 →

最新新闻

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

/* 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 18:56:01 阅读更多 →
POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

简介:本资源是一份面向数据科学与工业智能领域工程师的POD-LSTM时间序列预测实战指南,聚焦高维多变量场景下的降维建模与可解释预测难题,适用于风电功率、设备状态监测、环境治理等实际业务场景。资源以1个146KB的docx文档形式交付&#xff0…

2026/10/13 18:56:01 阅读更多 →
LiteLLM:大模型多平台协议桥接与标准化调用实战指南

LiteLLM:大模型多平台协议桥接与标准化调用实战指南

1. 一个被严重低估的“协议翻译官”:LiteLLM到底在解决什么真问题?很多人第一次看到LiteLLM这个名字,下意识会以为它是又一个大模型训练框架、推理加速库,或者某种新型开源大模型。我最初也这么想——直到在某次跨平台AI服务集成中…

2026/10/13 18:56:01 阅读更多 →
华为AI DevSpace编译星闪WS63 SDK全攻略

华为AI DevSpace编译星闪WS63 SDK全攻略

/* 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 18:56:01 阅读更多 →
Django+Vue小说推荐系统:从爬虫到可视化完整实现

Django+Vue小说推荐系统:从爬虫到可视化完整实现

看到标题里同时出现了“DjangoVue.js”“小说推荐系统”“小说可视化”“小说爬虫”“大数据毕业设计”这一串关键词,我基本能猜到你在选毕设题目时经历了什么——翻了一下午题目清单,要么是太简单拿不出手,要么是纯理论写到头秃,…

2026/10/13 18:56:01 阅读更多 →
静态时序分析实战:从时序弧到时钟约束的完整解读

静态时序分析实战:从时序弧到时钟约束的完整解读

说实话,静态时序分析这个系列写到第二篇,我想换个切入点。上一篇我们把STA是什么、为什么需要它、建立时间和保持时间的基本定义聊了一遍。但很多刚接触时序分析的同学,看完概念之后对着工具报出来的一屏时序报告,还是会有一种&qu…

2026/10/13 18:54:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →