Semantic Search
语义搜索使用嵌入、近邻搜索和重排序器,根据查询的含义而非确切用词为文档和图像排序。
语义搜索根据文档、图像或其他内容与查询在含义上的相似程度进行排序,而不是根据它们与查询共享的词语进行排序。搜索“我的猫饿了”可能会返回标题为“新小猫的喂养计划”的页面,尽管两者没有共同词语。现代系统使用嵌入来实现这一点:神经编码器将查询和内容映射到向量空间,含义相似的内容会彼此靠近;向量搜索则用于查找最近的内容。2019 年,Google 开始使用 BERT 理解搜索查询,推动了网络搜索向这一方向发展;Google 表示,此举影响了美国十分之一的英语搜索。
语义搜索的工作原理#
大多数语义搜索系统使用双编码器进行检索,再通过重排序器优化结果。双编码器会提前为每篇文档生成一次嵌入,并将向量存入向量数据库。查询时只需为查询生成嵌入,近似最近邻索引便会按余弦相似度返回排名靠前的候选结果。Sentence-BERT(2019)让这一方法适用于句子:在 10,000 个句子中找到最相似的一对,使用 BERT 交叉编码器约需 65 小时,而使用其句子嵌入约需 5 秒。随后,密集段落检索(2020)证明,在开放域问答任务中,学习得到的嵌入在前 20 个段落的检索准确度上比 BM25 关键词排序高出 9 到 19 个百分点。最后,交叉编码器重排序器会同时读取查询和每个候选结果,以更准确地重新排列短名单。
此示例使用 Sentence Transformers 库比较词语重合度和嵌入相似度:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
documents = [
"How to reset a forgotten account password",
"Feeding schedule for a new kitten",
"Quarterly sales report for the retail division",
"Best hiking trails near Denver",
]
query = "my cat is hungry"
# Keyword search: documents sharing at least one word with the query
query_words = set(query.lower().split())
print("Keyword matches:", [d for d in documents if query_words & set(d.lower().split())])
# Semantic search: rank documents by cosine similarity of their embeddings
doc_embeddings = model.encode(documents)
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, doc_embeddings)[0]
best = int(scores.argmax())
print(f"Semantic match: {documents[best]!r} (cosine {scores[best]:.2f})")关键词匹配返回空列表,因为没有文档包含“my”“cat”“is”或“hungry”。语义搜索则返回小猫喂养计划,其余弦相似度为 0.56;这是在含义上最接近的文档。
语义搜索与相关术语#
- 关键词搜索:使用 BM25 等公式根据精确术语匹配为文档排序。它适合处理名称、零件编号和嵌入可能模糊处理的罕见词,但容易漏掉同义词和改述表达。
- 混合搜索:同时进行关键词检索和语义检索,并合并结果,是生产环境搜索和 RAG 系统中的常见配置。
- 语义分割:一种无关的计算机视觉任务,为图像中的每个像素标注类别;它与语义搜索唯一相同之处只是“语义”一词。
- 语义缓存:对 LLM 请求采用同样的基于含义的匹配方式;当新提示词与之前的提示词含义相同时,就复用已存储的答案。
实际应用#
- 检索增强生成(RAG):为语言模型查找所需段落,即使用户的措辞与文档中的措辞不同也能找到。
- 专利搜索:找出使用不同术语描述同一发明的现有技术。
- 零售商品搜索:将“适合雨天通勤的鞋子”之类的查询与商品描述中没有使用这些词语的防水运动鞋相匹配。
- 推荐系统:推荐嵌入向量与用户已选择内容的嵌入向量接近的文章或商品。
按含义搜索图像#
使用对比学习在图像与标题配对数据上训练的模型,例如 CLIP,会将文本和图像嵌入同一个空间,因此文本查询可以为没有标签或标题的照片排序。Ultralytics 语义图像搜索解决方案就是基于这一原理构建的:它的 VisualAISearch 类会使用 CLIP 为文件夹中的每张图像生成一次嵌入,将每个文本查询嵌入同一空间,并返回最多 30 张余弦相似度超过阈值的图像,按相似度从高到低排序。这样,像“一只狗坐在长椅上”这样的查询就能在没有标注的图像集合中找到匹配照片。










