手把手教:LangChain+Qwen3搭建本地RAG问答系统,从0到1全流程
本文将带大家从零开始,用LangChain框架整合Qwen3大模型与BGE-M3嵌入模型,手戳一个可本地运行的端到端RAG系统。无需复杂云服务,只需一台带GPU的电脑,就能拥有专属的“文档问答机器人”。
在大模型这个时期,“私有化部署”以及“个性化问答”成了企业和开发者的关键需求。要是想让AI根据特定的文档(像公司手册、技术文档、学术论文等)来回答问题,并且还担忧数据隐私会被泄漏出去,那检索增强生成(RAG就是最棒的解决办法。
本文将带大家从零开始,用LangChain框架整合Qwen3大模型与BGE-M3嵌入模型,手戳一个可本地运行的端到端RAG系统。无需复杂云服务,只需一台带GPU的电脑,就能拥有专属的“文档问答机器人”。


为什么选择RAG?聊聊大模型的“知识痛点”
01
在正式动手前,我们先搞懂一个核心问题:为什么需要RAG?
大模型像GPT-4和Qwen这类的呢,虽然可以应对很多很多的通用问题,可是它们有两个特别要命的缺点:
1.知识时效性不太好:训练数据截止到某个特定的时间(就像Qwen3训练数据截止到2024年初那样),没办法获取最新的信息;
2.个性化能力弱:无法理解企业内部文档、个人笔记等私有数据;
3.易产生“幻觉”:对不确定的问题会编造看似合理的答案,无法溯源信息来源。
而RAG通过“检索生成”的组合完美解决这些问题:
-
检索:从本地文档库中精准找到与问题相关的片段;
-
生成:让大模型基于检索到的“事实依据”回答问题,确保答案准确、可溯源
直接讲RAG就像是给大模型安上了一个本地的知识仓库,既能让大模型具备语言理解的能力,又能把数据隐私和知识专属的问题给解决了。

技术选型:为什么是LangChain+Qwen3+BGEM3?
02
搭建RAG系统得有三大关键组件,分别是文档处理框架、大语言模型(LLM以及嵌入模型(Embedding)。我们在选择这些组件时,主要从“本地化、对中文友好、资源消耗低”这个方面去考虑的:
| 组件类型 | 选型 | 核心优势 |
|---|---|---|
| 文档处理框架 | LangChain | 一站式整合文档加载、分割、向量存储、检索链,降低开发门槛 |
| 大语言模型(LLM) | Qwen3-7B-Instruct | 阿里达摩院开源模型,中文处理能力强,7B 参数支持 4 位量化,本地 GPU 可运行 |
| 嵌入模型(Embedding) | BAAI/bge-m3 | 中科院自动化所开源,中文嵌入效果顶尖,支持检索优化指令,精度高于传统模型 |
| 向量数据库 | Chroma | 轻量级本地向量库,无需复杂部署,支持持久化存储,适配 LangChain |
除此之外,我们还用到BitsAndBytes量化技术,将Qwen3-7B模型压缩到4位精度,原本需要24GB显存的模型,现在8GB显存就能运行,大大降低硬件门槛。

手把手搭建:从环境准备到代码实现
03
接着开始实战部分啦,咱们把RAG系统搭建分成4步来进行,每一步都有着详细的讲解呢,就算是新手也能够很顺畅地跟得上哟。
3.1 环境准备:安装依赖库
先确定你的电脑已安装了Python3.8以及更高版本,与此同时拥有NVIDIAGPU(显存最好大于或等于8GB)。接着打开终端,接着执行以下这些命令来安装依赖:
# 基础依赖pip install langchain chromadb transformers torch# 文档加载与处理pip install sentence-transformers python-dotenv# 量化相关(4位量化需要)pip install bitsandbytes accelerate# 可选:如果需要处理PDF/Word文档,安装额外加载器pip install pypdf python-docx
3.2 核心代码解析:从配置到问答的全流程
我们的代码分为5个核心模块:配置类、RAG系统初始化、文档处理、向量库加载、问答交互。下面逐模块拆解,理解每个环节的作用。
- 配置类:统一管理参数,便于修改
先对Config类进行定义,把文档路径、模型名称、量化配置等这些参数都集中到一起进行管理,这样之后要是需要修改的话,就不用到处去寻找代码啦:
classConfig: # 文档相关:指定文档存放目录、分块大小 DOCUMENTS_DIR = "documents"# 本地文档目录(需手动创建) CHUNK_SIZE = 500 # 每个文本块的字符数(中文适配) CHUNK_OVERLAP = 50 # 块间重叠字符数(避免分割丢失上下文) # 模型相关:指定嵌入模型和LLM EMBEDDING_MODEL_NAME = "BAAI/bge-m3"# 中文嵌入效果顶尖 LLM_MODEL_NAME = "Qwen/Qwen3-7B-Instruct"# 中文友好的7B模型 # 检索相关:向量库存储路径、检索数量 VECTOR_DB_DIR = "vector_db_qwen_bge_m3"# 向量库持久化目录 TOP_K = 3 # 每次检索返回3个相关片段 # 量化配置:降低显存占用 USE_4BIT_QUANTIZATION = True # 启用4位量化(8GB显存必备)
- RAG系统初始化:加载嵌入模型与LLM
RAGSystem类是核心,负责初始化嵌入模型和LLM,这是系统的“大脑”和“眼睛”:
. 嵌入模型BGEM3):将文本转化为向量数字),用于后续检索
- LLM(Qwen3):基于检索到的文本片段生成自然语言回答
(1)初始化嵌入模型:给文本“编数字”
BGEM3有一个关键优化:支持查询指令,能让查询向量更精准。例如在生成查询向量时,添加“为这个句子生成表示以用于检索相关文章:”前缀提升检索命中率:
def_init_embeddings(self): print(f"加载BGE-M3嵌入模型: {self.config.EMBEDDING_MODEL_NAME}") # BGE-M3专属查询指令,优化中文检索效果 query_instruction = "为这个句子生成表示以用于检索相关文章:" return HuggingFaceBgeEmbeddings( model_name=self.config.EMBEDDING_MODEL_NAME, model_kwargs={'device': 'cuda'if torch.cuda.is_available() else'cpu'}, encode_kwargs={'normalize_embeddings': True}, # 向量归一化,提升检索精度 query_instruction=query_instruction )
(2)初始化LLM:给系统“装大脑”
Qwen3-7B模型默认需要24GB显存,我们通过4位量化将其压缩到8GB以内。这个时候Qwen有专属的提示词格式(<|im_start|>/<|im_end|>),需要自定义格式函数适配:
def_init_llm(self): print(f"加载Qwen3模型: {self.config.LLM_MODEL_NAME}") # 4位量化配置:关键优化,降低显存占用 quantization_config = None if self.config.USE_4BIT_QUANTIZATION and torch.cuda.is_available(): quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, # 双重量化,进一步压缩 bnb_4bit_quant_type="nf4", # 适配大模型的量化类型 bnb_4bit_compute_dtype=torch.float16 ) # 加载tokenizer和模型(device_map="auto"自动分配GPU/CPU) tokenizer = AutoTokenizer.from_pretrained(self.config.LLM_MODEL_NAME) model = AutoModelForCausalLM.from_pretrained( self.config.LLM_MODEL_NAME, quantization_config=quantization_config, device_map="auto", torch_dtype=torch.float16, trust_remote_code=True# 加载Qwen的自定义代码 ) # Qwen专属提示词格式:必须严格遵循,否则模型无法正常响应 defqwen_prompt_format(prompt): returnf"<|im_start|>system\n你是一个 helpful 的助手,基于提供的上下文回答问题。<|im_end|>\n<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n" # 创建文本生成pipeline,包装成LangChain的LLM pipe = pipeline( "text-generation", model=model, tokenizer=tokenizer, max_new_tokens=500, # 最大生成500个字符 temperature=0.7, # 随机性:0=严谨,1=灵活 repetition_penalty=1.1, # 避免重复生成 pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id, prompt_format_template=qwen_prompt_format ) return HuggingFacePipeline(pipeline=pipe)
- 文档处理:从“原始文档”到“向量库”
文档处理是RAG的“地基”,直接影响检索精度。这一步分为3个关键操作:加载文档→分割文档→创建向量库。
(1) 加载文档:支持多格式(TXT/PDF/Word)
我们用DirectoryLoader批量加载documents目录下的文档,默认支持TXT格式,若需处理PDF/Word,只需替换loader\_cls为PyPDFLoader/Docx2txtLoader:
defload_and_process_documents(self): start_time = time.time() # 加载文档:glob="*.txt"指定只加载TXT文件 loader = DirectoryLoader( self.config.DOCUMENTS_DIR, glob="*.txt", loader_cls=TextLoader, loader_kwargs={"encoding": "utf-8"} # 解决中文乱码问题 ) documents = loader.load() ifnot documents: raise ValueError(f"请在 {self.config.DOCUMENTS_DIR} 目录中添加文档") print(f"成功加载 {len(documents)} 个文档")
(2)分割文档:中文适配的“黄金分割点”
大模型有上下文长度限制(如Qwen3-7B支持8k tokens),若直接将长文档传入,会丢失上下文。我们用RecursiveCharacterTextSplitter按中文标点分割,避免将完整句子切散:
# 分割文档:按“段落→句子→标点”分层分割,保留中文语义text_splitter = RecursiveCharacterTextSplitter( chunk_size=self.config.CHUNK_SIZE, chunk_overlap=self.config.CHUNK_OVERLAP, separators=["\n\n", "\n", "。", ",", ";", "、", " ", ""] # 中文优先分割符)texts = text_splitter.split_documents(documents)print(f"文档分割完成,得到 {len(texts)} 个文本块")
(3)创建向量库:将文本块“存入数据库”
用Chroma向量库存储文本块的向量,后续检索时,只需将问题转化为向量,与库中的向量计算相似度,就能快速找到相关片段:
# 创建并持久化向量库:下次运行可直接加载,无需重新处理self.vector_db = Chroma.from_documents( documents=texts, embedding=self.embeddings, persist_directory=self.config.VECTOR_DB_DIR)self.vector_db.persist()# 创建检索链:将“检索”与“生成”串联self.qa_chain = RetrievalQA.from_chain_type( llm=self.llm, chain_type="stuff", # 简单高效:将所有相关片段传入LLM retriever=self.vector_db.as_retriever(search_kwargs={"k": self.config.TOP_K}), return_source_documents=True# 返回源文档,便于溯源)end_time = time.time()print(f"文档处理完成,耗时 {end_time - start_time:.2f} 秒")
- 问答交互:从“问题”到“答案”的闭环
最后,实现query方法,接收用户问题,调用检索链生成答案,并返回源文档片段(便于验证答案准确性):
defquery(self, question: str): ifnot self.qa_chain: raise ValueError("请先加载文档或向量库") start_time = time.time() print(f"处理查询: {question}") # 执行检索增强生成:先检索相关片段,再生成答案 result = self.qa_chain({"query": question}) end_time = time.time() print(f"查询处理完成,耗时 {end_time - start_time:.2f} 秒") return result
- 主函数:一键运行系统
在if name == "main":中,我们实现“自动创建示例文档→初始化系统→加载向量库→测试问答”的全流程:
if __name__ == "__main__": os.environ["TOKENIZERS_PARALLELISM"] = "false"# 避免tokenizer并行警告 # 初始化配置与系统 config = Config() rag_system = RAGSystem(config) # 首次运行:创建示例文档(数据科学、LLM应用相关) ifnot os.listdir(config.DOCUMENTS_DIR): print("创建示例文档...") create_sample_documents(config.DOCUMENTS_DIR) # 加载向量库:存在则直接加载,不存在则重新处理文档 ifnot rag_system.load_existing_vector_db(): rag_system.load_and_process_documents() # 测试中文问答 test_questions = [ "数据科学工作流包括哪些步骤?", "大语言模型有哪些主要应用场景?" ] # 输出结果:包含答案和源文档片段 for question in test_questions: print("\n" + "="*80) print(f"问题: {question}") result = rag_system.query(question) print("\n回答:") print(result["result"]) print("\n相关文档片段:") for i, doc in enumerate(result["source_documents"], 1): print(f"\n文档 {i}:") print(f"来源: {doc.metadata['source']}") print(f"内容: {doc.page_content[:200]}...")

