当前位置: 首页 > news >正文

从零搭建 Python 版 RAG 智能问答知识库|本地离线文档检索大模型实战

目录

前言

一、RAG 核心原理与整体架构

1.1 RAG 工作流程

1.2 项目技术选型(轻量化首选)

二、项目环境依赖安装

2.1 批量安装所需依赖库

2.2 前置准备

三、通用文档加载工具类开发

3.1 多格式文档统一读取代码

四、文本切片 + 向量化 + 向量库持久化入库

4.1 完整知识库入库脚本

4.2 入库使用方法

五、核心 RAG 检索问答逻辑实现

5.1 完整 RAG 智能问答主程序

5.2 运行问答系统

六、核心功能拓展

6.1 切换不同本地大模型

6.2 调整检索精度与分片参数

6.3 清空重建向量知识库

七、常见问题与报错解决方案

问题 1:加载 PDF 文档乱码 / 读取为空

问题 2:嵌入模型下载缓慢

问题 3:Ollama 连接超时无法调用大模型

问题 4:问答结果依旧出现幻觉

问题 5:内存占用过高

八、项目商用优化方向

九、总结


前言

在日常工作与开发场景中,大量 PDF、Word、TXT、Markdown、业务手册、技术文档、规章制度等非结构化文档堆积,传统关键词搜索效率极低,无法实现语义理解、精准问答、内容总结、文档推理

RAG(检索增强生成)技术完美解决该痛点:先对私有文档进行文本拆分、向量化存入向量数据库,用户提问后先检索文档相关片段,再将检索内容拼接上下文送入大模型,让大模型只基于私有知识库回答,杜绝幻觉、精准贴合内部资料,同时实现离线本地部署、数据不外泄、私有化部署零接口费用。

本文从零开始手把手教大家使用纯 Python搭建完整商用级 RAG 智能问答知识库,包含文档加载、文本分割、向量化嵌入、向量库存储、相似度检索、大模型对话拼接、流式问答、完整项目封装全流程,全程附可直接运行源码,零基础也能搭建属于自己的私有 AI 知识库。

一、RAG 核心原理与整体架构

1.1 RAG 工作流程

  1. 文档解析阶段:读取本地 PDF/TXT/MD/Word 等各类格式文档
  2. 文本切片阶段:长文档按照固定长度 + 重叠分片拆分,避免上下文断裂
  3. 文本向量化:使用嵌入模型将文本转为多维向量
  4. 向量入库:向量与原文片段存入轻量级向量数据库持久化
  5. 用户提问:用户输入问题,问题同样转为向量
  6. 语义检索:向量库匹配相似度最高的知识库文本片段
  7. 提示词拼接:将检索内容 + 用户问题组合成限定 Prompt
  8. 大模型推理:送入本地 / 在线大模型生成精准答案
  9. 结果输出:返回基于私有文档的专属问答结果

1.2 项目技术选型(轻量化首选)

  • 框架核心:LangChain一站式 RAG 开发框架
  • 文档解析:PyPDF2、python-docx主流文档读取
  • 文本分割:RecursiveCharacterTextSplitter通用递归分词器
  • 嵌入模型:all-MiniLM-L6-v2轻量开源本地嵌入模型
  • 向量数据库:ChromaDB纯 Python 轻量向量库,无需额外部署服务
  • 大模型调用:对接本地 Ollama 部署 Llama3/Qwen/DeepSeek
  • 交互方式:控制台问答 + 简易 Web 问答

二、项目环境依赖安装

2.1 批量安装所需依赖库

打开 CMD 或终端执行以下一键安装命令

bash

运行

# 核心RAG框架 pip install langchain langchain-community langchain-ollama # 向量数据库 pip install chromadb # 文档解析依赖 pip install pypdf python-docx markdown # 嵌入模型依赖 pip install sentence-transformers # 网络请求与工具 pip install tqdm numpy

2.2 前置准备

  1. 本地提前部署 Ollama 大模型(参考上一篇 Windows 一键部署教程)
  2. 确保ollama服务正常运行,默认端口11434
  3. 新建项目文件夹,结构如下

