
人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载本文聚焦 openJiuwen DeepSearch 用户反馈处理链路中的缩写shorten能力完整解读 synonym_rewrite_shorten/system.md 系统提示词的每条设计约束并结合仓库源码剖析从用户选中文本到 LLM 改写结果回填报告的全过程。读完本文你将掌握缩写提示词的角色设定、压缩原则、输出契约以及它在UserFeedbackProcessor→SynonymRewriter调用链中的实际落位方式并能直接定位到对应的源码、模板与测试文件做二次开发。一、提示词在系统中的定位同义改写三动作之一在 openJiuwen DeepSearch 中报告生成完成后用户仍可对报告中选中的局部文本做三类**同义改写synonym rewrite**操作它们由统一的SynonymRewriter处理器承接仅通过不同的 Prompt 模板区分行为动作action提示词模板目录目标expandsynonym_rewrite_expand/在保留原意与事实边界的前提下扩写、澄清、补全论述polishsynonym_rewrite_polish/润色措辞与句式信息量基本不变shortensynonym_rewrite_shorten/压缩冗余表达保留核心观点、支撑与结论方向动作名到模板名的映射定义在 synonym_rewrite.py#L18-L22ACTION_TO_PROMPT { expand: synonym_rewrite_expand, polish: synonym_rewrite_polish, shorten: synonym_rewrite_shorten, }从 action_definitions.py 可以看到shorten与expand、polish同属UserFeedbackActionCategory.SYNONYM_REWRITE大类下的SynonymRewriteActionSubcategory小类三者共用同一条流式改写结果通道UserFeedbackRewriteStreamResult仅 action 值不同。需要特别强调的是同义改写只负责生成可替换选区的正文片段不重新规划报告结构、不主动补充外部资料。缩写动作的核心定位是对用户已选中的冗余文本做信息无损的精简这与补充检索supplementary_search、新增任务new_task、真实性核验truth_verification等动作有清晰的职责边界。二、shorten系统提示词全文逐条解读system.md 由三个板块构成Role、Requirements、Output Requirements。它与同目录下的 user.md 一起在运行时由 Jinja2 渲染为完整的 LLM 对话消息system user。2.1 Role角色设定You are a rigorous assistant for shortening research-style text. Your task is to condense the given text by compressing redundant expression while preserving its core viewpoints, key support, constraints, and conclusion direction, so that the result is more concise, focused, and readable.角色设定的关键信息有三点面向研究风格文本research-style text缩写对象是研究报告正文而非普通口语文本因此压缩策略必须服务于学术/研究写作的可读性。压缩的对象是冗余表达redundant expression而非删减信息。必须保留的要素被明确列出核心观点core viewpoints、关键支撑key support、约束constraints、结论方向conclusion direction。这与扩写expand提示词澄清已有观点、润色polish提示词改善表达形成互补三者共享不改事实边界的底线但操作维度不同。2.2 Requirements14 条压缩守则shorten提示词共 14 条要求可按主题归为四组1压缩的度与质第 1、2、3 条首要目标是压缩冗余不是用牺牲关键信息换取更短的长度——这是整个缩写动作的第一性原则。保留原文最核心的观点、关键支撑、逻辑关系与结论方向。以研究型写作的规范进行缩写优先删除重复表达、过度铺垫excessive setup、套话stock phrasing与次要信息secondary information。2不可删除的边界信息第 4、9、11 条不得删除约束条件、前提、适用范围、例外情况以及结论所依赖的依据。可以压缩例子、解释和修饰性定语但不得删除支撑主要论断的关键信息。不得通过过度概括制造比原文更强的结论也不得把原文中审慎的措辞cautious wording压缩成绝对判断。这三条共同构成了缩写不改义的护栏。3结构保持第 10 条保留原文基本的逻辑顺序缩写时不得打乱原文的强调层级hierarchy of emphasis。4长度目标与输出纪律第 13、14、12 条缩写后长度通常应为原文的50%70%但如果原文本身已非常紧凑则以信息完整性优先不做机械压缩。按用户输入要求的语言输出即 user.md 中的{{ language }}。不添加引用标记或参考文献注释——这意味着缩写结果中不会伪造[citation]或[[n]](url)结构。2.3 Output Requirements输出契约Output only the shortened text directly. Do not include any prefatory note, process analysis, self-check, or closing explanation.输出必须是纯文本片段不输出前言、过程分析、自检说明或收尾解释。这条约束非常重要因为它保证了 LLM 返回值可以直接替换用户选中的报告区间无需再做结构化解析——这与 docs 中记录的 Prompt 契约一致不要求 JSON 输出、不应生成 citation/inference 标记。三、输入契约user.md 模板与三个渲染变量user.md 定义了每次调用时注入的动态内容# Input - Requested language: {{ language }} {% if user_instruction %}- [Top Priority] Special user instruction: {{ user_instruction }}{% endif %} # Source Text {{ original_text }}模板声明的三个变量构成shorten提示词的完整输入契约与仓库级提示词契约测试 test_deepresearch_prompt_contracts.py#L92 中的声明完全对应synonym_rewrite_shorten的 required variables 为language、original_text、user_instruction变量含义是否必填language用户要求的输出语言如zh-CN、en-US必填original_text剥离 markup 后的纯文本选区即待缩写对象必填user_instruction用户补充的特别要求标注为[Top Priority]最高优先级可选可为空注意original_text的语义它不是用户选区的原始字符串而是经过strip_markup_in_range剥离 citation / inference 标记后的纯文本详见第五节。这一点在 synonym_rewrite.py 的_generate_synonym_rewrite_text注释中明确说明——让模型看到[[n]](url)这类结构化标记会诱导它错误改写引用结构。四、底层调用链从用户动作到 LLM 返回以一次shorten动作为例完整调用链如下源码依据 user_feedback_processor.py#L906-L912UserFeedbackProcessor.execute └─ 判断 feedback[action] ∈ SYNONYM_REWRITE_ACTIONS └─ SynonymRewriter.synonym_rewrite(feedback, report_content, language) ├─ strip_markup_in_range(report_content, start_offset, end_offset) # 剥离选区 markup ├─ _generate_synonym_rewrite_text(actionshorten, original_text, language, user_instruction) │ ├─ get_prompt_name(shorten) → synonym_rewrite_shorten │ ├─ build_prompt_messages(synonym_rewrite_shorten, context_vars) │ ├─ get_llm_instance(llm_model_name) # 从 llm_context 取模型 │ └─ ainvoke_llm_with_stats(...) # 带统计的 LLM 异步调用 └─ 拼接 new_report stripped_text[:start] rewritten_text stripped_text[stripped_end:] └─ (可选) apply_local_source_trace_to_action_result # 开启局部溯源时4.1 Prompt 模板的加载与渲染build_prompt_messages定义在 message_builder.py#L36-L89其工作方式以prompt_name定位prompts/prompt_name/system.md与user.md使用 Jinja2Environment配置trim_blocks、lstrip_blocks渲染返回[{role: system, content: system 文本}, {role: user, content: 渲染后的 user 文本}]对 system 模板做静态模板校验_assert_static_template_treesystem.md 中不允许出现运行时变量或动态 include保证角色设定恒定性校验上下文键messages、history、prior_messages、images为保留键不允许出现在业务上下文中。也就是说synonym_rewrite_shorten/system.md中的全部内容被作为恒定 system 消息注入每次缩写调用而原文与语言、用户指令通过 user 消息动态注入。4.2 LLM 调用与异常包装_generate_synonym_rewrite_textsynonym_rewrite.py#L102-L143执行如下动作从llm_context会话上下文变量中取出llm_model_name对应的 LLM 实例get_llm_instance调用ainvoke_llm_with_stats并以AgentLlmName.USER_FEEDBACK_PROCESSOR_SYNONYM_REWRITER.value作为 agent 名对应 node_constants.py#L127 中的user_feedback_processor_synonym_rewriter用于统计与日志归因将响应统一提取为response.get(content, )dict 类型或str(response)记录original_len与rewritten_len便于观察缩短比例是否符合 50%70% 的目标若LogManager.is_sensitive()为真敏感日志模式则不记录原文与改写文本保护内容隐私非CustomException的异常统一包装为USER_FEEDBACK_PROCESSOR_REWRITE_ERROR错误码212405见 status_code.py#L188。4.3 结果回填与 offset 计算synonym_rewrite返回的字典包含synonym_rewrite.py#L91-L100new_report替换后的完整报告stripped_text[:start_offset] rewritten_text stripped_text[stripped_end:]original_text/original_start_offset/original_end_offset前端原始选区及其偏移original_text_clean剥离 markup 后的纯文本即送入模型的original_textrewritten_text/rewritten_start_offset/rewritten_end_offset改写文本及其在新报告中的区间。该结果进一步被_build_rewrite_stream_result组装为UserFeedbackRewriteStreamResult数据类经_send_synonym_rewrite_result以StreamEvent.SUMMARY_RESPONSE事件流式写回前端user_feedback_processor.py#L633-L653。前端据此可以直接高亮替换区域无需自行 diff。4.4 局部溯源的可选接入在 user_feedback_processor.py#L850-L886改写结果是否进入局部溯源由enable_local_source_trace开关决定关闭直接返回改写结果缩写后的文本保持原 citation 语义附着引用的回填交由其他机制处理开启调用apply_local_source_trace_to_action_result为改写后的片段重新匹配/更新 citation返回带citation_messages与可选warning_info的增强结果。因此对缩写动作而言提示词本身不负责 citation但整个链路在开关开启时会为缩写结果补上新的引用。五、前置处理strip_markup_in_range的 markup 剥离机制缩写动作能获得干净的original_text依赖 report_edit_utils.py#L147-L166 的strip_markup_in_range。它处理三类标记正则定义见 report_edit_utils.py#L9-L12标记类型示例处理方式checked citation[checked_citation:1][[2]](https://b.com)选区内整段移除链接引用legacy[[3]](https://c.com)选区内整段移除普通引用[citation: 2]选区内移除inference 标记[结论A](#inference:1)还原为显示文本结论A并记录被移除的 inference id关键细节只处理选区内的标记选区外的 citation 保持原样测试 test_rewrite.py#L19-L36 验证了这一点保证改写局部、不动全局维护 clean-to-raw 边界映射strip_markup_in_range_with_metadata返回clean_boundary_to_raw_boundary支持后续把改写结果与原始 citation 做差异回填语义附着保留被删除 citation 的语义附着在前一个 clean 边界上report_edit_utils.py#L233-L234未变化片段可完整回填其标记。简言之模型拿到的是引用无关的纯文本改写完成后引用体系由代码层维护这正是shorten提示词第 14 条不添加引用标记约束得以成立的工程前提。六、测试与验证仓库为该链路提供了完备的测试覆盖单元测试 test_rewrite.pytest_prompt_names_match_registered_actions验证get_prompt_name(shorten) synonym_rewrite_shorten且SYNONYM_REWRITE_ACTIONS与ACTION_TO_PROMPT键集合一致test_invalid_prompt_name_raises未知 action 抛出USER_FEEDBACK_PROCESSOR_INVALID_ACTION错误码212404test_generate_synonym_rewrite_text_calls_llm_wrapper验证build_prompt_messages被调用一次、ainvoke_llm_with_stats被 await 一次test_generate_synonym_rewrite_text_wraps_unknown_exceptionLLM 抛出的任意异常被包装为USER_FEEDBACK_PROCESSOR_REWRITE_ERRORtest_synonym_rewrite_preserves_trailing_citation_offsetsshorten改写后选区尾部的 citation 标记原样保留多条测试验证选区外/未选中的重复引用实例、inference 标记均不被破坏。仓库级提示词契约测试 test_deepresearch_prompt_contracts.py#L92声明synonym_rewrite_shorten的必填变量为language、original_text、user_instruction防止模板与调用方契约漂移。处理器集成测试 test_processor.py覆盖UserFeedbackProcessor.execute的动作分派、流式结果构建与发送。推荐运行命令uv run pytest deepsearch/tests/user_feedback_processor/test_rewrite.py uv run pytest deepsearch/tests/user_feedback_processor/test_processor.py若改动涉及局部溯源接入还应运行uv run pytest deepsearch/tests/user_feedback_processor/test_local_source_trace.py七、边界与错误处理总结综合提示词约束与源码实现缩写链路共有四类边界条件未知 actionget_prompt_name对不在ACTION_TO_PROMPT中的动作抛出USER_FEEDBACK_PROCESSOR_INVALID_ACTION212404不会静默落到错误的模板offset 不匹配start_offset/end_offset必须与当前报告正文匹配否则在UserFeedbackProcessor.validate阶段被拦截LLM 异常统一包装为USER_FEEDBACK_PROCESSOR_REWRITE_ERROR212405向上传递时保持CustomException语义敏感日志LogManager.is_sensitive()开启时不记录原文与改写文本缩写内容的隐私边界由日志开关保障。八、相关文档与代码索引提示词模板synonym_rewrite_shorten/system.md、synonym_rewrite_shorten/user.md兄弟模板synonym_rewrite_expand/、synonym_rewrite_polish/核心实现synonym_rewrite.py、user_feedback_processor.pymarkup 剥离report_edit_utils.py动作定义action_definitions.py模板渲染器message_builder.py功能文档synonym-rewrite.md、用户反馈处理总览测试test_rewrite.py、test_processor.py、test_deepresearch_prompt_contracts.py结语synonym_rewrite_shorten表面上是 20 行英文提示词实质上是 openJiuwen DeepSearch用户反馈驱动报告精修能力在缩写维度上的完整契约角色上锚定研究风格文本与信息无损压缩要求上区分冗余与关键信息、划定 50%70% 的长度目标、明确保留约束与审慎措辞输出上强制纯文本片段以支持选区直接替换。配合strip_markup_in_range的引用剥离、build_prompt_messages的稳定模板渲染、SynonymRewriter的 offset 回填以及局部溯源的可选接入它在工程上实现了模型只改文字、系统管引用的清晰分工。对于希望在报告精修方向做二次开发的工程师从上述代码与测试入口出发即可完整复现并扩展这一链路。赞分享人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体【免费下载链接】deepsearchopenJiuwen DeepSearch是一款知识增强的深度搜索与研究框架有业界领先的片段级引用和溯源推理能力提供精准Agentic搜索与研究能力项目地址https://gitcode.com/openJiuwen/deepsearch点击查看免费下载相关推荐《自顶向下方法》计算机网络自学方案约 40 小时打通协议栈Wireshark 抓包 CS144 实战《自顶向下方法》计算机网络自学方案约 40 小时打通协议栈Wireshark 抓包 CS144 实战 自学计算机网络时大多数人卡在第一个问题上物理层人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体openJiuwen DeepSearch 同义改写能力解析从前端 expand/shorten/polish 到 SynonymRewriter 的完整链路openJiuwen DeepSearch 同义改写能力解析从前端 expand/shorten/polish 到 SynonymRewriter 的完整链路人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体openJiuwen DeepSearch 报告润色 Prompt 全解析synonym_rewrite_polish 的规则设计、调用链路与实战要点openJiuwen DeepSearch 报告润色 Prompt 全解析synonym_rewrite_polish 的规则设计、调用链路与实战要点 ope人工智能大模型AI AgentRAG深度研究搜索引擎后端代码智能体上一篇网页视频下载助手 Video Download Helper 实战指南没有下载按钮的网页视频它也能帮你把地址全部挖出来下一篇免费解锁 Wand 游戏修改器Wand-Enhancer 使用教程与远程面板设置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考