🌐
经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用
点我优惠购买
🚀
拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多
点我优惠购买
🛡️
稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少
点我优惠购买
[保姆级教程] 0基础在Windows本地搭建“DeepSeek”私人知识库 (附源码)
在这个AI爆发的时代,你是否想过把电脑里的几百份PDF、Word文档变成一个可以随时提问的“超级大脑”?而且完全免费、不用联网、数据不出本地!
今天手把手教大家利用 Ollama + DeePseek + python 搭建一个本地 RAG(检索增强生成)系统。不用怕代码,照着做就行!
🛠️ 第一步:准备环境 (Windows篇)
我们需要两个核心工具:Ollama(运行AI的大脑)和 Python(处理文档的管家)。
1. 安装 Ollama
- 下载:访问 Ollama官网 下载 Windows 版本并安装。
- 验证:安装完成后,打开电脑的“命令提示符”(按 Win+R,输入 Cmd,回车)。
- 拉取模型:在黑框里输入以下命令并回车(这一步需要联网下载模型,约 9GB):
ollama pull DeepSeek-r1:14b复制代码💡 注意:如果不差显存(12G以上)用 14b 效果最好;如果电脑配置一般(8G/16G内存),建议把命令换成 ollama pull deepseek-r1:7b,速度会快很多。 2. 安装 Python
- 下载:访问 Python官网 下载最新的 Python 3.10 或 3.11 版本。
- 关键一步:安装界面最下方一定要勾选 "Add Python to PATH" (添加到环境变量),然后点 Install Now。
MyLocalAI/ (你的项目主文件夹)│├── bUIld_kb.py <-- (等下要创建的代码文件1,负责吃书)├── chat_rag.py <-- (等下要创建的代码文件2,负责聊天)│└── 📂 知识库 (你可以随便起名,把所有资料丢这里) │ ├── 📂 2024工作总结/ │ ├── 年终汇报.PPTx │ └── 部门会议纪要.docx │ ├── 📂 行业研报/ │ ├── AI发展趋势.pdf │ └── 竞品分析.pdf │ └── 📂 财务数据/ └── Q4预算表.xlsx复制代码2. 支持的文件类型 你可以随意往里面丢以下格式的文件:
- PDF (.pdf):各种论文、扫描件(必须是文字版,纯图片PDF读不了)。
- Word (.docx):工作文档、合同、论文。
- PPT (.pptx):汇报胶片、课件。
- Excel (.xlsx):简单的表格数据(程序会转成文本读取)。
pip install numpy faiss-cpu pandas pypdf python-docx python-pptx fastembed tqdm ollama openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple复制代码(这里使用了清华镜像源,下载速度飞快) 📝 第四步:创建代码文件 (直接复制) 我们需要在文件夹里创建两个 Python 文件。 方法:新建一个文本文件 -> 粘贴代码 -> 保存 -> 重命名为 xxx.py。 文件 1:build_kb.py (构建知识库) 这个脚本负责扫描刚才那些文件夹,把文档“嚼碎”并存成AI能读懂的向量格式。
import osimport gcimport shutilimport loggingimport numpy as npimport faissimport pandas as pdfrom pypdf import PdfReaderfrom docx import Documentfrom pptx import Presentationfrom fastembed import TextEmbeddingfrom tqdm import tqdm# =========================# ⚙️ 配置区域# =========================# 设置国内镜像,解决下载慢的问题os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"logging.getLogger("pypdf").setLevel(logging.ERROR)BASE_DIR = "." # 扫描当前目录INDEX_FILE = "kb.index"CHUNKS_FILE = "kb_chunks.npy"BATCH_SIZE = 256# =========================# 📄 文档加载器# =========================def load_pdf(path): try: reader = PdfReader(path) return "\n".join([page.extract_text().strip() for page in reader.pages if page.extract_text()]) except: return ""def load_docx(path): try: doc = Document(path) return "\n".join([p.text.strip() for p in doc.paragraphs if p.text.strip()]) except: return ""def load_pptx(path): try: prs = Presentation(path) out = [] for slide in prs.slides: for shape in slide.shapes: if hasattr(shape, "text_frame"): for p in shape.text_frame.paragraphs: if p.text.strip(): out.APPend(p.text.strip()) return "\n".join(out) except: return ""def load_xlsx(path): try: return pd.read_excel(path).to_markdown(index=False) except: return ""def split_text(text, size=500, overlap=50): res = [] for i in range(0, len(text), size - overlap): chunk = text[i:i + size].strip() if len(chunk) > 20: res.append(chunk) return reSDef scan_files(): print("📂 正在扫描当前目录及子文件夹下的文档...") chunks = [] supported_ext = ['.pdf', '.docx', '.pptx', '.xlsx'] files = [] for ROOT, _, filenames in os.walk(BASE_DIR): for f in filenames: if any(f.lower().endswith(ext) for ext in supported_ext): files.append(os.path.join(root, f)) print(f"📄 找到 {len(files)} 个文件,开始解析...") for file_path in tqdm(files, desc="解析文件"): content = "" ext = os.path.splitext(file_path)[1].lower() if ext == '.pdf': content = load_pdf(file_path) elif ext == '.docx': content = load_docx(file_path) elif ext == '.pptx': content = load_pptx(file_path) elif ext == '.xlsx': content = load_xlsx(file_path) if content: # 在内容前加上文件名,方便AI知道出处 file_name = os.path.basename(file_path) chunk_list = split_text(content) chunks.Extend([f"【来源:{file_name}】\n{c}" for c in chunk_list]) return chunks# =========================# 🚀 主程序# =========================def main(): # 1. 扫描文件并制作切片 # 如果想强制重新扫描,删除目录下的 kb_chunks.npy 即可 if os.path.exists(CHUNKS_FILE): print("✅ 检测到旧缓存,直接加载 (如需更新请删除 kb_chunks.npy)...") chunks = np.load(CHUNKS_FILE, allow_pickle=True).tolist() else: chunks = scan_files() if not chunks: print("❌ 没有找到有效内容,请检查文件夹里有没有文档!") return np.save(CHUNKS_FILE, np.array(chunks, dtype=object)) print(f"📦 共生成 {len(chunks)} 个文本块,准备向量化...") # 2. 初始化模型 model_name = "BAAI/bge-small-zh-v1.5" try: embedder = TextEmbedding(model_name=model_name) except: print("⚠️ 模型加载受阻,尝试自动修复...") cache_dir = os.path.join(os.getcwd(), ".fastembed") if os.path.exists(cache_dir): shutil.rmtree(cache_dir) embedder = TextEmbedding(model_name=model_name) # 3. 向量化并建立索引 print("🚀 正在将文本转化为向量 (如果是第一次运行,会自动下载模型,请耐心等待)...") embeddings = list(embedder.embed(chunks)) embeddings_np = np.array([list(e) for e in embeddings]).astype('float32') dim = embeddings_np.shape[1] index = faiss.IndexFlatIP(dim) index.add(embeddings_np) faiss.write_index(index, INDEX_FILE) print(f"🎉 知识库构建完成!索引文件: {INDEX_FILE}")if __name__ == "__main__": main()复制代码文件 2:chat_rag.py (开始对话) 这个脚本负责连接 Ollama 和刚才建好的知识库。
import osimport faissimport numpy as npimport ollamafrom fastembed import TextEmbedding# =========================# ⚙️ 配置区域# =========================os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"INDEX_FILE = "kb.index"CHUNKS_FILE = "kb_chunks.npy"# ⚠️ 如果你安装的是 7b 模型,请把下面这行改成 "deepseek-r1:7b"OLLAMA_MODEL = "deepseek-r1:14b" EMBED_MODEL = "BAAI/bge-small-zh-v1.5"def main(): if not os.path.exists(INDEX_FILE): print("❌ 没找到知识库!请先运行 build_kb.py") return print("⏳ 正在加载大脑...") index = faiss.read_index(INDEX_FILE) chunks = np.load(CHUNKS_FILE, allow_pickle=True).tolist() embedder = TextEmbedding(model_name=EMBED_MODEL) print("\n" + "="*40) print(f"🤖 本地AI知识库助手 ({OLLAMA_MODEL}) 已启动") print("💡 输入 'exit' 退出") print("="*40) while True: query = input("\n🙋 你的问题: ").strip() if query.lower() in ['exit', 'quit']: break if not query: continue # 1. 检索 print("🔍 正在翻阅资料...", end="\r") query_vec = list(embedder.embed([query]))[0] D, I = index.search(np.array([query_vec], dtype="float32"), k=4) context = [] for idx in I[0]: if idx >= 0: context.append(chunks[idx]) # 2. 生成 Prompt = f""" 基于以下资料回答问题。如果资料里没有提到,就说不知道,不要瞎编。 【资料】: {"\n---".join(context)} 【问题】:{query} """ print("\n🤖 DeepSeek 回答:") try: stream = ollama.chat(model=OLLAMA_MODEL, messages=[{'role': 'user', 'content': prompt}], stream=True) for chunk in stream: print(chunk['message']['content'], end='', flush=True) print("\n") except Exception as e: print(f"❌ 也就是这里出错了: {e}") print("请检查 Ollama 是否已在后台运行!")if __name__ == "__main__": main()复制代码
▶️ 第五步:运行起来!
1. 构建知识库
在命令窗口输入:
python build_kb.py复制代码
- 第一次运行会下载一个约 100MB 的向量模型(已配置国内镜像,很快)。
- 你会看到进度条在扫描你的文档。
- 显示 🎉 知识库构建完成! 就成功了。
python chat_rag.py复制代码
- 程序启动后,输入你的问题,比如:“总结一下Q4预算表的内容”、“2024年工作汇报里提到了什么”。
- 你会发现 AI 回答的内容完全是基于你文件夹里的文件!
文章版权声明:除非注明,否则均为AI虎哥的工具库原创文章,转载或复制请以超链接形式并注明出处。



还没有评论,来说两句吧...