用 Go、SQLite 与 Qdrant 构建可解释的混合检索

Sirui Liu Lv4

语言: English | 简体中文

发布日期:2026-10-14

我为 FLH 加入显式 Hybrid 搜索,让学习者既可以按措辞,也可以按含义找到 Concept,并查看每条结果的检索依据。实现连接 SQLite 关键词搜索与 Qdrant 语义搜索,在 React 中展示证据,并对最终结果回查当前记录。

我的工程贡献:定义有界排序合同、整合生产搜索路径、展示结果依据,并以独立 oracle 推进验收。

两种排名并不共享分数尺度

记得语法术语或例句片段时,关键词搜索很有用;只记得另一种说法表达的含义时,语义搜索更合适。但关键词返回 tier、状态、标题构成的确定性顺序,语义搜索返回向量相似度,不能直接把它们的分数相加。

我采用 reciprocal rank fusion,只使用排名位置。策略版本为 concept_hybrid_rrf_v1,两组件等权,固定常数 60:

1
2
score(concept) = 1 / (60 + keyword_rank)
+ 1 / (60 + semantic_rank)

只有实际检索到 Concept 的组件贡献分数。同一组件重复 ID 保留第一次排名,同分按 Concept ID 升序。每组件候选深度最多 50,显示条数单独设置且不能大于深度。

把合同显示给用户

工作台提供 Keyword、Semantic 和 Hybrid。每条混合结果展示命中组件、组件排名、关键词字段、语义相似度及融合分数;响应同时给出策略、语义 publication 和被剔除的候选数。

关键词组件是生产前缀匹配搜索,不是另一个评估模块中的 BM25。融合分数只是排名和,不是置信概率。在 API 和 UI 中保留这些含义,便于排错和审查。

当前数据仍然拥有权威

融合不会创建 membership 或改动学习记录。两个组件完成后,服务再次从 SQLite 读取 Concept,删除消失、identity / state 改变或不再符合过滤的结果,不静默补足。

语义搜索读取一次已发布 collection,仅在 publication 被替换时使用原有的一次有界重试。语义服务或 Qdrant 失败时,Hybrid 明确失败;独立 Keyword 模式仍可使用,从而保留用户所选模式的合同。

独立验证排序机制

集成验收使用真实 Go 服务、CLI 和 Qdrant,以及合成记录、确定性 fake embedding。Oracle 从两个组件的响应独立计算期望顺序,没有调用生产融合函数当作答案。

记录中的 126 项检查覆盖算术、同分、过滤、证据、状态变化、provider 故障、publication 替换、重启与缓存。23 组稳定比较前后,SQLite 逻辑 dump 和发布指针不变。关键词零 provider 调用,语义及 Hybrid 每请求只嵌入一条查询。

15 个 Concept 的重建与修复复用缓存,没有新增文档 embedding 调用。这些证据证明机制及恢复;人工审核查询集上的相关性比较仍是另一项工作。

工程成果

这项功能把算法连接到服务合同:有界工作量、确定性输出、当前状态核对、可用 API 和可检查前端。结果与失败状态都可以解释。

实现结合 AI 编码工具,由我负责任务定义和审查;以上为项目验收记录。

实现 PR #96 · 验收 PR #97 · 源码 · 设计 · 集成验收

  • 标题: 用 Go、SQLite 与 Qdrant 构建可解释的混合检索
  • 作者: Sirui Liu
  • 创建于 : 2026-10-14 12:00:00
  • 更新于 : 2026-10-25 12:00:00
  • 链接: https://vanquisher.world/zh-CN/2026/10/14/flh-hybrid-search/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。