程序员必看!LangChain+Qwen3 搭建本地 RAG 问答系统,从 0 到 1 手把手教

部署运行你感兴趣的模型镜像

在大模型技术飞速渗透企业与开发领域的当下,“数据私有化”与“问答定制化”已从可选需求转变为核心诉求。许多企业希望AI能基于内部专属文档(如产品手册、项目技术规范、行业研究报告等)精准答疑,同时又对核心数据外传、隐私泄露存在强烈顾虑。而检索增强生成(RAG)技术,正是解决这一矛盾的最优路径——它既能让AI“读懂”私有文档,又能将数据闭环控制在本地,彻底打消隐私安全顾虑。

本文将以实操为导向,带大家从零构建一套可本地运行的端到端RAG系统。我们将借助LangChain框架,深度整合Qwen3大模型与BGE-M3嵌入模型,无需依赖复杂的云服务集群,只要你有一台搭载GPU的普通电脑,就能拥有属于自己的“私有文档问答机器人”,让AI真正为特定场景服务。

img

1、为什么RAG成了“刚需”?拆解大模型的三大核心痛点

在动手搭建系统前,我们先厘清一个关键问题:明明大模型已经能回答各类通用问题,为什么还需要RAG?

以GPT-4、Qwen系列为代表的通用大模型,虽在语言理解、逻辑推理上表现出色,但在企业级或个性化场景中,存在三个难以规避的“硬伤”:

  1. 知识存在“时间差”:所有大模型的训练数据都有明确的截止时间(例如Qwen3的训练数据覆盖至2024年初),对于2024年之后的行业动态、政策更新、新发布的技术文档,它无法主动获取,自然也无法给出准确回答。比如你让它解读2024年5月新出台的某行业标准,通用大模型只能“束手无策”。

  2. 无法“读懂”私有数据:通用大模型的训练数据来自公开网络,完全无法触及企业内部的非公开信息——像是公司内部的组织架构手册、项目开发的技术白皮书、客户专属的服务方案等。若想让AI基于这些文档回答问题,通用大模型根本“无从下手”。

  3. 易犯“编造答案”的毛病:行业内称之为“幻觉”现象——当通用大模型遇到不确定的问题时,不会明确表示“不知道”,反而会生成看似逻辑通顺、实则毫无依据的内容,且无法追溯答案来源。这在需要严谨性的场景(如技术支持、合规咨询)中,可能会造成严重后果。

而RAG技术通过“检索+生成”的协同模式,恰好能针对性解决这些痛点:

  • 检索环节:将本地文档库转化为可快速查询的向量数据,当用户提出问题时,系统会先从文档库中精准筛选出与问题高度相关的片段,作为“事实依据”;
  • 生成环节:大模型不再依赖自身的通用知识回答,而是基于检索到的“事实依据”进行语言组织,确保答案既准确贴合文档内容,又能清晰追溯信息来源。

简单来说,RAG就像是给通用大模型加装了一个“本地知识抽屉”——大模型保留了优秀的语言理解能力,而所有与特定场景相关的知识都存放在本地抽屉里,既解决了知识专属问题,又把数据隐私牢牢握在自己手中。

2、技术栈选型逻辑:为什么敲定LangChain+Qwen3+BGE-M3?

一套完整的RAG系统,需要四大核心组件协同:文档处理框架、大语言模型(LLM)、嵌入模型(Embedding)、向量数据库。我们的选型标准始终围绕“本地化落地”展开,重点考量中文适配性、硬件门槛、开源可控性三个维度,最终确定了以下技术组合:

组件类型选型核心优势
文档处理框架LangChain提供“文档加载-分割-向量转换-检索链串联”的全流程工具,无需重复开发基础模块,大幅降低开发难度,新手也能快速上手。
大语言模型(LLM)Qwen3-7B-Instruct阿里达摩院开源的中文优化模型,对中文语义、语法的理解精度远超多数海外模型;7B参数版本支持4位量化,硬件适配性更强。
嵌入模型(Embedding)BAAI/bge-m3中科院自动化所研发的中文嵌入模型,在中文文本相似度计算、检索精度上排名前列,还支持“检索优化指令”,能进一步提升匹配准确率。
向量数据库Chroma轻量级本地向量库,无需部署服务器,直接在电脑本地运行;支持数据持久化存储,关闭系统后重新启动,之前的文档数据也不会丢失。

此外,为了进一步降低硬件门槛,我们引入了BitsAndBytes量化技术——未量化的Qwen3-7B模型需要24GB显存才能运行,而经过4位量化后,仅需8GB显存即可流畅启动。这意味着,即使是搭载RTX 3060、RTX 4060等中端显卡的普通电脑,也能满足系统运行需求,无需额外购置高端GPU设备。

