← [ BACK_TO_NOTES ]

Hybrid Search

Hybrid Search 是同时使用语义搜索和关键词搜索,然后合并排序的检索策略。它结合了语义理解和精确匹配的优势。

#concept #evergreen #ai

[!info] related notes

Hybrid Search

一句话定义

Hybrid Search 是同时使用语义搜索和关键词搜索,然后合并排序的检索策略。语义搜索理解”膝盖疼”和”膝关节不适”的关系,关键词搜索确保”ERROR_001”精确匹配。

核心原理

混合检索流程

用户查询
    │
    ├─→ 语义搜索 → 结果 A (带相似度分数)
    │
    └─→ 关键词搜索 → 结果 B (带 BM25 分数)
    │
    ▼
合并排序 (加权融合)
    │
    ▼
最终结果

Python 实现

class HybridSearch:
    def __init__(self, semantic_search, keyword_search, alpha=0.7):
        self.semantic = semantic_search
        self.keyword = keyword_search
        self.alpha = alpha  # 语义搜索权重

    async def search(self, query: str, top_k: int = 10) -> list[Chunk]:
        # 1. 两种搜索并行
        semantic_results, keyword_results = await asyncio.gather(
            self.semantic.search(query, top_k=top_k * 2),
            self.keyword.search(query, top_k=top_k * 2),
        )

        # 2. 归一化分数
        semantic_scores = self.normalize_scores(semantic_results)
        keyword_scores = self.normalize_scores(keyword_results)

        # 3. 加权融合
        combined = {}
        for chunk, score in semantic_scores:
            combined[chunk.id] = {"chunk": chunk, "score": self.alpha * score}
        for chunk, score in keyword_scores:
            if chunk.id in combined:
                combined[chunk.id]["score"] += (1 - self.alpha) * score
            else:
                combined[chunk.id] = {"chunk": chunk, "score": (1 - self.alpha) * score}

        # 4. 排序
        sorted_results = sorted(combined.values(), key=lambda x: x["score"], reverse=True)
        return [item["chunk"] for item in sorted_results[:top_k]]

PostgreSQL 混合搜索

SELECT *,
  (1 - (embedding <=> ?::vector)) * 0.7 + ts_rank(tsv, query) * 0.3 AS score
FROM documents, to_tsquery('chinese', ?) query
WHERE tsv @@ query
ORDER BY score DESC
LIMIT 10;

常见坑

  1. 只用一种搜索: 丢失了另一种的优势
  2. 权重不调整: alpha=0.7 不一定适合所有场景
  3. 分数不可比: 两种搜索的分数范围不同,需要归一化

参考资料

创建于 2026/6/30 更新于 2026/7/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本