plaintext

rag_knowledge_base/ ├── docs/ # 存放所有知识库文档 ├── vector_db/ # 向量数据库持久化存储目录 ├── load_docs.py # 文档入库脚本 ├── rag_chat.py # RAG智能问答主程序

三、通用文档加载工具类开发

支持TXT、PDF、Word、Markdown四种常用文档格式批量加载

3.1 多格式文档统一读取代码

python

运行

# utils_doc_loader.py import os from langchain_community.document_loaders import ( TextLoader, PyPDFLoader, Docx2txtLoader, UnstructuredMarkdownLoader ) # 定义文档格式映射 LOADER_MAP = { ".txt": TextLoader, ".pdf": PyPDFLoader, ".docx": Docx2txtLoader, ".md": UnstructuredMarkdownLoader } def load_all_documents(folder_path: str): """ 批量读取文件夹内所有支持格式文档 :param folder_path: 知识库文档文件夹路径 :return: 文档对象列表 """ all_docs = [] if not os.path.exists(folder_path): os.makedirs(folder_path) return all_docs for file_name in os.listdir(folder_path): file_suffix = os.path.splitext(file_name)[-1].lower() file_full_path = os.path.join(folder_path, file_name) if file_suffix in LOADER_MAP: try: loader = LOADER_MAP[file_suffix](file_full_path) docs = loader.load() all_docs.extend(docs) print(f"✅ 成功加载文档:{file_name}") except Exception as e: print(f"❌ 加载失败 {file_name}:{str(e)}") return all_docs

四、文本切片 + 向量化 + 向量库持久化入库

4.1 完整知识库入库脚本

python

运行

# load_docs.py from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import SentenceTransformerEmbeddings from langchain_community.vectorstores import Chroma from utils_doc_loader import load_all_documents # ===================== 全局配置 ===================== # 知识库文档目录 DOC_FOLDER = "./docs" # 向量数据库持久化路径 VECTOR_DB_PATH = "./vector_db" # 文本分片大小 CHUNK_SIZE = 800 # 分片重叠长度(保证上下文连贯) CHUNK_OVERLAP = 150 # 本地嵌入模型名称 EMBED_MODEL_NAME = "all-MiniLM-L6-v2" def build_knowledge_base(): # 1.加载所有文档 documents = load_all_documents(DOC_FOLDER) if not documents: print("未读取到任何知识库文档,请放入文件至docs目录!") return # 2.初始化文本分割器 text_splitter = RecursiveCharacterTextSplitter( chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP, separators=["\n\n", "\n", "。", ",", " ", ""] ) split_docs = text_splitter.split_documents(documents) print(f"📄 文档拆分完成,总分片数量:{len(split_docs)}") # 3.初始化本地嵌入模型 embedding = SentenceTransformerEmbeddings(model_name=EMBED_MODEL_NAME) # 4.构建并持久化向量数据库 chroma_db = Chroma.from_documents( documents=split_docs, embedding=embedding, persist_directory=VECTOR_DB_PATH ) # 持久化保存 chroma_db.persist() print("🎉 知识库向量化入库完成,向量库已本地持久化!") if __name__ == "__main__": build_knowledge_base()

4.2 入库使用方法

  1. 将 PDF/TXT/MD/DOCX 文档全部放入项目docs文件夹
  2. 直接运行python load_docs.py
  3. 自动完成加载、拆分、向量化、存入本地向量库
  4. 首次入库较慢,后续新增文档重新运行即可增量更新

五、核心 RAG 检索问答逻辑实现

5.1 完整 RAG 智能问答主程序

python

运行

