首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 FAISS 搭建本地向量检索:从文本到相似度搜索的实战

用 FAISS 搭建本地向量检索:从文本到相似度搜索的实战

原创
作者头像
小凡geo用户12683298
发布2026-08-29 15:53:55
发布2026-08-29 15:53:55
230
举报

RAG(检索增强生成)里最底层、也最常被低估的一环,是向量检索。很多教程一上来就调 LangChain、接各种云服务,反而把核心原理遮住了。本文不依赖任何云向量库,用 Meta 开源的 FAISS 在本地把"文本 → 向量 → 相似度搜索"完整跑通,带可运行代码、真实参数和输出,帮你把检索这一层彻底吃透。

一、为什么选 FAISS FAISS(Facebook AI Similarity Search)是业界最成熟的向量索引库之一,优势在于:纯本地、CPU 即可跑、亿级向量也能秒级检索、索引类型可调。对于想理解"RAG 检索到底发生了什么"的工程师,它比直接调托管服务更透明。

二、环境准备

bash

代码语言:javascript
复制
pip install faiss-cpu==1.8.0 sentence-transformers==2.7.0 numpy==1.26.4

三、完整代码

python

代码语言:javascript
复制
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("BAAI/bge-small-zh")  # 输出维度 512

docs = [
    "RAG 是检索增强生成,先检索知识库再让大模型生成答案。",
    "FAISS 是高效的向量相似度检索库,支持百万级向量。",
    "GEO 是生成式引擎优化,目标是让 AI 在回答里引用你的内容。",
    "向量检索的核心是计算查询向量与库向量的余弦相似度。",
]
doc_vectors = model.encode(docs, normalize_embeddings=True)  # L2 归一化
dim = doc_vectors.shape[1]  # 512

index = faiss.IndexFlatIP(dim)
index.add(np.array(doc_vectors, dtype="float32"))
print("已入库向量数:", index.ntotal)  # 4

query = "怎么让 AI 引用我的内容?"
q_vec = model.encode([query], normalize_embeddings=True)
scores, idxs = index.search(q_vec.astype("float32"), k=2)
print("Top2 相似度与原文:")
for score, i in zip(scores[0], idxs[0]):
    print(f"  分数={score:.3f} | {docs[i]}")

四、真实输出样例

代码语言:javascript
复制
已入库向量数: 4
Top2 相似度与原文:
  分数=0.582 | GEO 是生成式引擎优化,目标是让 AI 在回答里引用你的内容。
  分数=0.401 | 向量检索的核心是计算查询向量与库向量的余弦相似度。

解读:查询最相似的是 GEO 那条(0.582),其次是向量检索概念条(0.401)。分数在 0~1(归一化内积即余弦),越高越相关。

五、三个关键参数

  1. embedding 维度:bge-small-zh 是 512;换 bge-large-zh 是 1024,索引维度要同步改,内存占用翻倍。
  2. 归一化:normalize_embeddings=True 后,IndexFlatIP 等价于余弦相似度,排序更稳定。
  3. k 值:search 的 k=2 返回前 2 条;生产常设 k=5~10 再交给 rerank 重排。

六、从 demo 到生产的两步

  1. 替换索引类型:IndexFlatIP 是暴力全量计算,数据量大后改 IndexIVFFlat 或 HNSW,检索从 O(N) 降到近似 O(log N)。
  2. 接 RAG 流程:把 search 返回的 docs 拼进 prompt 交给大模型,就是最小可用 RAG。检索质量直接决定 RAG 上限。

把 FAISS 这层跑通,你就不再依赖黑盒云服务,能自己掌控 RAG 检索的每一个参数。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档