运行测试:看看系统实际效果
04
将代码保存为rag\_qwe\_bge.py,执行以下命令运行:
python rag_qwen_bge.py
首次运行时,系统会自动:
- 在
documents目录创建2个示例文档(数据科学、LLM应用); - 下载BGE-M3和Qwen3-7B模型(约10GB,需耐心等待);
- 处理文档并创建向量库,存入
vector*db*qwen*bge*m3目录。
运行成功后,会输出如下结果(以“数据科学工作流包括哪些步骤?”为例):
================================
问题: 数据科学工作流包括哪些步骤?处理查询: 数据科学工作流包括哪些步骤?回答:数据科学工作流通常包括以下9个步骤:问题定义:明确业务问题和分析目标,这是整个工作流的基础,确保后续工作围绕核心需求展开;数据收集:获取相关的结构化(如数据库表)和非结构化(如文本、图片)数据;数据清洗:处理数据中的缺失值、异常值和重复数据,保证数据质量,避免影响后续分析结果;探索性数据分析:通过统计方法和可视化工具,理解数据分布、变量关系等,挖掘数据潜在规律;特征工程:对原始数据进行转换、筛选或创建新特征,生成适合机器学习模型输入的特征;模型构建:根据问题类型(如分类、回归)选择适当的机器学习模型,并使用清洗后的数据集进行训练;模型评估:使用准确率、召回率、RMSE等指标评估模型性能,判断模型是否满足业务需求;结果部署:将训练好的模型集成到业务流程中(如API接口、业务系统),实现实际应用;监控与更新:持续监控模型在实际场景中的性能,当数据分布或业务需求变化时,定期更新模型。相关文档片段:文档 1:来源: documents/data_science.txt内容: 数据科学是一个跨学科领域,结合了统计学、机器学习、数据可视化和领域知识,用于从结构化和非结构化数据中提取有价值的 insights。数据科学工作流通常包括以下步骤:问题定义:明确业务问题和分析目标数据收集:获取相关的结构化和非结构化数据数据清洗:处理缺失值、异常值和重复数据探索性数据分析:理解数据分布和变量关系特征工程:创建适合建模的特征模型构建:选择和训练适当的机器学习模型模型评估:使用合适的指标评估模型性能结果部署:将模型集成到业务流程中监控与更新:持续监控模型性能并定期更新

