用句向量构建语义搜索系统:全流程实战与落地指南

内容纲要

这次我们进入实战篇章 🚀——如何用句向量构建一个高性能的语义搜索系统。目标:从用户输入到高相关文本返回,全流程打通,能用能落地!


一、引言

传统的关键词搜索依赖字面匹配,用户输入“不太精确”就很容易搜不到结果;而语义搜索则可以理解用户“想要什么”,用句向量 + 相似度匹配来完成精准返回,是下一代智能搜索系统的核心。

这篇文章将带你从 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-chineseuer/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)

✅ 如果你需要百万级检索,可以换成 IndexIVFFlatIndexHNSWFlat,支持倒排和 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 精准匹配
  • 支持扩展和部署,便于快速产品化落地

无论你是做智能客服、问答系统、知识库检索,还是做内容推荐、相似文档分析,基于句向量的语义搜索系统都值得一试!


引用资料

  1. Sentence-Transformers 官方文档:https://www.sbert.net/
  2. Faiss 向量库 GitHub:https://github.com/facebookresearch/faiss
  3. Milvus 官方文档:https://milvus.io/
  4. OpenAI embedding 文档:https://platform.openai.com/docs/guides/embeddings
  5. Huggingface 模型库:https://huggingface.co/models

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward