
local-deep-research 死代码归档分析PR #3205 中 entity-aware 策略与问题生成器的删除决策及其设计遗产【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-research这篇技术归档解读围绕 local-deep-research 仓库中 pr-3205-entity-aware.md 展开它记录了 PR #3205 如何删除两个零可达组件 ——EntityAwareSourceStrategy与EntityAwareQuestionGenerator并保留其中值得复用、但未被验证过的设计想法。读完本文你将理解该仓库删除死代码的决策方法论可达性分析、后继组件识别、恢复路径设计掌握 17 关键词实体分类器与朴素大写词 NER 的缺陷教训并能在未来需要实体识别型搜索时直接沿用文档沉淀的 prompt 模板与恢复建议而无需重走弯路。一、背景这篇归档文档在仓库中的位置与作用local-deep-research 在src/local_deep_research/advanced_search_system/下长期演化出大量搜索策略strategies与问题生成器question generators。当 PR 删除其中任意.py文件时一个名为require-strategy-deletion-docs的 pre-commit 钩子见 require-strategy-deletion-docs.py会强制开发者在本目录新增或更新归档说明。归档目录的规则由 docs/strategies/deleted/README.md 定义目的git 已保存删除前的代码与历史归档文档的职责是解释被删组件的新颖之处与删除原因—— 这是git blame无法重建的散文信息命名每个删除 PR 一个文件格式pr-number-short-slug.md如pr-3205-entity-aware.md结构若一个 PR 删除多个组件按## Component:一节一个组件组织。PR #3205 恰好属于一个 PR 删除两个组件的情况EntityAwareSourceStrategy实体感知搜索策略与EntityAwareQuestionGenerator实体感知问题生成器。两者的共同命运是在删除时点都已不可达—— 前者未注册进search_system_factory.py后者唯一的调用方就是前者因此删掉策略后问题生成器自然成了孤儿。二、Component 1EntityAwareSourceStrategy的解剖2.1 基本档案维度内容删除文件src/local_deep_research/advanced_search_system/strategies/entity_aware_source_strategy.py删除时规模139 行可达性未出现在search_system_factory.py未从 strategies/init.py 导出仅被自身纯逻辑测试与STRATEGY_IMPORTS引用删除时最近的可达后继者BrowseCompEntityStrategyfactory keybrowsecomp-entity面向约束驱动的实体研究纯字符串实体 ID 查询的回退路径SourceBasedSearchStrategyStandardQuestionGenerator或BrowseCompQuestionGenerator验证当前仓库可见strategies/__init__.py目前仅导出BaseSearchStrategy、FocusedIterationStrategy、SourceBasedSearchStrategy三个类印证了归档文档对未从__init__导出的判断当前strategies/目录清单中也已不存在entity_aware_source_strategy.py。值得注意的是文档所说的后继者browsecomp_entity_strategy.py在当前strategies/目录中同样已不存留根据同目录下的 pr-remove-experimental-search-strategies.md 记载这批实验策略后来也被清理但 search_system.py 第 115 行仍保留browsecomp-entity策略键的语义说明Entity-focused search for BrowseComp questions with knowledge graph building可作为追溯该能力设计的线索。2.2 删除前版本中有价值的想法已记录未验证归档文档特别保留了两条思想遗产明确提示后人不要盲目复刻但可作为未来实现参考117 关键词实体查询分类器策略及其问题生成器在判断查询是否在找实体时采用了一个朴素规则只要小写化后的查询中出现下列 17 个关键词中的任意一个即判定为实体查询who / what / which / identify / name / character / person / place organization / company / author / scientist / inventor / city country / book / movie文档明确指出该方案的硬伤实践中误报率很高——who、what、which会命中绝大多数研究类查询导致几乎任何问题都会被误判为实体查询。它的价值定位是如果有人日后构建真正的分类器这份关键词表可以作为起点而非可直接投产的成品。2朴素大写词 NER_format_search_results_as_context方法把每个长度大于 2 的大写词首 token当作候选实体并截取 ±2 词的上下文窗口作为实体描述。该文件自身的 TODO 注释就已标注这是 placeholder占位实现。归档文档记录它的教训是这种启发式会误匹配章节标题、句首单词、标题大小写格式的杂项内容属于有人试过且被证明不充分的捷径。2.3 为什么删除是安全的归档文档给出的结论是零用户可达路径 零算法新颖性。该策略相对其父类SourceBasedSearchStrategy只增加了两件事 —— 一次问题生成器替换把标准生成器换成EntityAwareQuestionGenerator和上文那套朴素 NER —— 没有引入任何新的搜索算法或提示工程。真正有技术含量的提示工程部分在问题生成器里见第三节策略本身只是个 139 行的薄包装。2.4 值得注意的接口缺口归档文档记录了一个删除后留下的能力空白BrowseCompEntityStrategy要求调用方预先构造好Constraint对象而EntityAwareSourceStrategy是当时唯一虽然不可达接受纯字符串实体 ID 查询的路径。也就是说用户直接输入一个实体 ID 字符串的用例在生产环境中从未被服务过。文档对此的结论是这不是回滚的理由而是一个未来功能需求—— 如果它重要应当作为新特性提出而非恢复旧代码。2.5 恢复路径Recovery Path归档文档给出的官方恢复建议非常明确不要恢复这 139 行的包装类。如果纯字符串实体 ID 查询确实重要正确做法是编写一个辅助函数从自由文本查询中提取Constraint对象复用现成的ConstraintAnalyzer见 constraint_analyzer.py将提取结果路由到BrowseCompEntityStrategy。这条建议与仓库现状高度吻合 ——ConstraintAnalyzer至今仍是约束分析的核心实现说明复用约束提取器 路由到约束驱动策略的路径在当前架构下依然成立。三、Component 2EntityAwareQuestionGenerator的解剖3.1 基本档案维度内容删除文件src/local_deep_research/advanced_search_system/questions/entity_aware_question.py删除时规模178 行可达性唯一消费者是EntityAwareSourceStrategy策略删除后成为孤儿同时从 questions/init.py 的__all__中移除删除时最近的可达后继者BrowseCompQuestionGeneratorbrowsecomp_question.py与策略不同问题生成器承载了真正的提示工程价值。当前 questions/init.py 仍导出BrowseCompQuestionGenerator其类文档browsecomp_question.py 第 14-23 行明确描述其设计要点提取具体实体日期、数字、人名、地点、生成渐进式搜索组合、先宽后窄、聚焦可验证事实 —— 这正是归档文档所说以算法方式覆盖实体组合查询的后继能力。3.2 删除前版本中有价值的两条遗产1多约束引号搜索的 prompt 模板generate_questions与generate_sub_questions是整个代码库中仅有的两个显式教模型把多个标识约束组合进单个引号搜索的 prompt并附带一个具体的完整示例 —— 一个虚构的、活跃于 1960s-1980s、会打破第四面墙的电视角色。归档文档的评价是如果你日后需要为实体 ID 查询写 prompt应从这两个模板出发而非重新发明它们是合理的初版reasonable first cut只是从未被验证过。2复活时必须规避的陷阱generate_questions存在一个致命回退逻辑当 17 关键词门控未命中时它直接返回空列表这会彻底中断非实体查询的后续研究流程。归档文档明确警告复活该生成器时绝不能重新引入这个空列表回退。3.3 为什么删除是安全的原因非常直接EntityAwareSourceStrategy被删除后该生成器没有任何剩余消费者。删除它不会影响任何可达代码路径。3.4 恢复路径如果这套 prompt 工程日后被证明有价值官方建议是子类化BrowseCompQuestionGenerator或为其添加可选模式而不是恢复一个平行的生成器类同时务必去掉空列表回退。四、从仓库源码印证归档结论以上所有结论都可以在当前仓库中找到直接证据可达性结论strategies/__init__.py与questions/__init__.py的导出清单中均无被删组件strategies/目录与questions/目录下也没有entity_aware_*.py文件 —— 与文档删除后无残留一致后继者存在性SourceBasedSearchStrategysource_based_strategy.py、StandardQuestionGeneratorstandard_question.py、BrowseCompQuestionGenerator均在仓库中正常存在构成实体类查询的回退与替代路径约束提取能力ConstraintAnalyzerconstraint_analyzer.py作为文档建议复用的核心组件持续在库支撑从自由文本提取约束的恢复方案删除纪律docs/strategies/deleted/README.md 与 require-strategy-deletion-docs.py 共同构成制度保障确保任何删除advanced_search_system/下组件的提交都必须留下这种新颖性说明让今天的分析对未来的维护者有据可查。五、总结这次删除给我们的决策清单PR #3205 的归档记录浓缩了 local-deep-research 处理死代码的一套可复用决策流程先做可达性分析是否被工厂注册、是否被__init__.py导出、是否被其他组件或测试引用 —— 三条都查过才敢动刀判断是否有算法新颖性纯包装、无新逻辑的组件可以安全删除策略本身有价值的部分要单独识别并归档prompt 模板记录接口缺口删除后是否留下能力空白纯字符串实体 ID 查询若空白已长期无人服务则视为未来特性而非回滚理由给出明确恢复路径不恢复旧类而是复用ConstraintAnalyzer提取约束后路由到BrowseCompEntityStrategy或子类化BrowseCompQuestionGenerator标注已知陷阱17 关键词分类器的高误报、朴素大写词 NER 的占位性质、空列表回退会中断后续研究 —— 这些教训随归档文档一同保留防止后人重蹈覆辙。对于想要在 local-deep-research 上扩展实体感知搜索能力的开发者这份归档就是最好的起点保留遗产、规避陷阱、按官方恢复路径在ConstraintAnalyzerBrowseCompEntityStrategy的方向上构建新能力而不是回到 139 行 178 行的旧实现。【免费下载链接】local-deep-research~95% on SimpleQA (e.g. Qwen3.6-27B on a 3090). Supports all local and cloud LLMs (llama.cpp, Ollama, Google, ...). 10 search engines - arXiv, PubMed, your private documents. Everything Local Encrypted.项目地址: https://gitcode.com/GitHub_Trending/lo/local-deep-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考