【AI技术教程】5分钟用Python+FAISS搭建本地RAG知识库,无需云服务 📅 2026/7/9 1:22:55 前言你是不是也遇到过这样的场景手里有一堆技术文档、API手册、会议纪要每次查东西全靠 CtrlF 盲搜效率极低RAGRetrieval-Augmented Generation检索增强生成就是为了解决这个问题而生的。它的核心思想很简单先把知识存起来需要时先检索再回答而不是让大模型全靠记忆硬编。今天这篇博客不整虚的直接带你用纯 Python FAISSFacebook 开源的向量检索库搭建一个本地 RAG 知识库完全离线、零成本、不依赖任何云 API。文末附完整可运行代码。一、RAG 到底是什么大白话解释RAG 流程可以分为三个核心步骤步骤英文名称做了什么类比1. 向量化Embedding把文字变成数字指纹给每本书编一个唯一编号2. 存储检索Vector Search在海量向量中快速找到相似的图书馆的索引目录3. 生成回答LLM Generation带着检索结果让大模型回答把相关书页递给老师看核心优势✅ 知识可更新文档改了重新向量化就行不用重新训练模型✅ 答案有出处每次回答都基于真实检索到的内容✅ 本地可控敏感数据不出门隐私有保障二、环境准备整个项目只需要两个核心依赖sentence-transformers将文本转为向量Embeddingfaiss-cpuFacebook 开源的高效向量检索库安装命令pipinstallsentence-transformers faiss-cpu 如果你的机器有 NVIDIA 显卡可以把faiss-cpu换成faiss-gpu检索速度会快几十倍。本文以 CPU 版本演示开箱即用。三、实操步骤从零到一搭建知识库步骤 1准备文档数据假设我们有以下技术文档片段实际使用时可以是 PDF、Markdown 文件的切分内容documents[Docker 容器是一种轻量级的虚拟化技术它将应用及其依赖打包在一个隔离环境中运行。,Kubernetes 是一个容器编排平台用于自动化部署、扩展和管理容器化应用。,Python 的 requests 库是一个简单易用的 HTTP 客户端库支持 GET、POST 等常用方法。,Git 是一个分布式版本控制系统支持分支管理、合并和提交历史记录。,Docker Compose 允许通过 YAML 文件定义和运行多容器 Docker 应用。,]步骤 2文本向量化使用sentence-transformers的预训练模型将每段文字转换为 768 维向量fromsentence_transformersimportSentenceTransformerimportfaissimportnumpyasnp# 加载预训练 embedding 模型首次运行会自动下载约 420MBmodelSentenceTransformer(all-MiniLM-L6-v2)# 对文档进行向量化embeddingsmodel.encode(documents,show_progress_barTrue)print(f向量维度:{embeddings.shape})# 输出: (5, 768) 模型说明all-MiniLM-L6-v2是一个轻量级中文/英文通用模型体积小、速度快适合入门。如果需要更高精度可以换用all-mpnet-base-v2。步骤 3构建 FAISS 索引将向量存储到 FAISS 索引中实现毫秒级相似度检索dimensionembeddings.shape[1]# 768# 使用 L2 距离欧几里得距离构建索引indexfaiss.IndexFlatL2(dimension)# FAISS 要求 float32 格式embeddings_32embeddings.astype(float32)index.add(embeddings_32)# 向索引中写入向量print(f已存储{index.ntotal}条向量)步骤 4实现检索功能defsearch(query:str,top_k:int3)-list:根据问题检索最相关的文档query_embeddingmodel.encode([query])query_32query_embedding.astype(float32)# FAISS 检索返回距离最近的前 top_k 个distances,indicesindex.search(query_32,top_k)results[]fori,(dist,idx)inenumerate(zip(distances[0],indices[0])):results.append({rank:i1,distance:round(float(dist),4),content:documents[idx]})returnresults# 测试检索query如何管理容器化应用resultssearch(query,top_k2)forrinresults:print(f[{r[rank]}] 相似度分数:{r[distance]})print(f 内容:{r[content]}\n)步骤 5连接大模型生成答案检索到相关文档后交给大模型生成最终回答。这里以本地 Ollama 为例importrequestsdefgenerate_answer(query:str,retrieved_docs:list)-str:基于检索结果生成回答context\n.join([d[content]fordinretrieved_docs])promptf你是一个专业的技术助手。请基于以下参考资料回答问题。 如果资料中没有答案请明确说参考资料中未提及。 参考资料{context}问题{query}# 调用 Ollama需先安装并启动 ollama serveresponserequests.post(http://localhost:11434/api/generate,json{model:qwen2.5:7b,prompt:prompt,stream:False})returnresponse.json().get(response,)# 完整 RAG 流程queryDocker 和 Kubernetes 有什么关系docssearch(query,top_k3)answergenerate_answer(query,docs)print(answer)四、进阶优化技巧优化方向具体做法效果文档切分使用 LangChain 的 RecursiveCharacterTextSplitter 按段落/字符数切分检索精度提升 30%混合检索结合关键词检索BM25 向量检索解决向量检索语义模糊问题重排序Rerank用 Cross-Encoder 模型对 top-20 结果重新打分取 top-5 精度显著提升索引压缩使用 FAISS 的 IVF PQ 量化在精度损失5%时压缩 8 倍千万级向量也可内存加载五、常见问题解答Q1检索出来的内容不够准确怎么办优先检查文档切分策略。一段文字太长的话嵌入向量会信息稀释。建议单段控制在 200-500 字。Q2中文效果不好可以尝试专为中文优化的 embedding 模型如BAAI/bge-base-zh-v1.5BGE 模型族中文语义检索能力更强。Q3数据量大了怎么办FAISS 单机可处理千万级向量。如果数据量超 500 万条建议升级到faiss-gpu或考虑 Milvus、Qdrant 等专用向量数据库。总结今天我们用不到 50 行 Python 代码搭建了一个完整的本地 RAG 知识库。核心要点回顾Embedding 是基石把文字变成向量相似度才能计算FAISS 是引擎高效的向量检索毫秒级返回大模型是出口带着检索结果生成有依据的答案完整代码可以直接复制运行无需任何配置。你可以把公司内部文档、学习笔记导入这个知识库打造一个专属的 AI 问答助手。下一步推荐试试把检索结果接入 Claude API 或本地 Ollama看看实际效果。动手试试吧