openJiuwen DeepSearch 模板驱动大纲生成:outliner_template 系统提示词原理与实战

📅 发布时间:2026/10/12 20:53:39
openJiuwen DeepSearch 模板驱动大纲生成:outliner_template 系统提示词原理与实战
人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载导读本文深入剖析 openJiuwen DeepSearch深度搜索与研究框架中用于模板驱动研究报告大纲生成的outliner_template系统提示词说明它如何把用户提供的reference_report_template报告模板转译为结构化、可被下游多智能体采集与写作消费的Outline对象。读者将掌握该提示词的角色定位与触发条件、章节契约字段format_requirements/section_focus/focus_dimensions、仅保留两级标题并合并二级子标题的映射规则、核心章节标记语义以及从 Prompt 到函数工具调用再到Outline数据模型的完整代码链路与配置项。关联文档deepsearch/openjiuwen_deepsearch/algorithm/prompts/outliner_template/system.md配套用户消息模板见 outliner_template/user.md。一、角色定位严格基于给定模板的结构化大纲生成器outliner_template提示词将模型塑造成一名模板驱动的 Deep Research 大纲规划器Your responsibility is to generate a complete research report outline strictly based on the given template。它与普通outliner提示词的核心差异在于普通outliner依据用户问题、反馈、检索结果自主构思报告结构outliner_template则以用户提供的报告模板为绝对骨架只负责把模板实例化为可执行的大纲不改变模板结构大纲必须通过函数工具generate_outline返回且每个章节随后会被分派给专门的智能体团队进行深度数据采集each section of the outline will later be assigned to specialized agents for in-depth data collection。1.1 触发链路何时启用 outliner_template在框架主图的 OutlineNodemain_graph_nodes.py 中_select_prompt_name依据当前上下文选择提示词def _select_prompt_name(self, current_inputs: dict) - str: report_template current_inputs.get(report_template, ) outline_interaction_mode current_inputs.get(outline_interaction_mode, ) feedback current_inputs.get(user_feedback, ) if report_template and not outline_interaction_mode: return outliner_template # ... 其余分支outliner_interaction / outliner_user_revised / dep_driving_outliner / outliner可见启用条件非常明确search_context.report_template非空且当前不在大纲交互轮次。换言之只要用户上传/指定了报告模板且不是通过交互修订大纲首版大纲就由outliner_template生成。模板内容来自session.get_global_state(search_context.report_template)见 main_graph_nodes.py并被透传进提示词上下文。1.2 提示词输入变量契约根据 test_deepresearch_prompt_contracts.py 中的仓库级契约outliner_template的变量契约如下类别变量必填变量current_date、entry_search_results、language、original_query、questions、report_template、user_feedback可选变量current_date由 Builder 按需注入、original_query其中current_date被列入全局DATE_PROMPTS集合message_builder.py会在提示词声明该变量时自动注入当前日期。report_template在 user.md 中通过reference_report_template{{ report_template }}/reference_report_template标签注入这正是提示词正文反复强调的模板边界所在。二、核心原则全覆盖、深度要求与模板边界提示词在# Core Principles中定义了三条不可逾越的生成准则Comprehensive Coverage全面覆盖大纲必须同时包含主流视角与替代视角Mainstream alternative perspectives避免单一叙事Depth Requirement深度要求每个章节需要详细数据点 多源交叉验证Detailed data points multi-source verification杜绝浅尝辄止的章节模板边界Template Scope模板仅指当前用户消息中reference_report_template标签内的内容。原始请求original request、研究问题research question、反馈feedback与入口检索结果entry search results都是独立上下文不属于模板。最后一条边界尤为重要模型必须以用户问题/反馈提供的具体实体如某城市某公司该方法实例化模板中的泛化术语同时在生成的大纲中不得遗留未解析的占位符或悬空实体引用Do not leave generic placeholders or unresolved entity references in the generated outline when the user has supplied a concrete entity。这一约定与 prompt-template-system.md 中模板大纲只以reference_report_template标签内的内容为模板原始请求、反馈、检索结果属于独立上下文的描述完全一致。三、函数工具调用协议STRICTsections 必须是 JSON 数组outliner_template对输出形态施加了强制约束模型调用函数工具而非输出 JSON 文本且所有工具参数必须是结构化值其中sections必须是一个 JSON 对象数组绝不能是字符串也不得被引号包裹或字符串化。这背后是 outliner.py 中create_outline_tool(section_num)定义的generate_outline工具card ToolCard( idgenerate_outline, namegenerate_outline, descriptionGenerating outline for a Systematic Research Report., input_params{ type: object, properties: { language: { ... }, # 输出语言如 zh-CN / en-US title: { ... }, # 最终报告标题 thought: { ... }, # 生成大纲的详细思考 sections: { # JSON 对象数组 type: array, description: _section_list_description(section_num), items: { type: object, properties: { ... } }, }, }, required: [language, title, thought, sections], }, ) outline_tool LocalFunction(cardcard, funcgenerate_outline)在 Outliner.generate_outline 的执行链路中LLM 返回的tool_calls会依次经过args字符串反序列化json.loads(normalize_json_output(args))normalize_sections统一解析_parse_sections_value容忍 dict 嵌套sections字段或 JSON 字符串但最终必须得到 listcheck_tool_call严格校验工具名匹配、args为 dict、必填参数齐全、sections为 list 且每个 section 为 dict 且必填字段非空outliner.py。任何一步失败都会抛出StatusCode.OUTLINER_GENERATE_ERROR并由 OutlineNode._do_invoke 按outliner_max_generate_outline_retry_num预算重试。四、章节契约字段详解提示词规定每个 section 对象必须包含以下三个契约字段4.1format_requirements格式要求存放模板或用户请求中针对该章节的输出约束例如必需的表格、精确列名、行对象、逐项枚举、长度/风格规则、来源使用限制。当某章节无特定格式要求时必须使用空数组[]。对应 search_context.py 中Section.format_requirements: List[str]并在generate_outline中经_normalize_format_requirements清洗为字符串列表outliner.py。4.2section_focus分析职责标签描述该章节在报告中的分析角色必须是非空字符串。业务报告场景的示例标签包括market_size_and_growth、vendors_and_supply、technology_drivers、risks_and_barriers、use_cases_and_commercialization、recommendation_and_ranking非业务领域科学、法律、医疗、教育等应创建贴合其分析目的的标签无更具体角色时使用兜底值section_specific_analysis。特别约束recommendation_and_ranking只能用于承载最终判断/推荐结论的章节防止标签滥用。4.3focus_dimensions主分析维度非空数组包含该章节主要负责的 1–4 个分析维度。每个维度应有且仅有一个主要归属章节其他章节仅可将其作为辅助上下文引用避免同一维度被多个章节重复深挖。这些字段最终映射到 Section 模型 的section_focus与focus_dimensions并在规划器planner、章节写作等下游节点继续发挥作用。五、执行约束模板结构优先与章节映射规则提示词用## Execution Constraints一段集中约束了从模板到大纲的转换规则是本文档的技术核心模板结构优先模板结构优先于一切其他考虑Template structure takes precedence over all other considerations禁止逐字复制 Function:行不得逐字复制模板中以 Function:开头的行应改写并概括其含义仅允许两级标题最终大纲只允许 Level 1 与 Level 2 两级标题不得为 Level 2 副标题生成独立的 Level 3 标题必须将其合并进父级 Level 1 章节的description中描述与格式分流实质性的 Level 2 范围与功能放进description表格、精确列、枚举、长度/风格、来源限制放进format_requirements忽略 Level 3 及更深层级保留全部 Level 1 章节摘要类除外必须保留模板中所有 Level 1 章节但显式丢弃总结性章节如摘要简介总结结论SummaryConclusionFinal Remarks即使模板中存在is_core_section是不可重释的固定指令模板中的是否核心章节字段是布尔值必须视为固定指令不得评估或重新解释该规则仅作用于 Level 1 标题子章节继承父级状态is_core_section: false非核心章节必须保留非核心不等于总结性只有总结性章节才可删除is_core_section: true核心需要收集更广泛的支撑信息包括多视角、案例研究、数据来源。这些规则与 report.py 中按current_outline.sections[index]读取章节标题、逐章写作的消费方式严格对齐——大纲层级一旦混乱下游 Editor Team / Dependency Writing Team 的章节分派将无法对齐。六、Description 格式化规范description必须是单个字符串非数组并按如下规则拼接将该章节下所有 Level 2 副标题连同各自的 Function功能概述以项目符号列表风格串联例如-Subtitle: Function description一律不得在description中嵌入其他 section 对象、JSON 片段或诸如title:、description:、}, {、\id\之类的字符串。从源码看Section.description 正是章节研究步骤详细说明明确指定需要收集的数据或需要执行的编程步骤而generate_outline直接透传该字段因此提示词要求将其格式化为可读、无嵌套结构的纯文本列表既保证下游规划器可解析也避免 JSON 污染。七、工作示例从模板到结构化大纲 JSON提示词内置了一个中文产业研究报告示例模板完整展示了映射规则# 简介 Function: 详细介绍研究对象的整体概况优势、短板以及发展前景 是否核心章节: false # 发展概况 Function: 提供研究对象的发展历程 是否核心章节: false ## 历史演进与产业基础 Function: 详细介绍研究对象的历史发展历程按照时间维度列举发展历程中的重要事件并分析重要事件的标志性影响 ## 产业结构 Function: 详细分析研究对象的核心结构例如有哪些环节每个环节的具体概念 ## 产业核心环节 Function: 详细介绍产业的核心环节有哪些并分析研究对象在这些核心环节的发展情况 # 核心环节竞争力分析 Function: 列举核心环节并整体分析核心环节的发展历程及标志性事件 是否核心章节: true ## 整车制造环节竞争力 Function: 详细分析研究对象在整车制造环节的竞争力例如有哪些车企这些车企各自的详细信息在整车制造环节的优劣 ## 关键零部件环节竞争力 Function: 详细分析研究对象在零部件环节的竞争力例如有哪些零部件每种零部件的详细信息与重要性以及当前研究对象有哪些优劣 ## 新能源技术环节竞争力 Function: 详细分析研究对象在新能源技术环节的竞争力 # 总结 Function: 整体总结报告上述内容 是否核心章节: false按照规则处理后简介与总结被丢弃总结性章节Level 2 副标题被合并进父级 Level 1 的description核心章节保留并扩充更丰富的细节。最终应调用generate_outline工具并传入如下结构化参数{ language: zh-CN, thought: The template emphasizes discarding summarizing sections and merging Level 2 subtitles into parent Level 1 descriptions. Core sections are preserved and expanded with richer detail., title: 研究报告, sections: [ { title: 发展概况, description: - 历史演进与产业基础: 详细介绍研究对象的历史发展历程按照时间维度列举发展历程中的重要事件并分析重要事件的标志性影响\n- 产业结构: 详细分析研究对象的核心结构例如有哪些环节每个环节的具体概念\n- 产业核心环节: 详细介绍产业的核心环节有哪些并分析研究对象在这些核心环节的发展情况, format_requirements: [], is_core_section: false, section_focus: section_specific_analysis, focus_dimensions: [development_history, industry_structure, core_segments] }, { title: 核心环节竞争力分析, description: - 整车制造环节竞争力: 详细分析研究对象在整车制造环节的竞争力例如有哪些车企这些车企各自的详细信息在整车制造环节的优劣\n- 关键零部件环节竞争力: 详细分析研究对象在零部件环节的竞争力例如有哪些零部件每种零部件的详细信息与重要性以及当前研究对象有哪些优劣\n- 新能源技术环节竞争力: 详细分析研究对象在新能源技术环节的竞争力, format_requirements: [], is_core_section: true, section_focus: section_specific_analysis, focus_dimensions: [vehicle_manufacturing, key_components, new_energy_technology] } ] }注意示例中的description使用- 副标题: 功能描述的项目符号串联且不包含任何 JSON 嵌套——这正是Description 格式化规范的直观体现。八、源码链路从工具调用到 Outline 对象大纲工具被调用后generate_outlineoutliner.py负责把工具参数封装为领域模型并做三道健壮性处理Section 封装与字段归一将title、description、format_requirements、is_core_section、section_focus、focus_dimensions、material_bindings映射为Section对象ID 修复validate_section_id_format校验 ID 必须匹配^\d(\.\d)*$fix_section_ids兜底重排编号并去重parent_ids依赖校验与修复validate_section_dependencies检查重复 ID、自依赖、反向依赖父级 ID 大于当前 ID、parent_ids与relationships数量不匹配fix_section_dependency_issues自动剔除非法依赖最后兜底清空无法修复的依赖关系。此外Outliner.generate_outline还会把query_understanding_tools中的运行时 API 工具与默认大纲工具合并merge_runtime_api_tools并把用户素材material_bindings按known_material_ids归一化——若开启material_firstensure_material_first_bindings会确保每个素材优先章节至少绑定一条证据outliner.py。依赖驱动场景则使用creat_dep_driving_outline_tool其 section schema 额外要求parent_ids、relationships字段父级 ID 必须小于当前章节 ID支撑依赖驱动的写作编排但outliner_template明确走普通并行工具PARALLEL由 main_graph_nodes.py 中的if prompt_name in {outliner_template, outliner_user_revised}: return prompt_name, False, ExecutionMethod.PARALLEL.value保证。九、与报告模板生态的衔接outliner_template的输入report_template并非凭空而来它由报告模板管理链路产生模板生成template_generator.py 的TemplateGenerator.generate_template接受file_name/file_streambase64/is_template/agent_config将用户上传的样例报告或已有模板转换为 Markdown 模板样例报告走结构抽取 → 语义抽取两阶段 LLM 抽取template_structure_extract、template_semantic_extract已有模板仅.md走结构保留后处理文件解析与校验template_utils.py 支持.md/.html/.pdf/.docx样例报告与.md模板内置 PDF 页数≤512、DOCX 解压大小、XML 大小、文件总大小≤50MB等边界限制服务端存储server/routers/report_template.py 提供模板导入、列表、获取、更新、删除等 REST 接口报告模板文档详见 report-template.md 与 prompt-template-system.md。十、相关配置项与调优建议模板驱动大纲生成涉及以下配置参数均在 config.py 中定义配置项默认值取值范围说明outliner_max_section_num10[1, 10]大纲章节数量上限OUTLINER_SECTION_NUM_MAX普通初始大纲在用户未指定结构时匹配该目标数outliner_max_generate_outline_retry_num3—大纲生成最大重试次数超限抛出OUTLINER_GENERATE_ERRORoutline_interaction_enabledTrue—大纲交互开关outline_interaction_max_rounds3[1, 100]大纲交互最大轮次template_max_generate_retry_num3—模板生成两阶段抽取最大重试次数需要特别区分的语义与 prompt-template-system.md 的边界说明一致交互式大纲的max_section_num是章节数上限不是要求补足的目标模板驱动初始大纲的section_num是目标章节数但模板结构优先——用户模板中的 Level 1 章节数才是最终结构的权威来源report_template存在且非交互轮次时固定走outliner_template交互轮次则切换到outliner_interaction/outliner_user_revised不会因模板存在而强制回跳。十一、测试与契约保障仓库通过 tests/algorithm/prompts/test_deepresearch_prompt_contracts.py 以仓库级契约PromptContract锁定所有 DeepResearch 提示词的 Jinja 变量outliner_template的必填变量为current_date、entry_search_results、language、original_query、questions、report_template、user_feedback可选变量为current_date、original_query。任何对提示词变量的增删改都必须同步该测试文件否则契约测试失败——这保证了提示词与调用方OutlineNode._pre_handle之间的变量对齐。验证命令仓库根目录下uv run pytest deepsearch/tests/algorithm/prompts小结outliner_template是 openJiuwen DeepSearch 将用户自定义报告模板无缝接入多智能体研究报告流水线的关键枢纽它通过严格的函数工具协议产出结构化sections数组以模板结构优先 两级标题映射 摘要章节剔除 核心章节扩充的规则集保证大纲忠实于模板再由 outliner.py 的封装、ID 修复与依赖校验链路转成可被下游规划器、采集智能体与写作团队直接消费的Outline。理解这套提示词协议即可在自己的集成场景中正确构造模板、配置章节数量与重试预算并保证生成结果满足模板化研究报告的结构一致性要求。赞分享人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载相关推荐openJiuwen DeepSearch Brief 大纲规划器brief_outliner提示词模板与运行时实现解析openJiuwen DeepSearch Brief 大纲规划器brief_outliner提示词模板与运行时实现解析 openJiuwen DeepSe人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体openJiuwen DeepSearch brief_outliner 提示词深度解析从研究请求到决策导向证据计划的精简大纲生成openJiuwen DeepSearch brief_outliner 提示词深度解析从研究请求到决策导向证据计划的精简大纲生成 导读 brief_outl人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体Rivet Actors Rust 实战用 RivetKit 构建共享实时计数器Hello World Rust 全解析Rivet Actors Rust 实战用 RivetKit 构建共享实时计数器Hello World Rust 全解析 导读 本文基于开源仓库中的 ex人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考