郑州行业网站建设淘宝做标题网站
2026/6/1 6:54:06 网站建设 项目流程
郑州行业网站建设,淘宝做标题网站,河南省建设信息网,中国人在俄罗斯做网站需要多少卢布构建基础 RAG 系统 —— 给大模型装 “外挂知识库” 的全流程实践当大模型遇到 “知识滞后”#xff08;比如不知道 2025 年的新政策#xff09;或 “幻觉输出”#xff08;编造不存在的事实#xff09;时#xff0c;我们该如何解决#xff1f;答案是给它装一个 “外挂知…构建基础 RAG 系统 —— 给大模型装 “外挂知识库” 的全流程实践当大模型遇到 “知识滞后”比如不知道 2025 年的新政策或 “幻觉输出”编造不存在的事实时我们该如何解决答案是给它装一个 “外挂知识库”—— 这就是 RAGRetrieval-Augmented Generation检索增强生成的核心价值。本次作业的目标就是亲手搭建一个基础 RAG 系统从数据处理到最终生成回答完整走通 “检索→增强→生成” 的闭环。无论你是想解决大模型的事实性错误还是想让模型能 “查阅” 特定文档如教材、报告这份实操指南都能帮你把理论落地。一、先搞懂为什么要做 RAG 系统——3 个核心痛点的解决方案在动手前我们先明确 RAG 的定位它不是替代大模型而是给大模型 “补短板”。传统大模型的 3 个核心痛点正好是 RAG 的优势所在知识滞后大模型的训练数据有 “截止日期”比如 2023 年无法获取之后的新信息。RAG 通过实时检索外部知识库如最新新闻、政策文档让模型能 “查阅最新资料”容易幻觉大模型会基于概率生成文本偶尔编造看似合理但错误的内容。RAG 让模型 “只基于检索到的权威信息回答”像写论文时 “引用参考文献” 一样大幅降低幻觉率领域适配难通用大模型对医疗、法律等专业领域的知识深度不足。RAG 可接入专业知识库如医疗指南、法律条文让模型快速具备 “专业能力”无需复杂的模型微调。本次作业搭建的基础 RAG 系统就是要解决这些问题比如让模型能 “检索高中数学教材内容” 来解答题目或 “查阅产品说明书” 来回答用户咨询 —— 本质是让模型从 “闭卷考试” 变成 “开卷考试”。二、作业核心目标掌握 RAG 的 4 个关键能力本次作业不追求复杂的优化重点是理解 RAG 的核心流程并实现基础功能完成后你将掌握数据处理能力把原始文档如 TXT、PDF拆成适合检索的 “语义块”Chunk避免因文档太长导致检索不精准索引构建能力用嵌入模型Embedding Model将文本块转成 “数字向量”并存储到向量数据库中实现快速检索检索实现能力将用户的问题转成向量后在向量数据库中找到 “语义最相似” 的文本块作为 “参考资料”生成整合能力把 “用户问题 检索到的参考资料” 组织成提示词让大模型基于这些资料生成准确回答。三、实操步骤5 步搭建基础 RAG 系统 —— 代码 逻辑双解析本次作业将用PythonLangChainFAISS实现工具选择的原因LangChain 简化流程FAISS 是轻量级向量数据库无需复杂部署适合新手全程不涉及高深算法跟着步骤走就能完成。1. 准备工作安装必备工具库首先安装 3 个核心库打开终端输入以下命令若用 Anaconda 环境需先激活对应环境python运行# 安装LangChain简化RAG流程的工具集 pip install langchain # 安装FAISS轻量级向量数据库用于存储向量 pip install faiss-cpu # 若有GPU可替换为faiss-gpu # 安装Sentence-BERT轻量级嵌入模型用于文本转向量 pip install sentence-transformers # 安装文档加载工具支持TXT、PDF等格式 pip install pypdf python-dotenv这些工具的分工很明确LangChain 负责串联 “加载文档→分块→向量化→检索→生成” 全流程FAISS 负责存向量Sentence-BERT 负责把文本转成向量。2. 第一步数据处理 —— 把文档拆成 “可检索的语义块”原始文档如一本 500 页的教材直接检索会 “抓不住重点”必须拆成更小的 “语义块”—— 就像把一本书拆成 “章节→段落”既能保留完整语义又能精准定位。具体操作步骤 1加载文档以 “高中数学必修 1 PDF 教材” 为例用 LangChain 的PyPDFLoader加载文档python运行from langchain_community.document_loaders import PyPDFLoader # 加载PDF文档替换为你的文档路径 loader PyPDFLoader(高中数学必修1.pdf) # 把PDF按页拆分成文档对象 documents loader.load()步骤 2拆分语义块用RecursiveCharacterTextSplitter分块核心参数是chunk_size块大小按字符数算和chunk_overlap块重叠度避免拆分导致语义断裂。 作业建议chunk_size300每块约 300 字符对应 1-2 个段落chunk_overlap50每块重叠 50 字符适合教材类文档python运行from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size300, # 每块最大字符数 chunk_overlap50, # 块重叠字符数 length_functionlen, # 按字符数计算长度 is_separator_regexFalse # 不使用正则分割 ) # 拆分文档得到语义块列表 chunks text_splitter.split_documents(documents)关键提醒分块不是 “越细越好”—— 太细会导致语义不完整比如把一个公式拆到两个块里太粗会导致检索精准度下降比如一块包含 3 个知识点。可根据文档类型调整教材类选 300-500 字符新闻类选 200-300 字符。3. 第二步构建索引 —— 把文本块转成 “可检索的向量”计算机无法直接 “理解” 文本必须把语义块转成 “高维向量”比如 768 维的数字列表—— 语义越相似的文本向量距离越近。这一步就是构建 “向量索引”为后续检索做准备。具体操作步骤 1选择嵌入模型作业推荐用all-MiniLM-L6-v2Sentence-BERT 系列的轻量级模型速度快、效果好适合入门python运行from langchain_community.embeddings import SentenceTransformerEmbeddings # 初始化嵌入模型 embedding_model SentenceTransformerEmbeddings( model_nameall-MiniLM-L6-v2 # 轻量级模型约40MB )步骤 2构建向量索引用 FAISS 将语义块的向量存储起来形成可快速检索的索引python运行from langchain_community.vectorstores import FAISS # 把语义块转成向量并构建FAISS索引 db FAISS.from_documents( documentschunks, # 拆分后的语义块 embeddingembedding_model# 嵌入模型 ) # 保存索引下次用不用重新构建直接加载即可 db.save_local(math_textbook_faiss_index)后续加载索引若下次想继续使用无需重新处理文档直接加载已保存的索引python运行# 加载已有的FAISS索引 db FAISS.load_local( math_textbook_faiss_index, # 索引保存路径 embedding_model, # 同之前的嵌入模型 allow_dangerous_deserializationTrue # 允许加载本地索引开发环境用 )4. 第三步实现检索 —— 让系统 “找到最相关的资料”当用户提出问题如 “什么是函数的定义域”时系统需要先把问题转成向量再在 FAISS 索引中找到 “向量距离最近” 的 Top-K 个语义块比如 Top-3即最相关的 3 个段落。具体操作python运行# 1. 定义用户问题 user_query 什么是函数的定义域请结合教材内容解释 # 2. 检索最相关的3个语义块k3可根据需求调整 retriever db.as_retriever(search_kwargs{k: 3}) retrieved_chunks retriever.get_relevant_documents(user_query) # 3. 打印检索结果查看找到的参考资料 print(检索到的相关内容) for i, chunk in enumerate(retrieved_chunks, 1): print(f\n【第{i}条参考】) print(f内容{chunk.page_content}) print(f来源第{chunk.metadata[page]}页) # metadata包含文档页码等信息关键逻辑检索的核心是 “语义相似度匹配”不是 “关键词匹配”—— 比如用户问 “函数的定义域怎么求”即使语义块里写的是 “定义域的定义与求解步骤”也能被精准检索到因为语义相似。作业小挑战尝试调整k的值如 k2、k5观察检索结果的数量对后续生成回答的影响k 太小可能信息不足k 太大可能引入冗余。5. 第四步生成回答 —— 让大模型 “基于参考资料说话”这一步是 RAG 的 “增强” 核心把 “用户问题 检索到的参考资料” 组织成提示词再交给大模型生成回答确保回答 “有依据、不胡说”。具体操作以开源模型 Llama 3 为例也可改用 ChatGPT 等python运行from langchain.chains import RetrievalQA from langchain_community.llms import HuggingFacePipeline from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline # 1. 加载开源大模型Llama 3-8B轻量级适合作业场景 model_name meta-llama/Llama-3.2-8B-Instruct tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) # 2. 构建模型管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, # 最大生成字符数 temperature0.3 # 低温度保证回答稳定准确 ) llm HuggingFacePipeline(pipelinepipe) # 3. 构建RAG问答链串联检索和生成 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 简单直接的提示组织方式把所有参考资料塞进提示 retrieverretriever, return_source_documentsTrue # 让回答包含参考资料来源方便溯源 ) # 4. 生成回答 result qa_chain({query: user_query}) # 5. 打印结果 print(最终回答) print(result[result]) print(\n回答依据参考资料) for i, doc in enumerate(result[source_documents], 1): print(f{i}. 第{doc.metadata[page]}页{doc.page_content[:100]}...) # 显示前100字符提示组织方式作业用chain_typestuff简单直接适合基础场景进阶场景可改用map_reduce先总结每个参考块再整合或refine逐步优化回答。核心价值生成的回答会明确基于检索到的教材内容比如 “根据教材第 12 页的定义函数的定义域是指……”既解决了幻觉问题又能追溯来源。四、作业关键难点3 个容易踩的坑及解决方案在实操中新手容易遇到 “检索不准”“生成杂乱” 等问题这 3 个常见坑的解决方法要记牢1. 坑 1分块大小不合适导致语义断裂或检索不准表现检索到的内容不完整比如公式只一半或回答时漏关键信息解决方案根据文档类型调整chunk_size教材 / 技术文档多公式、长段落300-500 字符保留标题层级比如用MarkdownHeaderTextSplitter拆分保留 “章节标题→小节标题”新闻 / 短文本段落短、信息散200-300 字符chunk_overlap设为 30-50避免拆分句子。2. 坑 2嵌入模型选得太复杂导致速度慢表现向量化时卡住或检索响应时间超过 10 秒解决方案新手优先选轻量级模型入门级all-MiniLM-L6-v240MB速度快适合小文档进阶级all-mpnet-base-v21.1GB精度更高适合专业文档避免一上来就用大模型如text-embedding-3-large除非有 GPU 支持。3. 坑 3生成回答时参考资料没被充分利用表现回答还是 “凭模型记忆”没引用检索到的内容解决方案优化提示词模板用chain_typecustom自定义提示python运行from langchain.prompts import PromptTemplate # 自定义提示模板明确要求模型引用参考资料 prompt_template 请根据以下参考资料回答用户的问题。回答必须包含参考资料的来源如“第X页”不允许编造信息。 参考资料 {context} 用户问题{question} 回答 prompt PromptTemplate( templateprompt_template, input_variables[context, question] ) # 用自定义提示构建问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, chain_type_kwargs{prompt: prompt}, # 传入自定义提示 return_source_documentsTrue )通过明确指令强制模型 “必须用参考资料”避免 “忽略检索结果” 的问题。五、如何评估你的 RAG 系统——2 个简单有效的方法作业完成后不能只看 “能生成回答”还要判断系统好不好用这 2 个评估方法足够基础且实用定性评估看回答是否 “有依据、无幻觉”—— 比如用户问 “函数定义域的求解步骤”回答是否引用了检索到的教材内容有没有编造步骤定量评估用 JudgeBoi 评估 2 个核心指标检索准确率检索到的 Top-K 个语义块有多少是真正和问题相关的比如 K3 时相关的块数≥2 才算合格生成准确性回答与参考资料的匹配度比如 “是否准确引用了教材定义”“步骤是否和参考资料一致”。六、知识联动RAG 与之前内容的衔接本次作业不是孤立的它是之前学过的 “上下文工程”“提示工程” 的综合应用与上下文工程的衔接RAG 的 “检索参考资料” 本质是 “精准筛选上下文”把最有用的信息塞进大模型的 “上下文窗口”避免信息过载与提示工程的衔接生成回答时的 “提示模板设计”是提示工程的具体落地 —— 通过明确指令让模型高效利用参考资料这和之前 “优化提示词控制推理长度” 的思路一致。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询