作者:熊大科技君

摘要 

 大模型时代,每个人都想把私有文档(笔记、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 部署、多模态知识库等实战内容。   

更多推荐