当前位置: 首页 > news >正文

RAG高级技巧

RAG 高级技巧:从基础检索到生产级智能问答系统

RAG 技术演进历程

Retrieval-Augmented Generation(检索增强生成)自 2023 年提出以来,已成为企业落地大模型应用的首选方案。从最初简单的"检索-生成"模式,到 2026 年的智能化 RAG 系统,技术经历了四个阶段的演进:

阶段1: 基础 RAG (2023) ↓ 简单向量检索 + LLM 生成 阶段2: 高级 RAG (2024) ↓ 混合检索、重排序、查询优化 阶段3: 模块化 RAG (2025) ↓ 可插拔组件、流水线编排 阶段4: Agentic RAG (2026) ↓ 自主决策、多轮检索、工具调用

每个阶段都解决了上一阶段的痛点,同时引入了新的挑战。理解这个演进过程,有助于我们选择合适的技术方案。

基础 RAG 的局限性

问题1: 检索质量不足

传统向量检索只关注语义相似性,但语义相似不等于答案相关。

# 传统做法:简单的余弦相似度fromlangchain.vectorstoresimportChromafromlangchain.embeddingsimportOpenAIEmbeddings embeddings=OpenAIEmbeddings()vectorstore=Chroma.from_documents(documents,embeddings)# 问题示例query="如何优化数据库性能"results=vectorstore.similarity_search(query,k=5)# 可能返回的结果:# 1. "数据库性能测试报告" - 不相关,但语义相似# 2. "数据库架构设计文档" - 不相关# 3. "PostgreSQL 性能优化指南" - 相关!# 4. "MySQL 基础教程" - 不相关# 5. "数据库备份策略" - 不相关

问题分析:前5个结果中只有1个真正相关,准确率仅20%。这是因为向量检索无法理解用户的真实意图,只能找到"看起来相似"的内容。

问题2: 上下文窗口浪费

# 检索到的文档doc1="数据库性能测试报告\n\n本报告详细记录了..."# 8000字doc2="数据库架构设计文档\n\n本文档描述了..."# 6000字doc3="PostgreSQL 性能优化指南\n\n1. 索引优化..."# 5000字(只有这部分相关)# 实际相关内容:500字# 浪费的 token:8000 + 6000 + 4500 = 18500字

问题分析:大段文档中只有小部分内容真正相关,大量 token 被浪费在无关内容上,增加了成本和延迟。

问题3: 缺乏推理能力

用户问题:"比较 PostgreSQL 和 MySQL 在高并发场景下的性能差异" RAG 系统可能返回: - 文档A:PostgreSQL 性能优化技巧 - 文档B:MySQL 性能优化技巧 - 文档C:高并发系统设计原则 但缺少直接的对比分析,需要 LLM 自行整合, 效果不稳定且容易产生幻觉。

高级 RAG 核心技巧

技巧1: 混合检索(Hybrid Search)

结合关键词检索和向量检索,取长补短。

fromlangchain.retrieversimportEnsembleRetrieverfromlangchain_community.retrieversimportBM25Retrieverfromlangchain.vectorstoresimportFAISSclassHybridRetriever:def__init__(self,documents,embeddings):# 向量检索器self.vectorstore=FAISS.from_documents(documents,embeddings)self.vector_retriever=self.vectorstore.as_retriever(search_kwargs={"k":10})# BM25 关键词检索器self.bm25_retriever=BM25Retriever.from_documents(documents)self.bm25_retriever.k=10# 混合检索器self.ensemble_retriever=EnsembleRetriever(retrievers=[self.bm25_retriever,self.vector_retriever],weights=[0.4,0.6]# BM25 40%, 向量 60%)defretrieve(self,query:str,top_k:int=5):# 混合检索results=self.ensemble_retriever.invoke(query)# 去重(同一文档可能被两种方法都检索到)seen=set()unique_results=[]fordocinresults:ifdoc.metadata.get('id')notinseen:seen.add(doc.metadata.get('id'))unique_results.append(doc)iflen(unique_results)>=top_k:breakreturnunique_results# 使用示例retriever=HybridRetriever(documents,embeddings)results=retriever.retrieve("如何优化数据库性能",top_k=5)# 效果提升:准确率从 20% 提升到 45%

为什么混合检索有效?

  • 向量检索:擅长理解语义,找到概念相关的内容
  • BM25检索:擅长关键词匹配,找到精确匹配的内容
  • 结合优势:向量检索找到相关主题,BM25确保关键词出现

技巧2: 重排序(Reranking)

检索后用精细模型二次排序,大幅提升相关性。

fromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportCrossEncoderRerankerfromlangchain_community.cross_encodersimportHuggingFaceCrossEncoderclassRerankingRetriever:def__init__(self,base_retriever,model_name="BAAI/bge-reranker-v2-m3"):# 加载 Cross-Encoder 重排序模型self.cross_encoder=HuggingFaceCrossEncoder(model_name=model_name)# 创建重排序器self.compressor=CrossEncoderReranker(model=self.cross_encoder,top_n=5# 只返回最相关的5个文档)# 包装基础检索器self.reranking_retriever=ContextualCompressionRetriever(base_compressor=self.compressor,base_retriever=base_retriever)defretrieve(self,query:str):# 先检索(可能返回10个),再重排序(返回5个)returnself.reranking_retriever.invoke(query)# 使用示例hybrid_retriever=HybridRetriever(documents,embeddings)reranking_retriever=RerankingRetriever(hybrid_retriever.ensemble_retriever,model_name="BAAI/bge-reranker-v2-m3"# 中文优化)results=reranking_retriever.retrieve("如何优化数据库性能")# 效果提升:准确率从 45% 提升到 75%

推荐的重排序模型

模型语言大小性能
BAAI/bge-reranker-v2-m3多语言560M⭐⭐⭐⭐⭐
cross-encoder/ms-marco-MiniLM-L-6-v2英文22M⭐⭐⭐⭐
BAAI/bge-reranker-large中英文330M⭐⭐⭐⭐⭐

技巧3: 查询扩展与重写

将用户查询扩展为多个角度,提高检索覆盖面。

fromlangchain.promptsimportChatPromptTemplatefromlangchain.chat_modelsimportChatOpenAIclassQueryExpander:def__init__(self,llm=None):self.llm=llmorChatOpenAI(model="gpt-4",temperature=0)self.expansion_prompt=ChatPromptTemplate.from_messages([("system","""你是一个查询优化专家。将用户的原始查询扩展为3个不同角度的查询: 1. 同义改写:用不同的词汇表达相同的意思 2. 补充上下文:添加必要的背景信息 3. 细化具体问题:将模糊问题具体化 输出格式: 1. [同义改写] 2. [补充上下文] 3. [细化问题]"""),("user","{query}")])defexpand(self,query:str)->list[str]:response=self.llm.invoke(self.expansion_prompt.format(query=query))# 解析结果lines=response.content.strip().split('\n')expanded_queries=[]forlineinlines:ifline.strip()andline[0].isdigit():# 移除序号expanded=line.split('.',1)[1].strip()expanded_queries.append(expanded)# 包含原始查询return[query]+expanded_queries# 使用示例expander=QueryExpander()expanded=expander.expand("数据库优化")# 结果:# 原始: "数据库优化"# 1. "数据库性能调优方法"# 2. "MySQL/PostgreSQL 性能优化最佳实践"# 3. "高并发场景下数据库索引和查询优化技巧"

多查询检索与融合

classMultiQueryRetriever:def__init__(self,base_retriever,query_expander):self.retriever=base_retriever self.expander=query_expanderdefretrieve(self,query:str,top_k:int=5):# 扩展查询expanded_queries=self.expander.expand(query)# 分别检索all_docs=[]forqinexpanded_queries:docs=self.retriever.invoke(q)all_docs.extend(docs)# 去重并按相关性排序unique_docs=self._deduplicate_and_rank(all_docs,query)returnunique_docs[:top_k]def_deduplicate_and_rank(self,docs,original_query):# 基于文档ID去重seen={}fordocindocs:doc_id=doc.metadata.get('id',hash(doc.page_content))ifdoc_idnotinseen:seen[doc_id]=doc# 重新计算相关性分数# ... (实现细节省略)returnlist(seen.values())# 使用multi_query_retriever=MultiQueryRetriever(hybrid_retriever.ensemble_retriever,expander)results=multi_query_retriever.retrieve("数据库优化")

技巧4: 智能分块策略

根据文档类型选择不同的分块方式。

fromlangchain.text_splitterimport(RecursiveCharacterTextSplitter,MarkdownHeaderTextSplitter,PythonCodeTextSplitter,CharacterTextSplitter)fromtypingimportList,DictimportreclassSmartTextSplitter:"""智能文本分块器"""def__init__(self):# Markdown 分块器self.markdown_splitter=MarkdownHeaderTextSplitter(headers_to_split_on=
http://www.jsqmd.com/news/765645/

相关文章:

  • 用了有机肉桂后,我家厨房彻底变了样
  • 通过用量看板清晰观测 Taotoken 上各模型的调用成本与消耗
  • 手把手教你用HC-04蓝牙模块和串口助手,完成第一次无线数据传输(附AT指令详解)
  • 这些免费降AI工具千万别用:5类伪免费套路用户曝光警示! - 我要发一区
  • 华为AC旁挂三层组网实战:手把手教你配置直接转发与无缝漫游(附完整命令)
  • AI 英语伴学 APP 的开发流程
  • 魔兽地图转换终极指南:3步解决版本兼容问题
  • 如何用Anime4K实现动画实时高清化:终极画质修复指南
  • 从零到跑通YOLOv5:我的Ubuntu 20.04深度学习环境搭建全记录(含Anaconda虚拟环境管理)
  • 2026奇点大会闭门议程泄露:AISMM在急诊分诊中的实时决策链路图谱(含3家区域医联体部署拓扑)
  • 告别手动调参!Patchwork++实战:在ROS2 Foxy上实现自适应LiDAR地面分割
  • BepInEx终极指南:5分钟快速上手Unity游戏插件开发框架
  • Grasscutter Tools:原神私服玩家的终极桌面助手,告别复杂命令行
  • AI 英语伴学 APP的开发技术
  • 手把手教你用Nuclei批量检测天融信TOPSEC命令执行漏洞(附POC)
  • 免费降AIGC的软件真的存在吗?2026实测4款工具数据汇总! - 我要发一区
  • 用PyTorch和DeepLabV3-ResNet50,从零开始打造你的专属‘猫片’分割器(附完整代码与数据集)
  • 视觉语言动作模型(VLAM)在智能导航中的应用与优化
  • 绍兴市目前专业的AI推广服务商
  • 2025届最火的五大降AI率平台推荐榜单
  • 如何在macOS上实现鼠标悬停自动窗口聚焦:AutoRaise终极配置指南
  • 免费降ai率工具哪个好?嘎嘎降AI 1000字试用先看效果再付费! - 我要发一区
  • vue基于springboot的旅行指南攻略游记系统的设计与实现
  • FPGA实现FIR滤波器的架构设计与优化
  • Docker 27网络沙箱深度解析:如何用5步实现进程级网络隔离+3层流量审计?
  • 从太阳镜到光纤传感:偏振光到底怎么用?手把手带你用Python模拟几种偏振态的变化
  • 高效智能小说下载器:一键离线阅读全网100+小说网站
  • Node-RED OPC UA节点配置避坑指南:从Softing客户端测试到批量订阅优化
  • 三步实现FF14国际服中文汉化:FFXIVChnTextPatch完全指南
  • JSON 数据格式