vector_engine
用 Sentence-BERT + Faiss 构建端到端语义搜索引擎,支持 Docker 一键部署
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 Sentence-BERT + Faiss 构建端到端语义搜索引擎,支持 Docker 一键部署
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
假设你是新冠疫情期间的科研工作者,要从浩如烟海的学术论文中找出与"mRNA 疫苗递送效率"相关的研究。你在 Google Scholar 里输入这些关键词,搜索引擎找到的是包含这些字面的文章——但 mRNA 的另一种表达方式、脂质纳米颗粒载体的研究、或者关于核酸递送的最新综述,都悄悄错过了。更要命的是,搜索引擎会返回大量不相关的结果,你不得不花大量时间人工筛选。
这就是传统关键词搜索的根本局限:它只能匹配字面,无法理解语义。
Kostas Stathoulopoulos(以下简称 Kostas),一位 Meta 的机器学习工程师,遇到了同样的问题。作为一名科研人员,他需要从数千篇关于新冠 misinformation(虚假信息)的论文中快速找到真正相关的研究。他的解决方案,最终演变成了这个开源项目——vector_engine。
图1:项目作者 Kostas Stathoulopoulos 的 GitHub 头像
打个比方:关键词搜索像是查字典——你输入"狗",字典只告诉你"狗"这个字怎么写、什么意思。但语义搜索像是和一个真正懂狗的人聊天——你问"有没有关于忠诚宠物和主人关系的研究",对方能理解你的真实意图,哪怕论文里写的是"犬类伴生行为与人类情感依附"。
实现这种"理解"的关键,是把文字转化为向量(Vector)——一种在高维空间中的数学坐标。语义相近的文本,在向量空间里距离很近;语义相差甚远的文本,距离很远。这个过程叫做语义向量化(Semantic Embedding)。
Transformer 是 2017 年 Google 在论文《Attention Is All You Need》中提出的革命性架构。它通过"注意力机制(Attention Mechanism)"让模型能够理解文本中词语之间的关系——不只是相邻词语,而是任意距离的词语。
vector_engine 选用的是 distilbert-base-nli-stsb-mean-tokens 模型,这是一个经过蒸馏优化的 BERT 变体,专门在 NLI(自然语言推理)和 STS-B(语义文本相似度基准)数据集上微调过。它的工作方式非常简单:输入一个句子,输出一个 768 维的向量。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens')
query = "mRNA vaccine delivery efficiency"
embedding = model.encode(query) # 输出 768 维向量
有了向量,下一步是存储和检索。如果每次查询都要和数据库里所有向量逐一计算距离,时间复杂度是 O(n)。当论文数量达到十万级别,这种线性扫描就不现实了。
Faiss(Facebook AI Similarity Search) 是 Facebook AI 团队开源的向量相似度搜索库。它用**倒排索引(IVF, Inverted File Index)**把向量空间划分成多个聚类(Cluster),搜索时先定位到最相关的几个聚类,再在聚类内部精细搜索。这把复杂度从 O(n) 降到 O(n/k + k),其中 k 是聚类数量——通常是几十到几百个。
vector_engine 的核心搜索逻辑:
def vector_search(query, model, index, k=5):
query_vec = model.encode([query])
distances, indices = index.search(query_vec, k)
return distances, indices
整个语义搜索 pipeline 的数据流是这样的:
用户查询文本
↓
Sentence-BERT 编码 → 768维向量
↓
Faiss 索引检索 → Top-K 最近邻
↓
返回论文标题 / 摘要 / 链接
这个 pipeline 在 notebooks/001_vector_search.ipynb 中有完整的 Jupyter Notebook 实现,作者还提供了 Google Colab 链接,读者可以直接在 Colab 上免费使用 GPU 加速编码过程。
对于非技术人员,作者贴心提供了 Streamlit Web 界面。运行方式极其简单:
# 方式1:Docker 一键启动(推荐)
docker build -t <USERNAME>/<YOUR_IMAGE_NAME> .
docker run -p 8501:8501 <USERNAME>/<YOUR_IMAGE_NAME>
# 方式2:本地安装
pip install -r requirements.txt
streamlit run app.py
启动后,打开浏览器访问 http://localhost:8501/,你就会看到一个简洁的搜索界面:输入框输入查询语句,下方实时返回最相关的论文列表。Streamlit 的 @st.cache 装饰器确保模型只加载一次,后续查询响应极快。
Web UI 背后读取的是 data/misinformation_papers.csv 数据集(约 3000 篇虚假信息相关论文的摘要数据),并通过 models/faiss_index.pickle 预建的 Faiss 索引实现毫秒级检索。
vector_engine/
├── app.py # Streamlit Web 应用入口
├── vector_engine/
│ ├── __init__.py # 包初始化
│ └── utils.py # 核心搜索工具函数
├── models/
│ └── faiss_index.pickle # 预建 Faiss 索引(~26MB)
├── data/
│ └── misinformation_papers.csv # 样例数据集
├── notebooks/
│ └── 001_vector_search.ipynb # 完整实验 notebook
├── Dockerfile # Docker 构建文件
├── requirements.txt # Python 依赖
└── setup.py # 包安装配置
这是一个单模块轻量级架构,代码量适中,结构清晰。核心逻辑在 vector_engine/utils.py(约 955 字节),其余是数据、模型文件和 Web 层。
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 向量编码 | distilbert-base-nli-stsb-mean-tokens | 基于 DistilBERT 的 Sentence-Transformer |
| 向量索引 | Faiss-CPU 1.6.1 | Facebook 开源近似最近邻搜索库 |
| Web 框架 | Streamlit 0.62 | 数据科学专用 Python Web 框架 |
| 深度学习框架 | PyTorch 1.8.1 | 模型推理后端 |
| NLP 库 | Transformers 3.3.1 | HuggingFace 预训练模型库 |
| 容器化 | Dockerfile | 完整的 Docker 镜像构建 |
faiss-cpu 版本在超大规模数据集(百万级向量)上性能受限,可考虑升级到 faiss-gpu 或使用 Faiss 配合 NVIDIA RAPIDS 加速。vector_engine 虽小,但它展示的是当前 LLM 应用领域最核心的技术范式之一——RAG(Retrieval-Augmented Generation,检索增强生成) 的前半段:高质量语义检索。
从 2023 年开始,RAG 成为大模型落地的主流架构。无论是企业内部知识库问答、法律文档检索,还是医疗文献搜索,都离不开向量检索作为基础设施。这个项目恰好是一个极好的入门级 RAG Pipeline 示例:
如果在此基础上增加一个 GPT-4 / Claude API 调用,就能组成完整的 RAG 系统。项目作者在 Medium 博客中也详细描述了如何将这个方案部署到 AWS Elastic Beanstalk,适合有一定运维能力的团队参考。
vector_engine 是一个教学友好型的语义搜索开源项目,以新冠虚假信息论文为应用场景,展示了从 Sentence-BERT 向量化、Faiss 索引构建、到 Streamlit Web UI 的完整 Pipeline。它不是生产级的搜索系统,而是一个高质量的入门级 RAG 示例,代码简洁、文档完善,适合作为 AI/ML 学习者的第一个向量搜索项目。
如果你想了解 RAG 的核心技术——语义向量化、近似最近邻检索——这个项目是非常好的起点。如果你想搭建生产级语义搜索,可以在这个基础上引入更强大的 embedding 模型(如 OpenAI text-embedding-3-large 或阿里 M3E)、更成熟的向量数据库(如 Milvus、Pinecone)以及 LLM 生成层。