值得一提的是,所有选型均为开源项目,不仅可以免费使用,还能根据自身需求进行二次开发——比如企业可添加文档权限管理模块,实现“不同部门只能访问对应文档”的精细化控制,进一步提升数据安全性。

3、 手把手搭建:从环境准备到代码实现

接着开始实战部分啦,咱们把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系统初始化、文档处理、向量库加载、问答交互。下面逐模块拆解,理解每个环节的作用。

1. 配置类:统一管理参数,便于修改

先对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显存必备)

2. 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)

3. 文档处理:从“原始文档”到“向量库”

文档处理是RAG的“地基”,直接影响检索精度。这一步分为3个关键操作:加载文档→分割文档→创建向量库

(1) 加载文档:支持多格式(TXT/PDF/Word)

我们用DirectoryLoader批量加载documents目录下的文档,默认支持TXT格式,若需处理PDF/Word,只需替换loader_clsPyPDFLoader/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} 秒")

4. 问答交互:从“问题”到“答案”的闭环

最后,实现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

5. 主函数:一键运行系统

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]}...")

4、运行测试:看看系统实际效果

将代码保存为rag_qwe_bge.py,执行以下命令运行:

python rag_qwen_bge.py

首次运行时,系统会自动:

  1. documents目录创建2个示例文档(数据科学、LLM应用);
  2. 下载BGE-M3和Qwen3-7B模型(约10GB,需耐心等待);
  3. 处理文档并创建向量库,存入vector*db*qwen*bge*m3目录。

运行成功后,会输出如下结果(以“数据科学工作流包括哪些步骤?”为例):

================================


问题: 数据科学工作流包括哪些步骤?
处理查询: 数据科学工作流包括哪些步骤?
回答:
数据科学工作流通常包括以下9个步骤:
问题定义:明确业务问题和分析目标,这是整个工作流的基础,确保后续工作围绕核心需求展开;
数据收集:获取相关的结构化(如数据库表)和非结构化(如文本、图片)数据;
数据清洗:处理数据中的缺失值、异常值和重复数据,保证数据质量,避免影响后续分析结果;
探索性数据分析:通过统计方法和可视化工具,理解数据分布、变量关系等,挖掘数据潜在规律;
特征工程:对原始数据进行转换、筛选或创建新特征,生成适合机器学习模型输入的特征;
模型构建:根据问题类型(如分类、回归)选择适当的机器学习模型,并使用清洗后的数据集进行训练;
模型评估:使用准确率、召回率、RMSE等指标评估模型性能,判断模型是否满足业务需求;
结果部署:将训练好的模型集成到业务流程中(如API接口、业务系统),实现实际应用;
监控与更新:持续监控模型在实际场景中的性能,当数据分布或业务需求变化时,定期更新模型。

相关文档片段:
文档 1:
来源: documents/data_science.txt
内容: 数据科学是一个跨学科领域,结合了统计学、机器学习、数据可视化和领域知识,
用于从结构化和非结构化数据中提取有价值的 insights。
数据科学工作流通常包括以下步骤:
问题定义:明确业务问题和分析目标
数据收集:获取相关的结构化和非结构化数据
数据清洗:处理缺失值、异常值和重复数据
探索性数据分析:理解数据分布和变量关系
特征工程:创建适合建模的特征
模型构建:选择和训练适当的机器学习模型
模型评估:使用合适的指标评估模型性能
结果部署:将模型集成到业务流程中
监控与更新:持续监控模型性能并定期更新

5、总结:展望,一点建议

  1. 本文针对企业私有化、个性化问答需求,提供了基于LangChain+Qwen3+BGEM3的本地RAG系统搭建全流程,通过4位量化技术降低硬件门槛至8GB显存,新手也能落地。

  2. 这个方案通过“检索生成”这种方式,把大模型存在的知识会过时、容易产生“幻觉”以及没法适应私有数据这些难题给解决了,既保障了数据的安全,又保证了回答的准确性。

  3. 以后本地RAG会朝着更轻、更多种模式的方向去发展呢,给新手的建议是先从最基本的文本开始,把流程熟悉起来,等过了这一步之后呢,就可以去摸索参数的优化以及多种技术融合这样更高级的东西啦。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2025 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》下方扫码获取~
在这里插入图片描述

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)
在这里插入图片描述

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!
在这里插入图片描述

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。
在这里插入图片描述

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
在这里插入图片描述

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。
在这里插入图片描述

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

图片

以上资料如何领取?

在这里插入图片描述

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

图片

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
在这里插入图片描述
在这里插入图片描述

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
在这里插入图片描述
在这里插入图片描述

以上全套大模型资料如何领取?

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值