Skip to content

[Bug] 知识库混合检索在 Dense 召回失败时可能压掉 Sparse 的精确匹配,导致短英文实体检索失真 #9868

Description

@ViceAdmiralGrafSpee

问题描述

AstrBot v4.27.4 的知识库混合检索在处理短英文实体词时,可能出现以下情况:

  • Dense 检索因为 embedding 对大小写敏感而召回失败;
  • Sparse / FTS5 已经成功召回包含该英文实体的精确词面匹配;
  • 但由于当前 Fusion 明显偏重 Dense(本环境中 dense_weight = 0.9),Sparse-only 的正确候选仍可能被压出 Fusion top20;
  • 最终 top5 中完全不存在实际包含查询词的 chunk。

最终表现是:

知识库中明明存在非常罕见的精确字符串,但混合检索结果中却完全没有它。

对于 DND、CoC、WoD 等包含大量英文怪物名、法术名、人名、缩写和其他专有名词的资料库,这种情况影响较明显。

如何复现?

  1. 在 AstrBot WebUI 中创建/使用一个知识库,并确保某个知识块正文中明确包含较罕见的英文实体词,例如:

    #### 恶鬼
    **恶鬼** **Oni**
    
  2. 确认该文档已经完成知识库索引。

  3. 进入该知识库的「知识库检索」页面,返回结果数量设置为 5。

  4. 搜索:

    Oni
    

    在我的环境中可以正常召回包含 Oni 的目标知识块,其中 2025 版怪物图鉴中的 Oni 条目排名第 1。

  5. 将查询仅修改大小写为:

    oni
    
  6. 再次搜索。

  7. 此时目标 Oni 知识块全部掉出最终 top5,返回结果变为与查询明显无关的其他内容。

  8. 再搜索:

    ONI
    

    结果同样与 Oni 明显不同。

  9. 搜索中文实体名:

    恶鬼
    

    又可以正常召回目标条目。

补充:

已进一步对生产环境内部 retrieval 进行只读诊断。FTS5 / Sparse 对 OnioniONI 的召回结果完全一致,差异首先出现在 Dense embedding 阶段;随后由于 Fusion 偏重 Dense,Sparse 已经命中的目标知识块仍可能被淘汰。

AstrBot 版本

v4.27.4

操作系统

Linux

部署方式

Docker(Ubuntu VPS)

使用的消息平台适配器

不涉及。本问题可直接在 AstrBot WebUI 的知识库检索页面复现。实际使用QQ 官方机器人(WebSocket) - OneBot v11

错误日志

本问题不会产生 Exception / Error 日志,表现为 native hybrid retrieval 返回结果异常。

已对生产 AstrBot v4.27.4 的内部检索链进行只读诊断:

KnowledgeBaseManager.retrieve()
→ RetrievalManager.retrieve()
→ Dense: FaissVecDB / IndexFlatL2
→ Sparse: SQLite FTS5 / unicode61
→ RankFusion.fuse()
→ final top5

目标 chunk 均明确包含 token "Oni"。

关键诊断结果:

query = Oni
2025 Oni:
Dense #1
Sparse #8
Fusion #1
Final #1

query = oni
2025 Oni:
Dense >50
Sparse #8
Fusion >20
Final: 未进入

2014 Oni:
Dense >50
Sparse #25
Fusion >20
Final: 未进入

query = ONI
2025 Oni:
Dense #42
Sparse #8
Fusion >20
Final: 未进入

另外直接验证 FTS5:
"Oni" / "oni" / "ONI" 均返回完全相同的 32 个 rowid。

因此大小写差异最早出现在 Dense / embedding 阶段;Sparse 已正确召回,但目标候选随后在 Fusion 中被淘汰。

测试日志随附在辅助信息里。

辅助信息

kb_diag_fts.txt

检查清单

  • 我已在 Issue 列表中搜索过相关问题仍无法解决,或该问题从未被报告过。
  • 我已尝试过禁用所有插件,排除了可能是因插件导致的问题。
  • 我报告的问题与 AstrBot 本体相关,而非在报告某一插件的问题。
  • 我已阅读并同意本项目的贡献者行为准则
  • (可选)我愿意提交 PR 以帮助修复该问题。

Metadata

Metadata

Assignees

Labels

area:coreThe bug / feature is about astrbot's core, backendbugSomething isn't workingfeature:knowledge-baseThe bug / feature is about knowledge base

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions