Skip to content

core.search 与已发布的 search 引擎脱节:只检索活跃块、0.1 阈值单次命中永不过、无 CJK、无可见消息 #178

Description

@ranxianglei

现象

core.search(query, state)(进程内 API)对常见查询返回空数组,即使查询词就出现在当前会话里。billion-context#394 有完整的用户侧复现(0 压缩块的会话,查询词全部在可见对话中 → [No blocks matched ...])。

根因(src/compress.ts)

  1. 语料只有活跃摘要块:search()(compress.ts:384-395)只对 activeBlocks(state) 打分,可见消息从不参与检索 → 0 块会话必空。
  2. 阈值不可达:scoreRelevance(compress.ts:1342-1364)topic 命中 0.15/次(上限 0.45)、summary 命中 0.04/次(上限 0.2),过滤线 score > 0.1。summary 中只出现一次查询词 = 0.04,永远被过滤。
  3. CJK 缺失:query 按 \s+ 切词 + indexOf 精确子串匹配,中文整串当一个 token,基本必 miss。
  4. 工具描述与实现不符:buildCompressSystemPrompt(compress-tools.ts:206 附近)承诺 "(and optionally visible messages)",但 core.search 没有这个选项;tool schema 描述也只提 blocks。

关键事实

src/search/(bm25/hybrid/semantic/fuzzy/substring + tokenizer 的 CJK 分词 + stemmer + doc-cache + blockDocs/messageDocs 语料构建)已经发布并从 src/index.ts 导出,设计意图就是给 search_context 用(search/index.ts 头部注释:模型用 search 定位被压缩折叠的细节,再 decompress 所属块;host 从 session log 提供 messageDocs)。但 core.search 完全没有接线它 —— 引擎是死代码,core.search 还在用上面那套朴素打分。

影响

建议修法

  1. core.search 重构到 searchBlocks 上:语料 = blockDocs(state)(建议仍只取 active 块,已折叠进父层的内容避免重复命中)+ 可选的 messageDocs(messages);签名加可选 messages 参数(保持向后兼容)。
  2. 阈值走 bm25 语义(hybrid 归一化后真实命中 ≈0.7-1.0,弱模糊命中 ≈0.3,默认 minScore 0.01 即可,不要再设 0.1 这种不可达门槛)。
  3. 同步更新 compress-tools.ts 的 tool 描述与 system prompt,使其与实现一致。
  4. 补 CJK 单测(中文查询 → 中文 summary / 中文消息)。

验收标准

  • 0 块会话:查询词来自当前可见消息 → 有命中(或显式说明检索语料)
  • 中文查询在中文会话中可命中(单测含 CJK 用例)
  • summary 中只出现一次查询词的块能通过阈值
  • 工具描述与实现一致

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions