2026/2/11 1:54:22
网站建设
项目流程
建网站为什么要租空间,电商网页设计网站,软件工程排名,招商网站开发AI原生应用开发者必看#xff1a;检索增强生成(RAG)核心原理与优化关键词#xff1a;检索增强生成(RAG)、大语言模型(LLM)、向量检索、提示工程、知识增强、AI原生应用、信息准确性摘要#xff1a;本文以授人以渔的方式#xff0c;从生活场景切入#xff0c;系…AI原生应用开发者必看检索增强生成(RAG)核心原理与优化关键词检索增强生成(RAG)、大语言模型(LLM)、向量检索、提示工程、知识增强、AI原生应用、信息准确性摘要本文以授人以渔的方式从生活场景切入系统讲解检索增强生成RAG, Retrieval-Augmented Generation的核心原理、技术架构与优化策略。通过代码示例、数学模型拆解和真实场景实战帮助开发者理解RAG如何解决大模型知识过时事实错误等痛点掌握从0到1构建RAG系统的关键技术。背景介绍目的和范围随着GPT-4、Llama 3等大语言模型LLM的普及AI原生应用正从模型调用向系统构建演进。但开发者发现LLM存在知识截止日期如GPT-4知识截止到2023年12月、“幻觉现象”编造不存在的事实等局限。本文聚焦**检索增强生成RAG**这一关键技术覆盖从基础原理到工程优化的全链路知识帮助开发者理解RAG如何为LLM注入实时、精准的外部知识掌握RAG系统的核心模块设计与实现方法解决开发中常见的检索不准生成偏差等问题预期读者正在开发智能客服、企业知识库、代码助手等AI原生应用的开发者对大模型落地工程化感兴趣的算法工程师希望优化现有LLM应用效果的技术负责人文档结构概述本文采用从场景到原理→从理论到实战→从基础到优化的递进结构用写论文查资料的生活场景引出RAG核心思想拆解RAG的检索→增强→生成三阶段架构通过Python代码演示RAG系统的最小可行实现深入讲解检索优化向量召回/重排序、生成优化提示工程/后处理等关键技术结合智能客服等真实场景说明RAG的落地价值术语表术语解释RAG检索增强生成通过检索外部知识库增强大模型生成能力的技术框架向量检索将文本转换为向量嵌入通过计算向量相似度找到相关文档的技术提示工程Prompt设计输入给LLM的文本指令引导其生成符合要求的内容幻觉Hallucination大模型生成与事实不符的内容如编造不存在的事件或数据嵌入Embedding将文本转换为低维稠密向量的过程用于衡量文本语义相似性核心概念与联系故事引入写论文时的查资料-写内容过程想象你要写一篇关于2024年新能源汽车销量的论文第一步查资料你会去中国汽车工业协会官网找最新的统计报告去权威媒体查专家分析第二步写内容结合查到的资料用自己的话总结销量趋势、关键驱动因素关键动作写的过程中如果发现资料不够你会再次检索补充信息这其实就是RAG的核心思想生成内容时先检索可靠的外部知识作为素材库再基于素材生成答案。传统大模型生成像闭卷考试仅依赖训练时学的知识而RAG像开卷考试可以随时翻书查资料。核心概念解释像给小学生讲故事一样核心概念一检索模块——图书管理员检索模块就像图书馆里的超级管理员。当你问2024年新能源汽车销量如何“它会从你的知识库”可能是公司文档、行业报告、网页等里快速找到最相关的几篇资料。例子你有1000本关于汽车的书检索模块会用2024 新能源 销量这几个关键词挑出其中最可能包含答案的5本书。核心概念二生成模块——小作家生成模块是擅长组织语言的小作家。它拿到检索模块给的5本书后会仔细阅读里面的关键数据比如2024年1-6月新能源汽车销量450万辆同比增长30%“然后用流畅的语言总结成你能理解的答案。例子如果检索到的资料说销量增长主要因为电池技术进步”小作家会写成新能源汽车销量增长的核心原因是电池技术取得了关键突破。核心概念三增强环节——校对员增强环节像认真的校对员。它会检查两件事检索到的资料是否足够相关比如有没有找错书生成的答案是否准确引用了资料比如有没有把30%增长写成50%增长例子如果小作家不小心把销量450万辆写成540万辆校对员会发现这个错误并纠正。核心概念之间的关系用小学生能理解的比喻三个模块就像查资料-写作文-检查作业的三人组检索模块图书管理员和生成模块小作家的关系图书管理员给小作家递素材本小作家才能写出有依据的作文。没有素材本小作家可能会乱编就像大模型的幻觉。生成模块小作家和增强环节校对员的关系小作家写完作文后校对员帮忙检查有没有抄错数字、有没有漏掉关键信息。检索模块图书管理员和增强环节校对员的关系校对员会告诉图书管理员这次找的素材本不太相关下次要找更贴近问题的帮助图书管理员下次做得更好。核心概念原理和架构的文本示意图RAG系统的标准架构可概括为三阶段流程用户问题 → 检索模块从知识库召回相关文档 → 生成模块结合文档与问题生成答案 → 最终回答Mermaid 流程图用户提问反馈优化检索知识库反馈优化生成最终回答增强环节核心算法原理 具体操作步骤检索模块如何找到最相关的文档检索模块是RAG的前哨站核心目标是从海量知识库中快速召回高相关性、高信息量的文档。常见技术路径有两种1. 基于文本匹配的传统检索如BM25原理类似关键词搜索给每个文档计算一个相关分分数越高越相关。数学公式BM25分数计算公式为BM25∑i1n(log(N−ni0.5ni0.5)×fi(k11)fik1(1−bb⋅dlavgdl)) BM25 \sum_{i1}^{n} \left( \log \left( \frac{N - n_i 0.5}{n_i 0.5} \right) \times \frac{f_i (k_1 1)}{f_i k_1 (1 - b b \cdot \frac{dl}{avgdl})} \right)BM25i1∑n(log(ni0.5N−ni0.5)×fik1(1−bb⋅avgdldl)fi(k11))其中( N )总文档数( n_i )包含关键词( i )的文档数( f_i )关键词( i )在当前文档的出现次数( dl )当前文档长度( avgdl )平均文档长度例子搜索新能源汽车销量时BM25会给同时包含新能源“汽车”销量三个词的文档更高分数。2. 基于语义匹配的向量检索如Sentence-BERT、OpenAI Embeddings原理是将文本转换为语义向量类似给每个句子发一个数字身份证然后计算向量间的相似度越相似的句子向量距离越近。数学公式常用余弦相似度计算向量相似性余弦相似度A⋅B∣∣A∣∣⋅∣∣B∣∣ \text{余弦相似度} \frac{A \cdot B}{||A|| \cdot ||B||}余弦相似度∣∣A∣∣⋅∣∣B∣∣A⋅B其中( A )和( B )是两个文本的向量表示( ||A|| )表示向量的模长。例子句子2024年新能源汽车卖得很好和2024年新能源汽车销量增长的向量相似度很高会被判定为相关。生成模块如何结合文档生成答案生成模块的核心是提示工程Prompt即设计一条指令告诉LLM你需要根据这些文档回答问题。典型的提示模板如下你是一位专业的行业分析师。请根据以下提供的【背景资料】回答用户的问题。如果资料中没有相关信息请回答暂未找到相关信息。 【背景资料】 {检索到的文档内容} 用户问题{用户的问题} 你的回答最小RAG系统的Python实现使用LangChain以下是用LangChain快速搭建RAG系统的示例代码需要安装langchain、openai、chromadb库fromlangchain.vectorstoresimportChromafromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.chat_modelsimportChatOpenAIfromlangchain.chainsimportRetrievalQA# 1. 加载知识库这里用示例文本代替documents[2024年1-6月中国新能源汽车销量为450万辆同比增长30%,新能源汽车销量增长的主要原因是电池能量密度提升至280Wh/kg,2023年同期新能源汽车销量为346万辆]# 2. 创建向量数据库使用OpenAI的Embeddings模型embeddingsOpenAIEmbeddings(openai_api_key你的API Key)vectorstoreChroma.from_texts(documents,embeddings)# 3. 初始化LLM使用GPT-3.5-turbollmChatOpenAI(model_namegpt-3.5-turbo,temperature0)# 4. 构建RAG链检索生成rag_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,# stuff表示将所有检索到的文档直接输入LLMretrievervectorstore.as_retriever())# 5. 测试提问question2024年上半年新能源汽车销量是多少同比增长多少answerrag_chain.run(question)print(answer)代码解读第1步定义知识库内容实际应用中可能是从数据库/文件加载第2步用OpenAI的Embeddings模型将文档转换为向量存入Chroma向量数据库第3步初始化ChatGPT作为生成模型第4步通过RetrievalQA链将检索和生成模块串联第5步提问并输出答案预期输出“2024年1-6月中国新能源汽车销量为450万辆同比增长30%”数学模型和公式 详细讲解 举例说明向量检索的核心嵌入向量的相似性计算假设我们有两个句子句子A“2024年新能源汽车销量增长”句子B“2024年新能源汽车卖得很好”通过OpenAI Embeddings模型转换后得到向量( A [0.1, 0.3, -0.2, 0.5] )( B [0.15, 0.28, -0.18, 0.49] )计算余弦相似度相似度(0.1×0.15)(0.3×0.28)(−0.2×−0.18)(0.5×0.49)0.120.32(−0.2)20.52×0.1520.282(−0.18)20.492 \text{相似度} \frac{(0.1×0.15)(0.3×0.28)(-0.2×-0.18)(0.5×0.49)}{\sqrt{0.1^20.3^2(-0.2)^20.5^2} × \sqrt{0.15^20.28^2(-0.18)^20.49^2}}相似度0.120.32(−0.2)20.52×0.1520.282(−0.18)20.492(0.1×0.15)(0.3×0.28)(−0.2×−0.18)(0.5×0.49)分子计算( 0.015 0.084 0.036 0.245 0.38 )分母计算( \sqrt{0.010.090.040.25} \sqrt{0.39} ≈ 0.624 )同理B的模长≈0.628最终相似度≈ ( 0.38 / (0.624×0.628) ≈ 0.97 )接近1说明高度相似生成质量的评估ROUGE与BLEU分数为了衡量生成答案的质量常用ROUGE基于n-gram重叠率和BLEU机器翻译常用指标。例子参考答案人工标注“2024年上半年新能源汽车销量450万辆同比增长30%”生成答案“2024年1-6月新能源汽车销量450万增长30%”计算ROUGE-1单字重叠率参考答案有17个汉字含数字生成答案有16个汉字重叠的字有2024年“新能源汽车”销量450“增长30%”共14个。ROUGE-1 14/17 ≈ 0.82越接近1越好项目实战代码实际案例和详细解释说明开发环境搭建以企业知识库问答场景为例需要以下环境Python 3.8依赖库langchain0.0.330、openai0.27.10、chromadb0.4.15外部服务OpenAI API用于Embeddings和LLM、本地或云存储的知识库文档如PDF/Word/Markdown源代码详细实现和代码解读以下是一个完整的企业知识库RAG系统实现处理公司产品手册fromlangchain.document_loadersimportPyPDFLoader# 加载PDFfromlangchain.text_splitterimportRecursiveCharacterTextSplitter# 文本切分fromlangchain.vectorstoresimportChromafromlangchain.embeddingsimportOpenAIEmbeddingsfromlangchain.chat_modelsimportChatOpenAIfromlangchain.chainsimportRetrievalQA# 1. 加载并处理文档假设产品手册是product_manual.pdfloaderPyPDFLoader(product_manual.pdf)raw_documentsloader.load()# 加载PDF内容返回Document对象列表# 2. 文本切分将长文档拆分为适合检索的小块text_splitterRecursiveCharacterTextSplitter(chunk_size1000,# 每块约1000字符chunk_overlap200# 块之间重叠200字符避免信息断裂)documentstext_splitter.split_documents(raw_documents)# 3. 创建向量数据库embeddingsOpenAIEmbeddings(openai_api_keysk-...)# 替换为你的API KeyvectorstoreChroma.from_documents(documents,embeddings,persist_directory./chroma_db# 本地存储向量数据库)vectorstore.persist()# 持久化保存# 4. 初始化LLM和RAG链llmChatOpenAI(model_namegpt-3.5-turbo-1106,temperature0)# 使用最新模型rag_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,# 直接将文档输入LLM适合短文档retrievervectorstore.as_retriever(search_kwargs{k:3}),# 检索前3个文档return_source_documentsTrue# 返回引用的文档)# 5. 处理用户提问defanswer_question(question):resultrag_chain({query:question})answerresult[result]source[doc.metadata[source]fordocinresult[source_documents]]# 显示来源returnf答案{answer}\n参考文档{source}# 测试提问print(answer_question(X200型号打印机的最大打印分辨率是多少))代码解读与分析步骤1-2PDF加载后可能是几万字的长文档直接检索效率低。RecursiveCharacterTextSplitter会按段落、句子拆分确保每块包含完整语义比如打印分辨率的说明不会被拆开。步骤3用OpenAI Embeddings将每个文档块转换为1536维的向量存入Chroma数据库。Chroma支持高效的向量相似度查询比遍历所有文档快1000倍以上。步骤4RetrievalQA链的chain_type有多种模式如map_reduce适合长文档这里选stuff简单直接。search_kwargs{k:3}表示每次检索返回前3个最相关的文档。步骤5返回结果包含答案和引用的文档来源这对企业场景很重要可追溯信息是否准确。实际应用场景场景1智能客服企业级某电商公司的智能客服系统接入商品知识库包含商品参数、售后政策等。当用户问这款空调支持10年保修吗RAG系统会检索知识库中该空调的售后政策文档块生成回答“根据商品说明该空调压缩机享受10年保修其他部件保修3年”优势避免客服机器人因知识过时如政策更新或幻觉编造保修期限导致的用户投诉。场景2代码助手开发者工具GitHub Copilot X通过RAG技术整合最新的代码文档、开源仓库和官方API文档。当开发者问如何用Python的Pandas合并两个DataFrame系统会检索Pandas官方文档中合并与连接章节生成包含pd.merge()示例代码的回答并标注来源如参考Pandas 2.2官方文档优势比纯LLM生成更准确避免过时的函数用法且支持实时文档更新。场景3医疗咨询专业领域某互联网医院的智能问诊系统接入《临床诊疗指南》《药品说明书》等权威知识库。当用户问阿莫西林的儿童用量是多少RAG系统会检索《儿童用药指南》中青霉素类药物用量部分生成回答“儿童阿莫西林用量为20-40mg/kg/日分3次服用参考《国家儿童用药指南2024版》”优势降低因大模型幻觉导致的用药建议错误风险。工具和资源推荐类别工具/资源简介向量数据库Chroma轻量级本地向量数据库适合中小企业FAISSFacebook开源的高效向量检索库适合大规模数据Pinecone云托管向量数据库支持自动扩展适合高并发场景文档加载LangChain Document Loaders支持PDF/Word/Markdown/网页等50种格式的文档加载提示工程Prompt Engineering Guide开源提示工程指南https://www.promptingguide.ai/模型优化LlamaIndex针对Llama系列模型的RAG优化框架支持自定义检索策略评估工具MephistoFacebook开源的对话系统评估工具支持RAG效果评测未来发展趋势与挑战趋势1多模态RAG当前RAG主要处理文本未来会扩展到图片、视频、代码等多模态知识。例如用户问这张电路板的故障可能原因系统会检索类似故障的图片案例维修文档生成图文结合的回答。趋势2实时知识注入通过接入新闻API、实时数据库如股票行情、天气数据RAG系统将支持秒级知识更新。例如财经类应用可以实时获取最新股价生成基于当前股价的投资分析。趋势3与Agent结合RAG将与智能Agent如AutoGPT深度融合实现检索→生成→执行→再检索的闭环。例如客服Agent在回答复杂问题时会先检索知识库若信息不足则调用外部API获取数据再生成最终答案。挑战1延迟与成本平衡检索和生成的每一步都可能产生延迟如向量检索耗时、LLM生成耗时需优化系统架构如缓存高频检索结果、使用轻量级检索模型。同时向量存储和LLM调用的成本需控制如选择开源Embeddings模型替代OpenAI。挑战2长尾问题处理对于非常冷门的问题如某小众工业设备的维修步骤知识库可能没有相关文档。此时需设计 fallback策略如转人工客服、提示用户补充信息。挑战3伦理与安全RAG系统可能检索到错误或有害信息如虚假医疗广告需增加内容审核模块通过关键词过滤、安全模型评分确保生成内容符合法规和伦理要求。总结学到了什么核心概念回顾检索模块从知识库中召回相关文档像图书管理员找书生成模块结合文档和问题生成答案像小作家写作文增强环节优化检索和生成效果像校对员检查作业概念关系回顾三者形成检索→生成→优化的闭环检索为生成提供弹药生成基于弹药输出答案增强环节通过反馈让检索和生成越来越准。思考题动动小脑筋假设你的知识库是公司内部1000份产品文档用户问X300型号路由器的Wi-Fi6最大速率是多少“但检索模块返回的文档中没有直接答案只有X300支持Wi-Fi6协议和Wi-Fi6最大理论速率9.6Gbps”。此时生成模块应该如何回答如何优化检索模块避免这种情况你需要为医疗RAG系统设计内容安全审核模块会考虑哪些审核规则提示可以从医学准确性、用户隐私、广告过滤等角度思考当用户的问题很长如2000字的技术咨询直接输入LLM可能超过上下文限制。如何优化RAG的检索和生成流程提示可以考虑问题切分、分层检索附录常见问题与解答Q1RAG和Fine-tuning微调大模型有什么区别A微调是让大模型在特定数据上重新训练适合优化通用能力如更符合企业风格的回答RAG是通过外部知识库动态注入知识适合解决知识时效性和事实准确性问题。两者可结合使用如先微调模型再用RAG增强。Q2如何选择检索模型A如果知识库是通用领域如新闻、常识推荐OpenAI Embeddings或Sentence-BERT语义理解好如果是专业领域如法律、医学推荐领域微调的Embeddings模型如LegalBERT、BioBERT。Q3文档切分的长度应该设置多少A通常建议500-2000字符。太短可能丢失上下文如前因后果被拆开太长会增加检索计算量。可通过实验调整如用不同chunk_size测试检索准确率。Q4如何评估RAG系统的效果A推荐人工自动结合自动评估用ROUGE/BLEU分数衡量生成答案与参考答案的匹配度人工评估从相关性“准确性”可读性三个维度打分如5分制业务指标如智能客服的用户满意度“转人工率”扩展阅读 参考资料论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》https://arxiv.org/abs/2005.11401LangChain官方文档https://python.langchain.com/OpenAI Embeddings指南https://platform.openai.com/docs/guides/embeddings《大模型时代的知识增强技术》机械工业出版社2024