# rag_chat.py from langchain_community.embeddings import SentenceTransformerEmbeddings from langchain_community.vectorstores import Chroma from langchain_ollama import OllamaLLM from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # ===================== 全局配置 ===================== VECTOR_DB_PATH = "./vector_db" EMBED_MODEL_NAME = "all-MiniLM-L6-v2" # 选择本地Ollama模型:llama3 / qwen / deepseek-coder LOCAL_LLM_MODEL = "llama3" # 检索匹配文档数量 RETRIEVE_TOP_K = 3 # 自定义RAG专属提示词(严控模型只参考知识库回答) RAG_PROMPT_TEMPLATE = """ 你是专业知识库智能问答助手,请严格依据下方提供的【知识库参考内容】回答用户问题。 1. 仅使用参考内容作答,禁止编造、禁止知识库外内容联想 2. 如果参考内容无法解答问题,直接回复:暂无相关知识库内容 3. 回答简洁清晰,条理分明,使用中文回复 知识库参考内容:{context} 用户提问:{question} 请给出精准回答: """ def init_rag_chain(): # 1.加载本地嵌入模型 embedding = SentenceTransformerEmbeddings(model_name=EMBED_MODEL_NAME) # 2.读取本地持久化向量库 vector_db = Chroma( persist_directory=VECTOR_DB_PATH, embedding_function=embedding ) # 3.构建相似度检索器 retriever = vector_db.as_retriever(search_kwargs={"k": RETRIEVE_TOP_K}) # 4.初始化本地大模型 llm = OllamaLLM(model=LOCAL_LLM_MODEL, temperature=0.1) # 5.封装自定义提示词 prompt = PromptTemplate( template=RAG_PROMPT_TEMPLATE, input_variables=["context", "question"] ) # 6.组装RAG问答链 rag_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": prompt}, return_source_documents=True # 返回引用知识库原文 ) return rag_chain def start_rag_chat(): print("===== Python私有RAG知识库智能问答系统 =====") print("输入问题即可问答,输入 exit 退出程序\n") rag_chain = init_rag_chain() while True: user_question = input("请输入你的问题:") if user_question.lower() in ["exit", "quit", "退出"]: print("已退出RAG问答系统") break result = rag_chain.invoke(user_question) print("\n🤖 AI知识库回答:") print(result["result"]) print("-" * 60) if __name__ == "__main__": start_rag_chat()

5.2 运行问答系统

bash

运行

python rag_chat.py

启动后直接输入文档内相关问题,模型会精准调取知识库内容作答,无知识库内容直接拒绝回答,彻底解决大模型幻觉问题。

六、核心功能拓展

6.1 切换不同本地大模型

只需修改LOCAL_LLM_MODEL参数即可一键切换

python

运行

LOCAL_LLM_MODEL = "qwen:7b" # 中文最优通义千问 LOCAL_LLM_MODEL = "deepseek-coder" # 代码知识库专用 LOCAL_LLM_MODEL = "llama3:8b" # 通用英文+通用问答

6.2 调整检索精度与分片参数

  • CHUNK_SIZE越大,单片段内容越多,适合长上下文文档
  • CHUNK_OVERLAP越大,分片连贯性越强,适合剧情、流程类文档
  • RETRIEVE_TOP_K数值越大,调取参考文档越多,答案越全面

6.3 清空重建向量知识库

直接删除项目内vector_db整个文件夹,重新执行入库脚本即可全新构建知识库。

七、常见问题与报错解决方案

问题 1:加载 PDF 文档乱码 / 读取为空

解决:更换pdfplumber加载器,替换原有 PyPDFLoader,适配加密、扫描版 PDF

问题 2:嵌入模型下载缓慢

解决:手动下载all-MiniLM-L6-v2模型放置本地路径,指定本地模型路径加载

问题 3:Ollama 连接超时无法调用大模型

解决:确认 Ollama 服务正常启动,关闭防火墙,本地测试ollama run 模型名是否可用

问题 4:问答结果依旧出现幻觉

解决:收紧 Prompt 约束,调低 temperature 温度值至 0.05 以内,增加检索片段数量

问题 5:内存占用过高

解决:减小分片大小、使用轻量化嵌入模型、选用 3B 轻量级本地大模型

