Repository navigation
Description
提交前查重 / Duplicate check
- 我已搜索 open/closed Issue,确认没有重复。/ I searched open and closed issues and found no duplicate.(检索关键词:similarity、recall、ranking、provider,覆盖 [Issue]: 进化面板左右两栏共用页面滚动,左侧选中后右侧详情与按钮被滚出视口 #512–[Issue]: 工作空间技能在进化页详情显示“这个技能已不存在” #574)
涉及区域 / Affected area
记忆空间或 Provider / Memory Spaces or Providers
Issue 类型 / Issue type
Bug 报告 / Bug report
摘要 / Summary
dsh-mnemon-provider-mnemon-native 的 search() 把上游 candidateLimit 直接当 CLI --limit(候选被混合分截断),且丢弃 CLI 结果里的 signals.similarity、把 strict-v1 相关度阈值作用在 keyword/graph/recency 混合分上——语义最相关的记忆取不回来或被误降级/误丢。/ The provider truncates candidates by hybrid score before ranking and discards vector similarity, so strict-v1 relevance thresholds act on the hybrid score — semantically relevant memories are missed or wrongly dropped.
预期结果 / Expected outcome
recall 模式下应按向量相似度取回语义最相关的记忆,strict-v1 三个分支(≥0.6 high / 0.25–0.6 medium / <0.25 drop)应作用在归一化相关度上(与 scoreSemantics: "normalized-relevance" 的既有声明一致)。可验证结果:同一语料上语义问句 h@3 从 13/20 提升到 20/20(见下)。
详情或复现步骤 / Details or reproduction steps
- 准备 / Prepare:写入 20 条真实中文事实到 memory spaces(语料已全量嵌入,bge-m3)。
- 提问 / Query:20 条不含关键词的语义问句(问句与事实字面无重叠,仅语义对应)。
- 观察 / Observe:
mnemon_recall(→ source strict-v1 → provider mnemon-native → CLIrecall <q> --limit N)返回的 top 结果经常不含语义对应条目;部分条目被 strict-v1 判为 medium/drop。 - 实测对照 / Measured A/B(同一语料、同一库、同一嵌入模型):
| 取回方式 / Method | h@1 | h@3 |
|---|---|---|
| 现状:CLI 原生混合序(candidateLimit 截断 + 混合分过闸) | 13/20 | 13/20 |
修复:取满候选 + --verbose + 按 signals.similarity 重排、score 归一 |
18/20 | 20/20 |
| 参考:keyword 模式 | 14/20 | 16/20 |
- 报错原文 / Observed: 无报错,纯排序/阈值语义错误——「分数语义错位」而非崩溃。
环境信息 / Environment
- DSH 版本 / DSH version: 0.2.1-rc.5 → 0.2.2-rc.1(两代行为一致)
- dsh-mnemon 版本或 commit / dsh-mnemon version: 0.5.37 → 0.5.41(provider
dsh-mnemon-provider-mnemon-native0.5.9 → 0.5.10,缺陷在两版均在) - Mnemon 版本 / Mnemon version: 内嵌 CLI(随 dsh-mnemon 分发)
- Node.js / pnpm: Node 24.21.0(宿主内核 Electron 44.7.0)/ pnpm 11.28.5
- 操作系统或浏览器 / OS: Windows 11 x64
- Provider 或相关配置(已脱敏)/ Provider config: 嵌入模型 bge-m3,库已全量嵌入;strict-v1 默认阈值 low 0.25 / high 0.6
Bug 证据 / Bug evidence
调用链取证(plugins/dsh-mnemon-provider-mnemon-native/lib/index.js,0.5.10 仍在):
- 缺陷①候选截断:
search()把上游 candidateLimit(默认 10×3=30,上限 50)直接作为--limit传给mnemon recallCLI;CLI 返回前已按 keyword/graph/recency 混合分排序并截断 → 语义相关但混合分不高的条目在进 provider 前已落选。 - 缺陷②分数语义错位:
normalizeInsight()只保留item.score(混合分),丢弃 CLI 结果的signals.similarity(该字段仅--verbose时返回);strict-v1 随后拿混合分比lowScoreThreshold 0.25 / highScoreThreshold 0.6—— 阈值本为归一化相关度设计。
嵌入模型(bge-m3)本身没问题:similarity 信号是好的,是取回链路把信号扔掉了。
冒烟测试 / Smoke test
- 测试环境 / Test environment: 本机 DSH desktop profile,真实 20 条事实语料 + 20 条语义问句
- 执行命令或操作 / Actions: A/B 对照——原序 vs 按
signals.similarity降序重排 +score归一为相似度;并模拟 strict-v1 闸门统计 h@1/h@3 - 实际结果 / Observed: 修复后 h@3 = 20/20(原 13/20);keyword 模式回归 8/8 顺序一致(不受影响)
- 对照版本或配置 / Control: 未打补丁的 provider 0.5.10 原生行为
引用代码 / Code references
plugins/dsh-mnemon-provider-mnemon-native/lib/index.js—search()的--limit直传(缺陷①)与normalizeInsight()的 score 保留逻辑(缺陷②);0.5.10 未变。
补丁草案 / Patch proposal
均在 provider search() 内,不动 Go CLI:
- recall 模式放宽取回量:
--limit min(50, max(20, requested×4))。 - 结果请求加
--verbose,让signals.similarity回到 CLI 输出。 - 按
signals.similarity降序重排,insight.score覆盖为相似度(0..1)——同时让下游scoreSemantics: "normalized-relevance"声明首次真正成立。 - 安全降级:结果中无任何 similarity(如库未嵌入)时保持 CLI 原序原分,不得清空结果。
keyword / status / list 等路径不碰(保持原序原分)。以上已在本地以补丁形式运行(幂等标记 [dsh-fix:semantic-rank]),verify 8/8 通过。
补充信息 / Additional context
- 无最小复现仓库;语料与 verify 脚本为本地私有数据,如需要可脱敏整理后补充。
- 本报告由 Windows 单机环境实测得出;两组数字各跑一次,未做多次平均。
Activity
github-actions commentedon Nov 6, 2026
基础信息已补齐,后续由维护者排查和处理。
Required report information is present. Maintainers will review the report.