2026/3/24 23:05:40
网站建设
项目流程
福建省住房与城乡建设部网站,2023年又开始封控了吗,什么是互联网营销师,WordPress访问mysql慢大模型能力强大#xff0c;却受限于静态知识库#xff0c;还容易“一本正经地胡说八道”。RAG#xff08;检索增强生成#xff09;正是破局关键#xff01;本文深入浅出讲解 RAG 的核心原理——通过实时检索外部知识库#xff0c;为生成模型注入最新、最准的上下文信息却受限于静态知识库还容易“一本正经地胡说八道”。RAG检索增强生成正是破局关键本文深入浅出讲解 RAG 的核心原理——通过实时检索外部知识库为生成模型注入最新、最准的上下文信息显著提升回答的准确性、专业性与可解释性。带你从零搭建本地 RAG 系统使用 PyPDF2 解析 PDF、DashScope 嵌入模型向量化、Faiss 构建高效检索库并通过 LangChain 调用 DeepSeek 大模型实现智能问答。全流程覆盖数据预处理、索引构建到问答生成附关键技术细节与工程实践建议。无论你是开发者、AI 爱好者还是企业技术决策者这篇干货都能帮你快速掌握 RAG 落地的核心能力一、RAG简介1.什么是RAGRAGRetrieval-Augmented Generation检索增强生成是一种结合信息检索Retrieval和文本生成Generation的技术。RAG技术通过实时检索相关文档或信息并将其作为上下文输入到生成模型中从而提高生成结果的时效性和准确性。2.RAG的优势是什么解决知识时效性问题大模型的训练数据通常是静态的无法涵盖最新信息而RAG可以检索外部知识库实时更新信息。减少模型幻觉通过引入外部知识RAG能够减少模型生成虚假或不准确内容的可能性。提升专业领域回答质量RAG能够结合垂直领域的专业知识库生成更具专业深度的回答。生成内容的溯源可解释性3.RAG 的核心原理与流程步骤1数据预处理构建索引库知识库构建收集并整理文档、网页、数据库等多源数据构建外部知识库。文档分块将文档切分为适当大小的片段chunks以便后续检索。分块策略需要在语义完整性与检索效率之间取得平衡。向量化处理使用嵌入模型如BGE、M3E、ChineseAlpaca2等将文本块转换为向量并存储在向量数据库中步骤2检索阶段查询处理将用户输入的问题转换为向量并在向量数据库中进行相似度检索找到最相关的文本片段。重排序对检索结果进行相关性排序选择最相关的片段作为生成阶段的输入。步骤3检索阶段上下文组装将用户输入的问题转换为向量并在向量数据库中进行相似度检索找到最相关的文本片段。生成回答对检索结果进行相关性排序选择最相关的片段作为生成阶段的输入。划重点RAG本质上就是重构了一个新的 Prompt4.NativeRAGNativeRAG的步骤Indexing如何更好地把知识存起来。Retrieval如何在大量的知识中找到一小部分有用的给到模型参考。Generation如何结合用户的提问和检索到的知识让模型生成有用的答案。上面三个步骤虽然看似简单但在 RAG 应用从构建到落地实施的整个过程中涉及较多复杂的工作内容5.Prompt vs RAG vs Fine-tuning 什么时候使用二、Embedding模型选择1.通用文本嵌入模型BGE-M3(智源研究院)特点支持100语言输入长度达8192tokens融合密集、稀疏、多向量混合检索适合跨语言长文档检索。适用场景跨语言长文档检索、高精度RAG应用。文件大小2.3Gtext-embedding-3-largeOpenAI特点向量维度3072维长文本语义捕捉能力强英文表现优秀。适用场景英文内容优先的全球化应用。jina-embedding-v2-smallJina AI特点参数量仅35M支持实时推理RT50ms适合轻量化部署。适用场景轻量级文本处理、实时推理任务。2.中文嵌入模型M3E-Base特点针对中文优化的轻量模型适合本地化部署。适用场景中文法律、医疗领域检索任务。文件大小0.4Gxiaobu-embedding-v2特点针对中文语义优化语义理解能力强。适用场景中文文本分类、语义检索。stella-mrl-large-zh-v3.5-1792特点处理大规模中文数据能力强捕捉细微语义关系。适用场景中文文本高级语义分析、自然语言处理任务。3.指令驱动与复杂任务模型gte-Qwen2-7B-instruct阿里巴巴特点基于Qwen大模型微调支持代码与文本跨模态检索。适用场景复杂指令驱动任务、智能问答系统。E5-mistral-7BMicrosoft特点基于Microsoft架构Zero-shot任务表现优异。适用场景动态调整语义密度的复杂系统。4.企业级与复杂系统BGE-M3智源研究院特点适合企业级部署支持混合检索。适用场景企业级语义检索、复杂RAG应用。E5-mistral-7BMicrosoft特点适合企业级部署支持指令微调。适用场景需要动态调整语义密度的复杂系统。5.CASE-BGE-M3使用模型下载from FlagEmbedding import BGEM3FlagModel model BGEM3FlagModel(/root/models/BAAI/bge-m3, use_fp16True)示例代码from FlagEmbedding import BGEM3FlagModel model BGEM3FlagModel(/root/models/BAAI/bge-m3, use_fp16True) sentences_1 [什么是 BGE M3, BM25 的定义] sentences_2 [BGE M3 是一种嵌入模型支持稠密检索、词汇匹配和多向量交互。, BM25 是一种基于词袋的检索函数根据查询词在每个文档中出现的情况对文档集合进行排序。] embeddings_1 model.encode(sentences_1, batch_size12, max_length8192, # 如果不需要这么长的长度可以设置一个较小的值以加快编码速度。 )[dense_vecs] embeddings_2 model.encode(sentences_2)[dense_vecs] similarity embeddings_1 embeddings_2.T print(similarity) # [[0.6265, 0.3477], [0.3499, 0.678 ]]代码解释similarity embeddings_1 embeddings_2.T计算两组嵌入向量embeddings之间的相似度矩阵。embeddings_1包含了第一组句子(sentences_1)的嵌入向量形状为[sentences_1的数量嵌入维度]embeddings_2包含了第二组句子(sentences_2)的嵌入向量形状为[sentences_2的数量嵌入维度]embeddings_2.T是对embeddings_2进行转置操作形态变为[嵌入维度sentences_2的数量]符号在Python中表示矩阵乘法运算通过矩阵乘法计算了两组句子之间的余弦相似度矩阵。结果similarity形状是[sentences_1的数量sentences_2的数量]6.gte-qwen2使用模型下载from sentence_transformers import SentenceTransformer model_dir /root/models/iic/gte_Qwen2-1___5B-instruct model SentenceTransformer(model_dir, trust_remote_codeTrue)示例代码from sentence_transformers import SentenceTransformer model_dir /root/models/iic/gte_Qwen2-1___5B-instruct model SentenceTransformer(model_dir, trust_remote_codeTrue) model.max_seq_length 8192 queries [ 女性每天应该摄入多少蛋白质, “summit”的定义是什么,] documents [ 根据一般指南美国疾控中心CDC建议19至70岁女性每日平均蛋白质摄入量为46克。但如下面图表所示如果你正在备孕或备战马拉松就需要增加摄入量。请查看下方图表了解你每天应摄入多少蛋白质。, “summit”对英语学习者的定义1. 山的最高点山顶。2. 最高水平。3. 两个或多个国家领导人之间的会议或系列会议。,] document_embeddings model.encode(documents) print(scores.tolist())三、RAG实战基于LangChain采用DeepSeekFaiss快速搭建本地知识库检索。3.1 环境准备1本地安装好Conda环境2推荐使用阿里大模型平台百炼https://bailian.console.aliyun.com/3百炼平台使用注册登录、申请api key。3.2 技术选型向量数据库Faiss作为高效的向量检索嵌入模型阿里云DashScope的text-embedding-v1大语言模型deepseek-v3文档处理PyPDF2用于PDF文本提取3.3 程序逻辑结构介绍步骤1:文档预处理PDF文件-文本提取-文本分割-页码映射1)PDF文本提取逐页提取文本内容记录每行文本对应的页码信息处理空页和异常情况2文本分割策略使用递归字符分割器分割参数chunk_size1000,chunk_overlap200分割优先级段落-句子-空格-字符3页面映射处理基于字符位置计算每个文本块的页面使用众数统计确定文本块的主要来源页码建立文本块与页码的映射关系步骤2:知识库构建文本块-嵌入向量-Faiss索引-本地持久化1向量数据库构建使用DashScope嵌入模型生成向量将向量存储到Faiss索引结构2数据持久化保存Faiss索引文件.faiss保存元数据信息.pkl保存页码映射关系page_info.pkl步骤3:问答查询用户问题-向量检索-文档组合-LLM生成-答案输出1相似度检索将用户问题转换为向量在Faiss中搜索最相似的文档块返回Top-K相关文档2问答链处理使用LangChain的load_qa_chain采用stuff策略组合文档将组合后的上下文和问题发送给LLM3答案生成与展示3.4代码实例安装依赖的包!pip install pypdf2 !pip install dashscope !pip install langchain !pip install langchain-openai !pip install langchain-community !pip install faiss-cpu导入依赖的包from PyPDF2 import PdfReader from langchain.chains.question_answering import load_qa_chain from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import FAISS from typing import List, Tuple import os import pickle从PDF中提取文本并记录每个字符对应的页码def extract_text_with_page_numbers(pdf) - Tuple[str, List[Tuple[str, int]]]: 从PDF中提取文本并记录每个字符对应的页码 参数: pdf: PDF文件对象 返回: text: 提取的文本内容 char_page_mapping: 每个字符对应的页码列表 text char_page_mapping [] for page_number, page in enumerate(pdf.pages, start1): extracted_text page.extract_text() if extracted_text: text extracted_text # 为当前页面的每个字符记录页码 char_page_mapping.extend([page_number] * len(extracted_text)) else: print(fNo text found on page {page_number}.) return text, char_page_mapping处理文本并创建向量存储def process_text_with_splitter(text: str, char_page_mapping: List[int], save_path: str None) - FAISS: 处理文本并创建向量存储 参数: text: 提取的文本内容 char_page_mapping: 每个字符对应的页码列表 save_path: 可选保存向量数据库的路径 返回: knowledgeBase: 基于FAISS的向量存储对象 # 创建文本分割器用于将长文本分割成小块 text_splitter RecursiveCharacterTextSplitter( separators[\n\n, \n, ., , ], chunk_size1000, chunk_overlap200, length_functionlen, ) # 分割文本 chunks text_splitter.split_text(text) print(f文本被分割成 {len(chunks)} 个块。) # 创建嵌入模型 embeddings DashScopeEmbeddings( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_API_KEY, ) # 从文本块创建知识库 knowledgeBase FAISS.from_texts(chunks, embeddings) print(已从文本块创建知识库。) # 为每个文本块找到对应的页码信息 page_info {} current_pos 0 for chunk in chunks: chunk_start current_pos chunk_end current_pos len(chunk) # 找到这个文本块中字符对应的页码 chunk_pages char_page_mapping[chunk_start:chunk_end] # 取页码的众数出现最多的页码作为该块的页码 if chunk_pages: # 统计每个页码出现的次数 page_counts {} for page in chunk_pages: page_counts[page] page_counts.get(page, 0) 1 # 找到出现次数最多的页码 most_common_page max(page_counts, keypage_counts.get) page_info[chunk] most_common_page else: page_info[chunk] 1 # 默认页码 current_pos chunk_end knowledgeBase.page_info page_info print(f页码映射完成共 {len(page_info)} 个文本块) # 如果提供了保存路径则保存向量数据库和页码信息 if save_path: # 确保目录存在 os.makedirs(save_path, exist_okTrue) # 保存FAISS向量数据库 knowledgeBase.save_local(save_path) print(f向量数据库已保存到: {save_path}) # 保存页码信息到同一目录 with open(os.path.join(save_path, page_info.pkl), wb) as f: pickle.dump(page_info, f) print(f页码信息已保存到: {os.path.join(save_path, page_info.pkl)}) return knowledgeBase从磁盘加载向量数据库和页码信息def load_knowledge_base(load_path: str, embeddings None) - FAISS: 从磁盘加载向量数据库和页码信息 参数: load_path: 向量数据库的保存路径 embeddings: 可选嵌入模型。如果为None将创建一个新的DashScopeEmbeddings实例 返回: knowledgeBase: 加载的FAISS向量数据库对象 # 如果没有提供嵌入模型则创建一个新的 if embeddings is None: embeddings DashScopeEmbeddings( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_API_KEY, ) # 加载FAISS向量数据库添加allow_dangerous_deserializationTrue参数以允许反序列化 knowledgeBase FAISS.load_local(load_path, embeddings, allow_dangerous_deserializationTrue) print(f向量数据库已从 {load_path} 加载。) # 加载页码信息 page_info_path os.path.join(load_path, page_info.pkl) if os.path.exists(page_info_path): with open(page_info_path, rb) as f: page_info pickle.load(f) knowledgeBase.page_info page_info print(页码信息已加载。) else: print(警告: 未找到页码信息文件。) return knowledgeBase读取PDF文件并写入到知识库# 读取PDF文件 pdf_reader PdfReader(./考核办法.pdf) # 提取文本和页码信息 text, char_page_mapping extract_text_with_page_numbers(pdf_reader) #print(page_numbers,page_numbers) print(f提取的文本长度: {len(text)} 个字符。) # 处理文本并创建知识库同时保存到磁盘 save_dir ./vector_db knowledgeBase process_text_with_splitter(text, char_page_mapping, save_pathsave_dir)如何加载已保存的向量数据库# 创建嵌入模型 embeddings DashScopeEmbeddings( modeltext-embedding-v1, dashscope_api_keyDASHSCOPE_API_KEY, ) # 从磁盘加载向量数据库 loaded_knowledgeBase load_knowledge_base(./vector_db, embeddings) # 使用加载的知识库进行查询 docs loaded_knowledgeBase.similarity_search(客户经理每年评聘申报时间是怎样的) # 直接使用FAISS.load_local方法加载替代方法 # loaded_knowledgeBase FAISS.load_local(./vector_db, embeddings, allow_dangerous_deserializationTrue) # 注意使用这种方法加载时需要手动加载页码信息对话调用from langchain_community.llms import Tongyi llm Tongyi(model_namedeepseek-v3, dashscope_api_keyDASHSCOPE_API_KEY) # qwen-turbo # 设置查询问题 query 客户经理被投诉了投诉一次扣多少分 #query 客户经理每年评聘申报时间是怎样的 if query: # 执行相似度搜索找到与查询相关的文档 docs knowledgeBase.similarity_search(query,k10) # 加载问答链 chain load_qa_chain(llm, chain_typestuff) # 准备输入数据 input_data {input_documents: docs, question: query} # 执行问答链 response chain.invoke(inputinput_data) print(response[output_text]) print(来源:) # 记录唯一的页码 unique_pages set() # 显示每个文档块的来源页码 for doc in docs: #print(doc,doc) text_content getattr(doc, page_content, ) source_page knowledgeBase.page_info.get( text_content.strip(), 未知 ) if source_page not in unique_pages: unique_pages.add(source_page) print(f文本块页码: {source_page})3.5 示例总结PDF文本提取与处理使用PyPDF2库的PdfReader从PDF文件中提取文本在提取过程中记录每行文本对应的页码便于后续溯源。使用RecursiveCharacterTextSplitter将长文本分割成小块便于向量化处理。向量数据库构建使用OpenAIEmbeddings / DashScopeEmbeddings将文本块转换为向量表示。使用FAISS向量数据库存储文本向量支持高效的相似度搜索为每个文本块保存对应的页码信息实现查询结果溯源。语义搜索与问答链基于用户查询使用similarity_search在向量数据库中检索相关文本块。使用文本语言模型和load_qa_chain构建问答链将检索到的文档和用户问题作为输入生成回答。成本跟踪与结果展示使用get_openai_callback跟踪API调用成本。展示问答结果和来源页码方便用户验证信息。四、LangChain中的问答链在LangChain问答链中有4种chain\_typechain\_type参数决定了RAG流程中如何将检索到的多个相关文档块与用户的问题组合起来发送给大模型以生成最终答案。需要根据应用场景选择不同的chain\_type以保证在效果、成本和速度上的权衡。1.stuff堆叠式工作原理将所有检索到的文档片段直接拼接成一个长上下文与问题一起构造 Prompt单次调用 LLM 生成答案。优点实现最简单、延迟最低 单次LLM调用成本最低 所有信息同时可见利于全局理解。缺点受限于LLM的最大上下文长度文档过多或过长时会截断 若检索结果包含噪声可能干扰生成质量。适用场景检索返回的文档数量少、内容精炼如chunk_size较小对响应速度和成本敏感的轻量级应用。2.map_reduce映射-归约工作原理Map阶段对每个文档chunk独立构造Prompt分别调用LLM生成中间摘要或回答。 Reduce阶段将所有中间结果合并再次调用LLM生成最终答案。优点可处理超长文档集合不受单次上下文长度限制 Map阶段可并行执行提升吞吐率 适合信息分散在多个片段中的场景。缺点至少需要N1次LLM调用N为文档数成本高延迟大 各文档独立处理缺乏文档上下文关联。适用场景检索结果较多且分散需要对大量文档进行综合归纳如报告生成多源信息整合。3.refine迭代细化在第一个chunk上做prompt得到结果然后再合并下一个文件再输出结果工作原理先用第一个文档和问题生成初步答案 依次将后续文档与当前答案合并逐步“细化”输出每次更新答案。优点能在一定程度上保留跨文档上下文信息 每次只处理一个新文档 当前答案Token使用较为可控 最终答案融合了所有文档的信息流。缺点必须串行处理无法并行延迟较高 早期错误可能被累积放大适用场景文档间存在逻辑递进或补充关系需要在有限上下文窗口内处理中等数量文档 对答案连续性要求较高。4.map_rerank映射重排序对每个chunk做prompt然后打个分然后根据分数返回最好的文档中的结果。会大量地调用LLM每个document之间是独立处理。工作原理对每个文档独立构造Prompt要求LLM输出一个答案置信度分数 根据分数排序返回得分最高的答案通常只取Top-1.优点能有效过滤低质量或无关文档 返回的答案来自最相关片段精准度高。缺点每个文档都需要调用一次LLM成本高 不副合多文档信息仅返回单个最佳答案可能丢失互补信息 依赖LLM对“打分”的一致性部分模型不擅长此任务。适用场景检索结果中存在明显“最佳匹配”文档任务为事实型问答如“XX 的定义是什么” 需要高置信度、简洁答案而非综合归纳。5.总结特性stuffmap_reducerefinemap_rerankLLM调用次数1N 1NN速度最快中等最慢慢Token 消耗低高高高处理长文档能力差好好好答案质量高 (上下文完整)中等 (可能丢失关联)最高 (迭代细化)取决于最佳块适用场景默认选择文档短文档多需平衡文档多要求高精度事实型问题答案在单块中五、如果LLM可以处理无限上下文RAG还有意义吗效率成本LLM处理上下文时计算资源消耗大响应时间增加。RAG通过检索相关片段减少输入长度。知识更新LLM的知识截止于训练数据无法实时更新。RAG可以连接外部知识库增强时效性。可解释性RAG的检索过程透明用户可查看来源增强信任。LLM的生成过程则较难追溯。定制化RAG可针对特定领域定制检索系统提供更精准的结果而LLM的通用性可能无法满足特定需求。数据隐私RAG允许在本地或私有数据源上检索避免敏感数据上传云端适合隐私要求高的场景。结合LLM的生成能力和RAG的检索能力可以提升整体性能提供更全面、准确的回答。想入门 AI 大模型却找不到清晰方向备考大厂 AI 岗还在四处搜集零散资料别再浪费时间啦2025 年AI 大模型全套学习资料已整理完毕从学习路线到面试真题从工具教程到行业报告一站式覆盖你的所有需求现在全部免费分享扫码免费领取全部内容一、学习必备100本大模型电子书26 份行业报告 600 套技术PPT帮你看透 AI 趋势想了解大模型的行业动态、商业落地案例大模型电子书这份资料帮你站在 “行业高度” 学 AI1. 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 大模型的风口别犹豫这份免费资料就是你的 “起跑线”