内容纲要
这次我们进入实战篇章 🚀——如何用句向量构建一个高性能的语义搜索系统。目标:从用户输入到高相关文本返回,全流程打通,能用能落地!
一、引言
传统的关键词搜索依赖字面匹配,用户输入“不太精确”就很容易搜不到结果;而语义搜索则可以理解用户“想要什么”,用句向量 + 相似度匹配来完成精准返回,是下一代智能搜索系统的核心。
这篇文章将带你从 0 到 1 构建一个语义搜索系统,包含四大模块:
- 句向量生成
- 向量存储 & 检索
- 相似度排序
- 服务部署接口
二、整体架构一览
[用户查询] → [句向量编码器] → [向量查询TopK] → [结果排序 & 召回] → [返回结果]
技术核心:使用 Sentence-BERT 生成句向量 + Faiss 进行相似度检索 + Flask 提供 HTTP 服务
三、Step 1:准备句向量生成模型(SBERT)
from sentence_transformers import SentenceTransformer
# 加载模型
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# 示例语料
documents = [
"什么是自然语言处理?",
"深度学习的发展趋势有哪些?",
"语义搜索系统如何实现?",
"如何训练一个句向量模型?"
]
# 编码语料为句向量
corpus_embeddings = model.encode(documents, normalize_embeddings=True)
你也可以换成中文模型,如:shibing624/text2vec-base-chinese
、uer/sbert-base-chinese-nli
四、Step 2:构建向量检索索引(用 Faiss)
import faiss
import numpy as np
# 将 numpy 数组转成 float32(Faiss 要求)
corpus_embeddings = np.array(corpus_embeddings).astype("float32")
# 创建索引(L2距离)
index = faiss.IndexFlatL2(corpus_embeddings.shape[1])
index.add(corpus_embeddings)
✅ 如果你需要百万级检索,可以换成 IndexIVFFlat
或 IndexHNSWFlat
,支持倒排和 ANN(近似最近邻)
五、Step 3:进行 Top-K 相似度检索
# 查询
query = "怎么实现一个语义检索系统?"
query_embedding = model.encode([query], normalize_embeddings=True).astype("float32")
# 搜索 Top-3
top_k = 3
D, I = index.search(query_embedding, top_k)
# 返回结果
for idx, score in zip(I[0], D[0]):
print(f"匹配:{documents[idx]}(相似度得分:{1 - score:.4f})")
注:L2 距离越小,向量越相似,所以用
1 - 距离
得到“相似度分数”
六、Step 4:部署为接口服务(用 Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/search', methods=['POST'])
def search():
q = request.json['query']
q_vec = model.encode([q], normalize_embeddings=True).astype("float32")
D, I = index.search(q_vec, 5)
results = [{"text": documents[i], "score": float(1 - D[0][k])} for k, i in enumerate(I[0])]
return jsonify(results)
if __name__ == '__main__':
app.run(port=8000)
📬 请求示例:
curl -X POST http://localhost:8000/search \
-H "Content-Type: application/json" \
-d '{"query": "语义搜索怎么做?"}'
七、优化建议(加分项)
技术方向 | 实践建议 |
---|---|
中文语义效果提升 | 用中文预训练模型替换 SBERT(如 text2vec) |
百万数据扩展 | 使用 Faiss 的 IVFPQ/HNSW 进行 ANN 检索 |
支持增量写入 | 将向量和原文持久化存储(如 SQLite + Faiss) |
多字段召回 | 可对标题、正文分别编码,融合多个向量检索 |
向量数据库集成 | 用 Milvus / Weaviate / Qdrant 提供更强管理能力 |
前端搜索 UI | 可集成 Vue + ElasticSearch 做 UI 查询界面 |
八、总结
我们用不到 100 行代码就构建了一个简易但强大的语义搜索系统,整个流程具备如下特性:
- 对自然语言查询有强语义理解能力
- 使用向量召回,支持 Top-K 精准匹配
- 支持扩展和部署,便于快速产品化落地
无论你是做智能客服、问答系统、知识库检索,还是做内容推荐、相似文档分析,基于句向量的语义搜索系统都值得一试!
引用资料
- Sentence-Transformers 官方文档:https://www.sbert.net/
- Faiss 向量库 GitHub:https://github.com/facebookresearch/faiss
- Milvus 官方文档:https://milvus.io/
- OpenAI embedding 文档:https://platform.openai.com/docs/guides/embeddings
- Huggingface 模型库:https://huggingface.co/models