零基础实战:用 Python+RAG 搭建本地知识库问答(附完整代码)
作者:熊大科技君
摘要
大模型时代,每个人都想把私有文档(笔记、PDF、手册)做成可问答的知识库。本文带你用 Python + LangChain + 本地 Embedding + 本地大模型,从零搭建一套完全离线、免费、可私有化部署的 RAG 问答系统,全程无付费接口、无需 GPU,普通电脑就能跑,附完整可运行代码与详细注释。
关键词
RAG;LangChain;本地知识库;Python;大模型;私有化部署
一、为什么要做本地 RAG?
- 数据不上云,隐私安全- 完全免费,无 API 费用
- 文档可控,随时更新知识库
- 适合个人笔记、公司内部文档、学习资料问答
技术栈:
- LangChain:链路编排
- sentence-transformers:本地 Embedding
- FAISS:向量库(轻量快)
- llama.cpp / Qwen-7B:本地大模型(任选)
二、环境安装
pip install langchain langchain-community sentence-transformers faiss-cpu python-dotenv
三、完整代码(可直接运行)
1. 目录结构
./docs/ # 放你的 txt/md 文档
./models/ # 放本地模型(可选)
app.py # 主程序
2.app.py
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import LlamaCpp # 本地大模型
# ---------------------- 1. 加载文档 ----------------------
loader = TextLoader("./docs/你的文档.txt", encoding="utf-8")
documents = loader.load()
# ---------------------- 2. 分割文本 ----------------------
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)
# ---------------------- 3. 本地 Embedding ----------------------
embeddings = HuggingFaceEmbeddings(
model_name="all-MiniLM-L6-v2" # 轻量、快、免费
)
# ---------------------- 4. 构建向量库 ----------------------
db = FAISS.from_documents(texts, embeddings)
db.save_local("faiss_index") # 保存索引,下次直接加载
# ---------------------- 5. 加载本地大模型 ----------------------
llm = LlamaCpp(
model_path="./models/qwen-7b-chat.ggmlv3.q4_0.bin", # 你的本地模型路径
temperature=0.7,
max_tokens=2048,
top_p=1
)
# ---------------------- 6. 构建 RAG 链 ----------------------
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# ---------------------- 7. 问答测试 ----------------------
if __name__ == "__main__":
while True:
question = input("\n请输入问题(输入 exit 退出):")
if question.lower() == "exit":
break
result = qa_chain.invoke({"query": question})
print("\n答案:", result["result"])
print("\n参考来源:")
for idx, doc in enumerate(result["source_documents"]):
print(f"{idx+1}. {doc.metadata['source']}")
四、准备本地模型(免费)
1. 下载开源模型(如 Qwen-7B、Llama 2、Chinese-Alpaca)
2. 转成 GGML 量化格式(llama.cpp 可用)
3. 放到 ./models/ 目录,修改代码里 model_path
不想折腾模型?可先把 llm 换成 OpenAI 接口调试,后续再切本地。
五、效果演示 把你的笔记/教程放到 ./docs/ ,运行:
python app.py
提问:
请总结这篇文档的核心内容这个接口的参数有哪些?
模型会基于你的文档精准回答,并给出参考来源。
六、常见问题
1. 报错“找不到模型”:检查 model_path 路径和文件是否存在
2. 回答乱码/中文差:换中文模型(如 Qwen、通义千问)
3. 速度慢:缩小 chunk_size 、用更小 Embedding 模型、量化模型到 4bit
七、扩展方向
- 支持 PDF/Word 加载(用 PyPDFLoader 、 UnstructuredLoader )
- 加 Web 界面(Gradio / Streamlit,一行代码部署)
- 多文档目录自动加载
- 对接企业知识库、私有 API
本文作者熊大科技君带你用 Python 快速落地一套完全离线、免费、私有化的 RAG 知识库问答系统,代码开箱即用,适合个人学习与小团队内部文档问答。关注我,后续更新:RAG 优化技巧、Web 部署、多模态知识库等实战内容。
更多推荐

所有评论(0)