现象
core.search(query, state)(进程内 API)对常见查询返回空数组,即使查询词就出现在当前会话里。billion-context#394 有完整的用户侧复现(0 压缩块的会话,查询词全部在可见对话中 → [No blocks matched ...])。
根因(src/compress.ts)
- 语料只有活跃摘要块:
search()(compress.ts:384-395)只对 activeBlocks(state) 打分,可见消息从不参与检索 → 0 块会话必空。
- 阈值不可达:
scoreRelevance(compress.ts:1342-1364)topic 命中 0.15/次(上限 0.45)、summary 命中 0.04/次(上限 0.2),过滤线 score > 0.1。summary 中只出现一次查询词 = 0.04,永远被过滤。
- CJK 缺失:query 按
\s+ 切词 + indexOf 精确子串匹配,中文整串当一个 token,基本必 miss。
- 工具描述与实现不符:
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 还在用上面那套朴素打分。
影响
建议修法
core.search 重构到 searchBlocks 上:语料 = blockDocs(state)(建议仍只取 active 块,已折叠进父层的内容避免重复命中)+ 可选的 messageDocs(messages);签名加可选 messages 参数(保持向后兼容)。
- 阈值走 bm25 语义(hybrid 归一化后真实命中 ≈0.7-1.0,弱模糊命中 ≈0.3,默认 minScore 0.01 即可,不要再设 0.1 这种不可达门槛)。
- 同步更新 compress-tools.ts 的 tool 描述与 system prompt,使其与实现一致。
- 补 CJK 单测(中文查询 → 中文 summary / 中文消息)。
验收标准
现象
core.search(query, state)(进程内 API)对常见查询返回空数组,即使查询词就出现在当前会话里。billion-context#394 有完整的用户侧复现(0 压缩块的会话,查询词全部在可见对话中 →[No blocks matched ...])。根因(
src/compress.ts)search()(compress.ts:384-395)只对activeBlocks(state)打分,可见消息从不参与检索 → 0 块会话必空。scoreRelevance(compress.ts:1342-1364)topic 命中 0.15/次(上限 0.45)、summary 命中 0.04/次(上限 0.2),过滤线score > 0.1。summary 中只出现一次查询词 = 0.04,永远被过滤。\s+切词 +indexOf精确子串匹配,中文整串当一个 token,基本必 miss。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还在用上面那套朴素打分。影响
core.search,同样存在"静默空结果 + CJK 必 miss"。core.search,直接调searchBlocks(blockDocs(state) + messageDocs(可见消息))(活跃块 + 可见消息语料,hybrid BM25+fuzzy,CJK 分词),14 个新单测全部通过,含 CJK 用例。该 PR 不依赖本 issue 的修复。建议修法
core.search重构到searchBlocks上:语料 =blockDocs(state)(建议仍只取 active 块,已折叠进父层的内容避免重复命中)+ 可选的messageDocs(messages);签名加可选 messages 参数(保持向后兼容)。验收标准