八、项目商用优化方向

  1. 搭建 Web 界面:结合 Gradio/Flask 搭建网页版知识库问答系统
  2. 接入 RAG 流式输出:实现打字机实时回复效果
  3. 添加文档管理后台:实现网页上传文档自动入库
  4. 多轮对话记忆:整合 LangChain 对话记忆组件,实现连续上下文问答
  5. 部署内网服务:将 RAG 项目部署至服务器,公司局域网全员共用知识库
  6. PDF 图片 OCR 解析:集成 PaddleOCR 实现图片类文档文字提取入库

九、总结

本文基于纯 Python+LangChain+ChromaDB + 本地开源大模型搭建了一套轻量化、低成本、可私有化部署的完整 RAG 智能问答知识库系统,摆脱第三方 AI 接口依赖,所有数据全部本地存储,完全满足企业内网文档问答、个人学习知识库、业务手册智能检索、技术资料答疑等场景。

整套项目代码无冗余、结构清晰、开箱即用,新手可直接运行部署,开发者可在此基础上快速迭代成商用级 AI 知识库平台。RAG 作为目前落地最快的 AI 应用方案,掌握该架构可快速切入企业 AI 私有化项目开发。

http://www.jsqmd.com/news/843557/

相关文章:

  • 2025-2026年全球重卡充电桩品牌推荐:五大排名厂家专业评测矿区应对恶劣环境 - 品牌推荐
  • vscode-R完全生存手册:从RStudio到现代开发环境的无缝迁移指南
  • 拉格朗日乘子法针对传统代入求解的优势
  • 2026年5月有实力的哈尔滨医学专升本机构哪家强厂家推荐榜:医学类专业专升本培训机构选择指南 - 海棠依旧大
  • 如何在5分钟内掌握Blender 3MF插件:3D打印工作流终极指南
  • 橡塑保温棉产品靠谱吗?廊坊德亿节能科技为你揭秘 - 工业品牌热点
  • ARM Linux电子墨水屏驱动开发:从FUSE接口到Python应用实践
  • 2025-2026年国内电动阀门厂家推荐:十大排行产品专业评测应对水处理高腐蚀介质痛点 - 品牌推荐
  • 对比直接使用厂商API在Taotoken平台管理密钥的便利性
  • 影刀RPA跨境店群运营架构实战:Python协同多实例隔离与高并发任务调度系统
  • AI摘要API接口调用接入实战指南,避坑攻略(附代码)
  • 靠谱的朋友圈广告公司,如何选择与收费标准 - 工业品牌热点
  • GHelper技术深度解析:华硕硬件控制的轻量化革命与架构创新
  • 即食海参的选购指南,百年晓芹值得选吗 - mypinpai
  • 情绪消费崛起,打通全链路的不是卖点,而是选择理由
  • 别让Stateflow代码生成翻车!MAB建模规范中那些容易被忽略的‘坑’与最佳实践
  • 【NotebookLM强化学习辅助实战指南】:20年AI架构师亲授5大落地场景与避坑清单
  • 状态机——事件流中带时间窗口的事件合成
  • 如何一键检测微信单向好友:WechatRealFriends微信好友关系检测工具完整指南
  • 基于TensorFlow.js与Colab的浏览器端实时目标检测实践
  • 算力基石:CPU、GPU与嵌入式AI的技术逻辑与融合发展
  • NotebookLM重复检测失效真相:为什么92%的用户漏掉这4个关键配置参数?
  • iPhone内移植RFID公交卡:破解金属屏蔽,实现物理刷卡
  • 为什么你的NotebookLM总漏掉核心结论?资深技术传播者揭秘“语义锚定”生成法(仅限前500名开发者掌握)
  • GEO优化选购指南:靠谱品牌与价格分析 - 工业品牌热点
  • 2026年冰袋冰晶粉厂家大揭秘,究竟藏着哪些行业秘密?
  • 解读 A Survey of Data Agents:AI 界的 SAE J3016
  • 日志分析这件事,有了 ELK 才能真正做到可搜索、可视化、可预警
  • LangChain 从入门到实战:大模型应用开发全流程教程
  • 声源定位技术与GCC-PHAT算法详解