Semantic Search
Semantic Search 是基于向量相似度的检索方式。把查询和文档都转成向量,找到向量空间中距离最近的文档。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Embedding Model, Vector Database, Hybrid Search
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” |
常见坑
- 只用语义搜索: 精确术语(错误码、产品型号)找不到
- Embedding 模型不匹配: 索引和查询用不同的模型
- top_k 太大: 检索太多不相关的文档