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),仅供参考