708-语义搜索

传统搜索是匹配文字,语义搜索是匹配含义(​Semantic Search)​

语义搜索技术核心:向量 + 向量数据库(比如 Milvus):

  1. 把所有文本转成向量(代表这段话的意思)

  2. 用户输入问题 → 转成向量

  3. 计算两个向量的相似度

  4. 返回意思最接近的内容

所以:搜索关键字不一样没关系;意思接近(向量相似)就算匹配

传统搜索给出的结果是精确值(匹配,或者不匹配);向量搜索给出的是相似值

小数据案例

Python 实现语义搜索 = 文本转向量(sentence-transformers) + 向量相似度检索(scikit-learn)

1
pip install sentence-transformers scikit-learn

简化代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

# 1. 加载模型(生成语义向量)
model = SentenceTransformer('all-MiniLM-L6-v2')  # 轻量、快、准

# 2. 准备你的“知识库”
corpus = [
    "我想预订明天去上海的机票",
    "如何取消我的酒店订单",
    "肚子疼应该怎么缓解",
    "苹果手机最新款价格是多少",
    "我的快递什么时候能送到",
    "怎么修改账户密码"
]

# 3. 把所有文本转成向量(语义编码)
corpus_embeddings = model.encode(corpus)  # 这就是向量数据集


# 4. 用户输入问题,也转换成向量
query = "我想退掉订的房间"
query_embedding = model.encode([query])


# 5. 计算相似度(语义搜索核心)
similarities = cosine_similarity(query_embedding, corpus_embeddings)[0]

# 6. 按相似度从高到低排序
results = sorted(zip(corpus, similarities), key=lambda x: x[1], reverse=True)

# 输出结果
print("用户问题:", query)
print("\n语义搜索结果:")
for i, (sentence, score) in enumerate(results):
    print(f"{i+1}. {sentence} | 相似度:{score:.2f}")

大数据案例

如果是真实项目、海量数据,就用:Sentence-Transformers + Milvus(向量数据库)​

  1. 文本 → 向量

  2. 存入 Milvus

  3. 查询 → 向量

  4. Milvus 快速返回最相似的向量,就是语义搜索的结果