708-语义搜索
传统搜索是匹配文字,语义搜索是匹配含义(Semantic Search)。
语义搜索技术核心:向量 + 向量数据库(比如 Milvus):
-
把所有文本转成向量(代表这段话的意思)
-
用户输入问题 → 转成向量
-
计算两个向量的相似度
-
返回意思最接近的内容
所以:搜索关键字不一样没关系;意思接近(向量相似)就算匹配
传统搜索给出的结果是精确值(匹配,或者不匹配);向量搜索给出的是相似值
小数据案例
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(向量数据库)
-
文本 → 向量
-
存入 Milvus
-
查询 → 向量
-
Milvus 快速返回最相似的向量,就是语义搜索的结果