refactor(retrieval): share BM25 across repair and evidence consumers - #5101
Conversation
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewed head: 732b16c7b832033391ca3ac5a0561e3a0a7345ab. No blocking finding.
动机
本次验收的是 #5099 的 BM25 能否成为两个实际消费者的共同实现。此前算法嵌在自修复目录脚本中,金融召回若复制它,后续分词和评分修复就必须维护两份。现在抽出一个无状态模块,并通过真正构建、安装两个 wheel 验证复用;本次没有把小样本排序收益说成完整召回准确率或投资能力提升。
改动思路
数学规则集中到一个标准库模块;身份、匹配、准确命中优先级、分页和权威仍留在消费者。直接导入整个 skill 会耦合目录解析,直接复制公式会形成第二个维护点,当前边界更小。自修复还要独立部署,因此现有 installer 和 wheel 将同一源码作为安装产物放到脚本旁,沿用内容哈希、原子替换和重复安装路径。没有新增配置权威或自动 hook。
具体改动
关键代码讲解
loopx/lexical_retrieval.py:31的score_bm25保留固定参数及分词规则,返回与输入位置一一对应的分数和匹配词项,零分文档也保留。调用方决定是否展示,模块本身不发现信源、不触网或写状态。skills/loopx-self-repair/scripts/find_pattern.py:57的search_patterns消费共享结果,但继续负责 pattern/code 准确匹配优先级、稳定同分排序、展示限制和完整正文展开。原内嵌公式已删除。loopx/workflow_skill_install.py:169的_install_one_skill只在源码安装缺少伴随资源时暂存规范模块,再复用已有安装流程;wheel 通过资源清单直接交付,安装副本不是第二份源码。resolve_workflow_skill_source在 frozen 路径要求自己的资源完整,缺失则报告重建,不能借用外部环境。新增测试覆盖该失败路径、重复安装、隔离执行、空语料、Unicode 和查询重复词;双语文档说明调用边界和历史语料约束。
对主干的风险
主要风险是“源码可运行但安装包缺文件”,以及抽取后评分或错误诊断漂移。20 组同一语料的旧版/当前公开 CLI 查询、分页、完整 ID 和非法输入对照一致;刻意把安装副本的评分清零,会使同一公开查询的独立命中断言失败,当前提交通过。43 项聚焦测试、8 项预合并安装/升级/状态回归检查、语法与 lint/diff 检查通过。前端包已构建,两个 wheel 在无源码导入路径的干净环境完成安装验收,脚本可在空 PATH 和隔离 Python 下运行。
语义与 CI 对齐
本次复用已有检索与安装语义,没有引入 Goal、额度、Agent 或金融授权词汇。按照 Goal 的 wait_for_ci=false,未查询或等待远端 CI。没有构建实际 frozen 二进制,对该边界的结论限于资源解析与生命周期测试;源码和 wheel 是实路径验收。前端/Lark 没有相应配置入口变化,因为没有新增 capability 开关或配置字段;原查询 JSON 和金融离线 HTML 承接结果。
我的整体评价
APPROVE。长程影响是减少两个消费者的重复维护;用户体验通过新旧 CLI、重复安装和实装验收保持。完整变更是 8 文件、185 行新增和 23 行删除,新增主要是共享模块、交付测试与文档,没有另建检索服务或状态体系。名称别名缺失仍需消费者处理,BM25 分数不表示证据置信度或交易资格。授权自合并仍须最后读回同一 head 并通过合并就绪门禁。
English verdict: APPROVE - head 732b16c7b832033391ca3ac5a0561e3a0a7345ab; one canonical BM25 scorer with preserved repair semantics. Twenty public CLI comparisons, 43 focused tests, eight premerge smokes and paired installed-wheel qualification passed. Actual frozen binaries were not built; no authority or automatic hook changes.
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
732b16c to
6ff3679
Compare
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewed head: 6ff367994dbba3505acf8cd46ece75801f0102bf. No blocking finding.
动机
本次验收的是 #5099 的 BM25 能否成为两个实际消费者的共同实现。此前算法嵌在自修复目录脚本中,金融召回若复制它,后续分词和评分修复就必须维护两份。现在抽出一个无状态模块,并通过真正构建、安装两个 wheel 验证复用;本次没有把小样本排序收益说成完整召回准确率或投资能力提升。
改动思路
数学规则集中到一个标准库模块;身份、匹配、准确命中优先级、分页和权威仍留在消费者。直接导入整个 skill 会耦合目录解析,直接复制公式会形成第二个维护点,当前边界更小。自修复还要独立部署,因此现有 installer 和 wheel 将同一源码作为安装产物放到脚本旁,沿用内容哈希、原子替换和重复安装路径。没有新增配置权威或自动 hook。
具体改动
关键代码讲解
loopx/lexical_retrieval.py:31的score_bm25保留固定参数及分词规则,返回与输入位置一一对应的分数和匹配词项,零分文档也保留。调用方决定是否展示,模块本身不发现信源、不触网或写状态。skills/loopx-self-repair/scripts/find_pattern.py:57的search_patterns消费共享结果,但继续负责 pattern/code 准确匹配优先级、稳定同分排序、展示限制和完整正文展开。原内嵌公式已删除。loopx/workflow_skill_install.py:169的_install_one_skill只在源码安装缺少伴随资源时暂存规范模块,再复用已有安装流程;wheel 通过资源清单直接交付,安装副本不是第二份源码。resolve_workflow_skill_source在 frozen 路径要求自己的资源完整,缺失则报告重建,不能借用外部环境。新增测试覆盖该失败路径、重复安装、隔离执行、空语料、Unicode 和查询重复词;双语文档说明调用边界和历史语料约束。
对主干的风险
主要风险是“源码可运行但安装包缺文件”,以及抽取后评分或错误诊断漂移。20 组同一语料的旧版/当前公开 CLI 查询、分页、完整 ID 和非法输入对照一致;刻意把安装副本的评分清零,会使同一公开查询的独立命中断言失败,当前提交通过。43 项聚焦测试、8 项预合并安装/升级/状态回归检查、语法与 lint/diff 检查通过。前端包已构建,两个 wheel 在无源码导入路径的干净环境完成安装验收,脚本可在空 PATH 和隔离 Python 下运行。
语义与 CI 对齐
本次复用已有检索与安装语义,没有引入 Goal、额度、Agent 或金融授权词汇。按照 Goal 的 wait_for_ci=false,未查询或等待远端 CI。没有构建实际 frozen 二进制,对该边界的结论限于资源解析与生命周期测试;源码和 wheel 是实路径验收。前端/Lark 没有相应配置入口变化,因为没有新增 capability 开关或配置字段;原查询 JSON 和金融离线 HTML 承接结果。
我的整体评价
APPROVE。长程影响是减少两个消费者的重复维护;用户体验通过新旧 CLI、重复安装和实装验收保持。完整变更是 8 文件、185 行新增和 23 行删除,新增主要是共享模块、交付测试与文档,没有另建检索服务或状态体系。名称别名缺失仍需消费者处理,BM25 分数不表示证据置信度或交易资格。授权自合并仍须最后读回同一 head 并通过合并就绪门禁。
English verdict: APPROVE - head 6ff367994dbba3505acf8cd46ece75801f0102bf; one canonical BM25 scorer with preserved repair semantics. Twenty public CLI comparisons, 43 focused tests, eight premerge smokes and paired installed-wheel qualification passed. Actual frozen binaries were not built; no authority or automatic hook changes.
The repair lookup added in #5099 embedded BM25 in a catalog-specific script. Extract the unchanged tokenizer and fixed-parameter scorer into
loopx.lexical_retrievalso repair lookup and a demonstrated financial evidence consumer share one implementation. Each caller retains its own matching, exact precedence, stable keys, pagination and authority. Existing skill installation and wheel packaging deliver the same canonical file for isolated execution.把 #5099 内嵌评分抽为单一标准库模块,自修复与金融证据消费者共同复用。保留各自匹配、准确优先级、身份、分页和权威;安装副本由规范源码生成,不另维护公式。
Validation / 验证: 43 focused tests; 20 public baseline/head CLI comparisons with identical query/id/list/error output; a deliberate score mutation detected by the public query; 8 selected premerge installation/update/control-plane smokes; Ruff and diff checks. Built the packaged frontend and both wheels, installed outside source checkouts, verified both CLI consumers, empty-PATH isolated repair execution and unchanged repeat installation. Frozen resource discovery is covered by tests; no actual frozen binary was built.
Product paths / 产品入口: existing self-repair CLI and packaged skill, plus optional library consumption. No LoopX frontend/Lark configuration, automatic hook, Goal state or evidence/trading authority changes. The paired consumer is financial recall PR30.