
RAG(检索增强生成)里最底层、也最常被低估的一环,是向量检索。很多教程一上来就调 LangChain、接各种云服务,反而把核心原理遮住了。本文不依赖任何云向量库,用 Meta 开源的 FAISS 在本地把"文本 → 向量 → 相似度搜索"完整跑通,带可运行代码、真实参数和输出,帮你把检索这一层彻底吃透。
一、为什么选 FAISS FAISS(Facebook AI Similarity Search)是业界最成熟的向量索引库之一,优势在于:纯本地、CPU 即可跑、亿级向量也能秒级检索、索引类型可调。对于想理解"RAG 检索到底发生了什么"的工程师,它比直接调托管服务更透明。
二、环境准备
bash
pip install faiss-cpu==1.8.0 sentence-transformers==2.7.0 numpy==1.26.4三、完整代码
python
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]}")四、真实输出样例
已入库向量数: 4
Top2 相似度与原文:
分数=0.582 | GEO 是生成式引擎优化,目标是让 AI 在回答里引用你的内容。
分数=0.401 | 向量检索的核心是计算查询向量与库向量的余弦相似度。解读:查询最相似的是 GEO 那条(0.582),其次是向量检索概念条(0.401)。分数在 0~1(归一化内积即余弦),越高越相关。
五、三个关键参数
六、从 demo 到生产的两步
把 FAISS 这层跑通,你就不再依赖黑盒云服务,能自己掌控 RAG 检索的每一个参数。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。