总结:展望,一点建议
05
- 本文针对企业私有化、个性化问答需求,提供了基于LangChain+Qwen3+BGEM3的本地RAG系统搭建全流程,通过4位量化技术降低硬件门槛至8GB显存,新手也能落地。
- 这个方案通过“检索生成”这种方式,把大模型存在的知识会过时、容易产生“幻觉”以及没法适应私有数据这些难题给解决了,既保障了数据的安全,又保证了回答的准确性。
- 以后本地RAG会朝着更轻、更多种模式的方向去发展呢,给新手的建议是先从最基本的文本开始,把流程熟悉起来,等过了这一步之后呢,就可以去摸索参数的优化以及多种技术融合这样更高级的东西啦。

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年 AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享!
👇👇扫码免费领取全部内容👇👇

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势
想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI:
1. 100+本大模型方向电子书

2. 26 份行业研究报告:覆盖多领域实践与趋势
报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:
- 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
- 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
- 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
- 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。
3. 600+套技术大会 PPT:听行业大咖讲实战
PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

- 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
- 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
- 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
- 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。
二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走
想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位
面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析:

2. 102 道 AI 大模型真题:直击大模型核心考点
针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题
专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:

三、路线必明: AI 大模型学习路线图,1 张图理清核心内容
刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代
L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊
L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计
L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

L5阶段:专题集丨特训篇 【录播课】

四、资料领取:全套内容免费抱走,学 AI 不用再找第二份
不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:
👇👇扫码免费领取全部内容👇👇

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!
更多推荐



所有评论(0)