可直接运行的 RAG 本地文档问答机器人(完整项目)
🔥 RAG 本地文档问答机器人(完整项目)
这是纯本地运行、无需API、开箱即用的完整RAG项目,复制代码→放PDF→运行→就能问答,面试/作品集直接用。
一、项目说明
-
功能:上传本地PDF,AI 精准回答文档里的内容(私有数据安全) -
技术栈:PyTorch + Hugging Face + LangChain + Chroma 向量库 -
环境:Windows/Mac/Linux 通用,CPU 也能跑(GPU更快) -
无需联网:模型本地运行,数据不上传云端
二、一键安装依赖(复制运行)
pip install torch transformers langchain chromadb pypdf sentence-transformers accelerate faiss-cpu
三、完整可运行代码(直接复制)
新建一个 rag_chatbot.py 文件,把下面代码全粘进去:
# ===================== RAG 本地文档问答机器人(完整版)=====================from langchain.document_loaders import PyPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.llms import HuggingFacePipelinefrom langchain.chains import RetrievalQAfrom transformers import AutoTokenizer, AutoModelForCausalLM, pipelineimport torch# ---------------------- 1. 配置参数(直接用,不用改)----------------------# 本地 embedding 模型(生成向量)EMBEDDING_MODEL = "all-MiniLM-L6-v2"# 本地大模型(轻量快速,CPU可跑)LLM_MODEL = "qwen2-0.5b-instruct"# PDF 文档路径(把你的PDF放在同一文件夹,改这里!)PDF_PATH = "test.pdf"# 向量数据库持久化路径DB_PATH = "chroma_db"# ---------------------- 2. 加载并切割PDF ----------------------defload_pdf(file_path): print(f"正在加载PDF:{file_path}") loader = PyPDFLoader(file_path) documents = loader.load()# 切割文本(防止过长,RAG核心步骤) text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, length_function=len ) splits = text_splitter.split_documents(documents) print(f"PDF切割完成,共 {len(splits)} 段文本")return splits# ---------------------- 3. 创建向量数据库 ----------------------defcreate_vector_store(splits): print("正在创建本地向量库...")# Hugging Face 本地 embedding embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)# 构建 Chroma 向量库 vectordb = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory=DB_PATH ) vectordb.persist() print("向量库创建完成!")return vectordb# ---------------------- 4. 加载本地大模型 ----------------------defload_local_llm(): print("正在加载本地大模型...") tokenizer = AutoTokenizer.from_pretrained(LLM_MODEL) model = AutoModelForCausalLM.from_pretrained( LLM_MODEL, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True )# 创建推理管道 pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512, temperature=0.1, top_p=0.95, repetition_penalty=1.1 ) llm = HuggingFacePipeline(pipeline=pipe) print("大模型加载完成!")return llm# ---------------------- 5. 构建 RAG 问答链 ----------------------defbuild_rag_chain(llm, vectordb): print("构建RAG问答系统...") qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectordb.as_retriever(search_kwargs={"k": 3}), return_source_documents=True )return qa_chain# ---------------------- 6. 启动问答 ----------------------defchat_loop(qa_chain): print("\n" + "="*50) print("🎉 RAG 问答机器人已启动!输入 'quit' 退出") print("="*50)whileTrue: query = input("\n请输入你的问题:")if query.lower() == "quit": print("👋 退出程序!")break# 执行问答 result = qa_chain({"query": query}) answer = result["result"] print("\n🤖 AI 回答:") print(answer)# ===================== 主程序入口 =====================if __name__ == "__main__":# 1. 加载PDF splits = load_pdf(PDF_PATH)# 2. 创建向量库 vectordb = create_vector_store(splits)# 3. 加载大模型 llm = load_local_llm()# 4. 构建RAG链 qa_chain = build_rag_chain(llm, vectordb)# 5. 启动对话 chat_loop(qa_chain)
四、3步运行教程(零操作门槛)
第1步:准备PDF
把你要问答的PDF文件,重命名为 test.pdf,和代码放在同一个文件夹。
第2步:运行代码
python rag_chatbot.py
第3步:开始问答
-
首次运行会自动下载模型(几百MB,很快) -
加载完成后,直接输入问题提问 -
输入 quit退出
五、项目效果演示
正在加载PDF:test.pdfPDF切割完成,共 42 段文本正在创建本地向量库...向量库创建完成!正在加载本地大模型...大模型加载完成!==================================================🎉 RAG 问答机器人已启动!输入 'quit' 退出==================================================请输入你的问题:这份文档主要讲了什么内容?🤖 AI 回答:这份文档是XX产品使用手册,主要介绍了安装步骤、功能说明、常见问题解决方法...
六、超实用优化(可选)
-
换更大模型:把 LLM_MODEL改成qwen2-1.8b-instruct回答更精准 -
换文档:直接修改 PDF_PATH路径,支持任意PDF -
GPU加速:有N卡会自动调用,速度提升10倍
七、就业/面试亮点
✅ 纯本地私有化部署(企业最看重) ✅ 完整RAG流程(加载→切割→向量库→问答) ✅ 主流技术栈(PyTorch+HuggingFace+LangChain) ✅ 可直接演示(面试打开就能跑)
夜雨聆风