Semantic Search

Semantic Search 是基于向量相似度的检索方式。把查询和文档都转成向量,找到向量空间中距离最近的文档。

#type / concept #status / evergreen #tech / ai

[!info] related notes

Semantic Search

一句话定义

Semantic Search 是基于向量相似度的检索方式。把查询和文档都用 Embedding 模型转成向量,找到向量空间中距离最近的文档。它能理解语义,“膝盖疼”能找到”膝关节不适”。

核心原理

检索流程

用户查询: "膝盖疼怎么办"


Embedding Model → 查询向量 [0.1, 0.2, ...]


Vector Database → 找到最近的 K 个文档向量


返回对应的文档块

Python 实现

class SemanticSearch:
    def __init__(self, embedder, vector_store):
        self.embedder = embedder
        self.vector_store = vector_store

    async def search(self, query: str, top_k: int = 10) -> list[Chunk]:
        # 1. 查询向量化
        query_embedding = await self.embedder.embed(query)

        # 2. 向量搜索
        results = await self.vector_store.search(query_embedding, top_k=top_k)

        return results

相似度计算

def cosine_similarity(a: list[float], b: list[float]) -> float:
    dot_product = sum(x * y for x, y in zip(a, b))
    norm_a = sum(x ** 2 for x in a) ** 0.5
    norm_b = sum(x ** 2 for x in b) ** 0.5
    return dot_product / (norm_a * norm_b)

语义搜索 vs 关键词搜索

语义搜索关键词搜索
原理向量相似度BM25/TF-IDF
优势理解语义精确匹配
劣势精确术语匹配弱不理解同义词
例子”膝盖疼” → “膝关节不适""ERROR_001” → “ERROR_001”

常见坑

  1. 只用语义搜索: 精确术语(错误码、产品型号)找不到
  2. Embedding 模型不匹配: 索引和查询用不同的模型
  3. top_k 太大: 检索太多不相关的文档

参考资料

创建于 2026/6/30 更新于 2026/7/15