【小白零基础】RAG+LangChain 搭建私有知识库问答系统(完整可运行代码+超详细教程+避坑指南)
收藏⭐ + 点赞👍 + 关注✅ 零基础入门大模型RAG应用,保姆级教程,新手零翻车!
哈喽大家好!很多刚入门大模型的小伙伴都有一个疑问:如何让AI学习自己的私有资料?
我们平时用的ChatGPT、通义千问等大模型,知识都是滞后的,而且无法读取我们本地的PDF、笔记、公司文档、学习资料。想要实现私有文档问答、精准答疑、杜绝AI幻觉,最主流、最简单的方案就是 RAG检索增强生成。
今天我将用最通俗的小白视角,从零讲解 RAG+LangChain 核心原理,手把手带你搭建一套可直接落地的本地私有知识库问答系统。
全文无废话、原理通俗、代码完整、注释详尽、全程避坑,新手跟着步骤100%跑通!
一、前置科普:小白必懂核心概念(看不懂算我输)
很多新手直接抄代码,跑通了却不知道原理,稍微报错就束手无策。这里用大白话讲清楚两个核心技术:
1.1 什么是RAG?(检索增强生成)
传统大模型的弊端:知识滞后、无法读取私有数据、容易一本正经胡说八道(AI幻觉)。
RAG的核心逻辑:先检索、后生成
不依赖大模型固有知识,而是先从你的私有文档中检索相关内容,再把内容交给大模型,让大模型基于真实资料回答,从根源解决幻觉问题。
RAG完整工作流程:文档入库 → 文本向量化存储 → 用户提问 → 相似内容检索 → 大模型结合素材生成答案
1.2 什么是LangChain?
LangChain 是大模型应用开发最主流框架,封装了文档加载、文本分割、向量检索、问答链路等所有复杂逻辑。
不用我们手写复杂的向量计算、匹配算法,几行代码就能快速搭建完整RAG应用,是新手入门RAG的首选工具!
1.3 整体架构流程图(小白秒懂)
本地私有文档(TXT/PDF/DOCX) → 文档加载 → 智能文本分块 → 嵌入模型向量化 → Chroma本地向量库存储 → 问题向量化检索 → 大模型精准问答
二、项目优势(为什么选这套方案?)
-
完全私有安全:文档、向量库全部本地存储,不上传公网,杜绝数据泄露
-
零深度学习门槛:无需训练模型,无需GPU,普通电脑CPU即可运行
-
多格式兼容:支持TXT、PDF、Word文档,日常资料全覆盖
-
杜绝AI幻觉:严格限定基于私有文档回答,无资料则如实告知
-
低成本免费:嵌入模型本地离线运行,大模型使用免费额度即可测试
三、环境准备(精准版本,杜绝报错)
为避免版本冲突、运行报错,本文统一使用稳定版依赖库,直接复制终端执行即可。
3.1 安装全套依赖包
# 核心LangChain框架
pip install langchain==0.2.0
pip install langchain-community==0.2.0
# 轻量级本地向量数据库(无需部署,开箱即用)
pip install chromadb==0.5.0
# 多格式文档解析工具
pip install pypdf==4.0.0 python-docx==1.1.0
# 本地离线嵌入模型(文本转向量,无需联网)
pip install sentence-transformers==2.2.2
3.2 大模型API准备(免费可用)
本项目采用阿里云通义千问,个人用户拥有永久免费额度,稳定性强、响应速度快,适合新手测试。
获取步骤:
-
打开阿里云百炼平台,注册/登录账号
-
进入「API-KEY管理」,创建并复制专属KEY
-
妥善保存,后续代码核心配置需要用到
四、完整项目代码(超详细注释,可直接商用)
新建Python文件,命名为 private_rag_qa.py,下方代码全量复制即可,所有关键位置均添加小白专属注释。
import os
from langchain_community.document_loaders import TextLoader, PyPDFLoader, Docx2txtLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.llms import Tongyi
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
# ===================== 【小白专属配置区,仅需修改这里】 =====================
# 1. 通义千问API密钥(替换为自己的)
os.environ["DASHSCOPE_API_KEY"] = "你的阿里云通义千问API-KEY"
# 2. 你的私有文档路径(支持txt/pdf/docx)
FILE_PATH = "knowledge.txt"
# 3. 本地向量数据库存储文件夹(自动创建,无需手动新建)
CHROMA_DB_PATH = "./chroma_local_db"
# ===================== 1. 多格式文档通用加载函数 =====================
def load_private_document(file_path: str):
"""
自动识别文档格式并加载内容
:param file_path: 本地文档路径
:return: 加载后的文档对象
"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"错误:未找到文档【{file_path}】,请检查文件路径!")
# 匹配不同文档加载器
if file_path.endswith(".txt"):
loader = TextLoader(file_path, encoding="utf-8")
elif file_path.endswith(".pdf"):
loader = PyPDFLoader(file_path)
elif file_path.endswith(".docx"):
loader = Docx2txtLoader(file_path)
else:
raise ValueError("暂仅支持 TXT / PDF / DOCX 格式文档!")
doc_data = loader.load()
print(f"✅ 文档加载成功!累计加载段落数:{len(doc_data)}")
return doc_data
# ===================== 2. 智能文本分块函数(核心优化点) =====================
def split_text_content(doc_data):
"""
将长文本切分为小块,解决大模型上下文长度限制
chunk_size: 单块文本最大长度
chunk_overlap: 块重叠长度,保证上下文语义连贯
"""
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 单块文本字数
chunk_overlap=50, # 相邻块重叠50字,避免语义断裂
length_function=len,
separators=["\n\n", "\n", "。", ",", " "] # 优先按语义分割
)
split_docs = text_splitter.split_documents(doc_data)
print(f"✅ 文本分块完成!共生成{len(split_docs)}个语义片段")
return split_docs
# ===================== 3. 本地向量数据库构建/加载 =====================
def build_vector_database(split_docs):
"""
将文本片段转为向量,存入本地Chroma数据库
优势:一次构建,多次复用,无需重复解析文档
"""
# 加载本地离线嵌入模型(免费、无网络依赖)
embedding_model = HuggingFaceEmbeddings(
model_name="all-MiniLM-L6-v2",
model_kwargs={"device": "cpu"}, # 适配所有电脑,无需GPU
encode_kwargs={"normalize_embeddings": True}
)
# 存在向量库则直接加载,不存在则新建
if os.path.exists(CHROMA_DB_PATH):
vector_db = Chroma(
persist_directory=CHROMA_DB_PATH,
embedding_function=embedding_model
)
print("✅ 成功加载已有本地向量库")
else:
vector_db = Chroma.from_documents(
documents=split_docs,
embedding=embedding_model,
persist_directory=CHROMA_DB_PATH
)
vector_db.persist() # 持久化保存到本地
print("✅ 向量数据库构建完成,已保存至本地!")
return vector_db
# ===================== 4. 构建RAG问答核心链路 =====================
def create_rag_chain(vector_db):
"""
初始化大模型 + 自定义提示词 + 检索问答链路
"""
# 初始化通义千问大模型
llm = Tongyi(
五、手把手运行教程(新手零失误)
5.1 准备私有知识库文件
在代码同级目录,新建 knowledge.txt 文件,写入你的私有资料,示例内容:
# 公司员工手册(示例知识库)
1. 上班时间:周一至周五 9:00-18:00,午休12:00-13:00
2. 请假规则:事假需提前1天申请,病假需提供就医证明
3. 薪资发放:每月15日发放上月薪资,法定节假日自动顺延
4. 加班福利:工作日1.5倍薪资,周末2倍薪资,法定节假日3倍薪资
5. 考勤要求:月度迟到3次以上,扣除全勤奖
5.2 核心配置修改
仅需修改两处内容:
-
将
你的阿里云通义千问API-KEY替换为自己的密钥 -
确认
FILE_PATH和你的文档名称、格式一致
5.3 运行项目 & 效果测试
直接运行代码,首次运行会自动下载本地嵌入模型,耐心等待即可。
实测运行效果:
✅ 文档加载成功!累计加载段落数:1
✅ 文本分块完成!共生成1个语义片段
✅ 向量数据库构建完成,已保存至本地!
✅ RAG私有问答系统初始化完成!
========== 私有知识库问答系统(输入 exit 退出)==========
🙋 请输入你的问题:公司什么时候发工资?
🤖 AI标准答案:每月15日发放上月薪资,法定节假日自动顺延
🙋 请输入你的问题:公司下午茶几点开始?
🤖 AI标准答案:抱歉,当前知识库中未查询到相关信息
可以看到:有资料精准回答,无资料绝不瞎编,完美解决AI幻觉!
六、高频报错问题 & 终极解决方案(新手必看)
6.1 报错:文件找不到 FileNotFoundError
原因:文档路径错误、文件名称大小写不匹配
解决:将文档和代码放在同一文件夹,直接写文件名,不要写绝对路径
6.2 首次运行模型下载慢/下载失败
原因:境外模型源访问不稳定
解决:切换国内镜像源,或手动下载模型放入本地缓存目录
6.3 答案不准确、答非所问
-
调小
chunk_size=300,让文本片段更精细 -
修改
k=5,检索更多相关内容 -
优化提示词,增加更严格的约束条件
6.4 中文乱码问题
解决:TXT文件保存格式设置为 UTF-8 编码
七、项目优化与进阶拓展方向
本项目是极简基础版,可基于此快速迭代进阶功能:
-
多文档批量加载:遍历文件夹,自动导入所有知识库文件
-
Web可视化界面:结合Gradio/Streamlit搭建网页问答窗口
-
增量更新知识库:新增文档无需重建整个向量库
-
替换本地大模型:对接Qwen、Llama3等本地模型,实现完全离线部署
-
对话记忆功能:支持多轮上下文连续问答
八、全文总结
本文基于 LangChain + Chroma + 本地嵌入模型 + 通义千问大模型,搭建了一套轻量化、零成本、高安全的私有RAG知识库问答系统。
核心亮点总结:
-
原理通俗、代码极简,新手零基础可落地
-
本地存储数据,彻底保障私有资料安全
-
严格约束回答逻辑,彻底杜绝AI幻觉
-
多格式文档适配,适配学习、工作、企业多种场景
附录:核心知识点思维导图
RAG核心流程:文档加载 → 语义分块 → 文本向量化 → 向量库存储 → 相似检索 → LLM智能问答
核心组件:文档加载器 + 文本分割器 + 嵌入模型 + 向量数据库 + 大模型 + 提示词工程
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)