文章目录课程导读 学习目标前置知识与环境准备1.1 环境沿用1.2 依赖包安装1.3 上节课回顾与本课定位核心概念深度拆解2.1 为什么要混合检索两条腿走路2.2 标准混合检索架构与工程实证2.3 RRF融合算法详解2.4 为什么需要重排序底层运行原理剖析3.1 混合检索加全流程数据流3.2 Cross-Encoder vs Bi-Encoder 对比3.3 Contextual Compression检索器的包装链路核心API/组件源码解读4.1 ContextualCompressionRetriever4.2 CohereRerank 官方封装4.3 使用BM25s构建关键词检索手把手项目实战教学实战一混合检索 RRF 融合打分实战二重排序器与压缩检索器集成实战三一站式链式优化完整可运行Python代码环境依赖安装命令常见报错坑点与避坑方案坑1混合检索时向量库用GPT Embedding但搜索出的文本张冠李戴坑2BM25索引加载慢坑3重排序模型过大坑4RRF融合后仍召回不相关的文档本节核心知识点总结课后练习题参考答案《30节课 LangChain 从入门到精通》系列课程导航课程导读 学习目标在上一节课中我们手写实现了一个完整的RAG系统体验了从文档切片、向量化、检索到生成的标准化工作流。但在真实的生产环境中这个基础RAG往往面临三个“老大难”问题精确匹配失灵用户问“Spring Boot 3.5有什么特性”向量检索返回了Spring Boot 2.7的文档用户搜“CVE-2024-38819”系统捞出来一堆不相关的安全漏洞文档。检索结果顺位不准向量索引算法HNSW等存在一定的近似随机性导致真正相关的文档可能排在第3或第4位而非最前面。上下文太长为了检索全面你不得不设置较高的Top-K值结果送入大模型的提示词里塞进了成吨的无关片段既浪费Token又稀释了有效信息。本节课是RAG篇章的进阶优化课将深入剖析解决这些痛点的三大核心技术。重排序Re-ranking通过Cross-Encoder模型对检索结果精准再打分修正向量检索的排序偏差确保最相关的文档优先进入生成环节。上下文压缩Context Compression用LLM提取文档中的精华句段剔除噪音在保留关键信息的同时大幅缩短提示词长度。混合检索Hybrid Search融合BM25关键词检索与向量语义检索再配合RRF融合算法实现“语义理解”与“字面量精确匹配”的双重保障。学完本节课你将能够深入理解Cross-Encoder与Bi-Encoder的本质区别并掌握在LangChain中集成重排序算法BGE-Reranker、Cohere Rerank、RankLLM。熟练使用ContextualCompressionRetriever结合各种文档压缩器LLMChainExtractor、CrossEncoderReranker实现一次包装后检索即精排。掌握混合检索的标准落地方法BM25词频索引向量数据库并行召回通过加权融合RRF合并结果并注入重排序精排。前置知识与环境准备1.1 环境沿用继续使用前几课的langchain_course虚拟环境Python 3.10。本节课将用到额外依赖# 激活虚拟环境sourcevenv/bin/activate# Mac/Linux# venv\Scripts\activate # Windows# 升级pippipinstall--upgradepip1.2 依赖包安装# 基础依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1# 向量数据库与嵌入沿用之前pipinstallchromadb sentence-transformers langchain-text-splitters# 重排序相关pipinstalllangchain-cohere# Cohere Rerank APIpipinstallflagembedding bm25s# BM25关键词检索 # bm25s 是纯Python BM25实现性能优异pipinstallrank_bm25# 备选BM25库推荐使用bm25spipinstallunstructured[pdf,docx]# 用于复杂文档加载# 可选安装 BGE-Reranker 开源模型需要transformerspipinstalltorch transformers sentencepiece# 验证关键组件python-cfrom langchain.retrievers import ContextualCompressionRetriever; from langchain_cohere import CohereRerank; print(✓ 进阶检索组件导入成功)1.3 上节课回顾与本课定位在第21课中我们学习了RAG的四段式基本流程。然而基础RAG无法处理精确词汇匹配和长尾知识。本节课所讲的三大技术——将混合检索放在最前面因为它解决的是初筛阶段的全面性问题然后用重排序优化顺序最后用上下文压缩做后处理。三者可以串联构成“多路检索→重排序精排→压缩”的工业级检索漏斗。核心概念深度拆解2.1 为什么要混合检索两条腿走路纯向量检索擅长语义理解能泛化替代解释但对专有名词、版本号、错误码等字面量匹配的命中率极低。当你问“CVE-2024-38819”时向量模型偏向丢回任何与“安全漏洞”语义相近的文档而不是精准命中特定ID。同理BM25关键词检索擅长精确字符串匹配抓取配置键、API路径、error strings轻车熟路但对同义词泛化无能为力。最简单的混合检索方式是同时执行向量检索和关键词检索将两个结果列表通过融合算法合并取Top-K作为候选。这样既能覆盖语义上的相关性又能确保精确词汇的召回。2.2 标准混合检索架构与工程实证工业级RAG系统的混合检索通常采用两阶段漏斗架构召回阶段BM25关键词检索与向量语义检索并行执行各自召回Top-N通常N20~50候选融合阶段使用RRF算法融合两个列表按融合得分排序精排阶段将Top-MM1020送入重排序模型进行深度打分取最终Top-KK35送入大模型混合检索方案在实际业务场景中的数据表现惊人某头部企业的测试数据显示混合检索较单一检索方式准确率提升41%召回率提升28%。在金融领域的实践中混合检索使问答准确率从68%提升至89%核心业务场景覆盖率提高42%。Blended RAG、HyPA-RAG等前沿研究也一致表明关键词与向量检索的组合可使召回率提升3到3.5倍端到端答案准确率提高11%到15%。2026年的主流量产方案已经将混合检索与重排序视为RAG的标配组件。2.3 RRF融合算法详解两路检索的分数量纲不同BM25词频得分与余弦距离无法直接对比主流方案是用RRF算法来只看排名位置融合。RRF的核心思想是将两个排序列表中每个文档的排名转换为一个倒数分值加总后排序。候选公式如下score(d) Σ_{r in R} 1 / (k rank_r(d))其中k为平滑常数通常取60。某文档在某路排名第一得分1/(k1)约0.016排名第十得分约0.014差距不大说明RRF天然倾向于提升第一梯队排名而非拉大差距。用排名融合避免了不同检索模式得分归一化的问题极大简化了融合逻辑。2.4 为什么需要重排序向量检索使用的是Bi-Encoder双塔编码器查询和文档分别单独编码在向量空间中通过余弦距离近似判断相似性查询与文档之间没有深度交互。重排序的核心差异在于它使用了Cross-Encoder架构查询与文档拼接成单一序列送入模型进行联合编码。自注意力机制在两者间充分交换信息最终输出一个0到1之间的相关性分数。根据2026年主流评估Cross-Encoder重排序已经从“可选优化”彻底转变为“工业级RAG的必选组件”。向量索引算法存在一定的近似随机性导致除了第一条之外的其他结果往往不够准因此需要先用高召回率甚至牺牲精度召回较多候选文档再让重排序模型进行精排过滤。底层运行原理剖析3.1 混合检索加全流程数据流用户输入查询后以下流程串联多个技术组件查询进入系统被分发到两个平行的检索器。向量检索器通过嵌入模型生成向量在向量库中执行相似度搜索。BM25检索器对文档库执行关键词匹配根据词频-逆文档频率计算相关性得分。两个结果列表进入RRF融合器根据排名权重重新计算融合分数。融合后的结果排序交给ContextualCompressionRetriever该检索器先执行基础检索再调用CrossEncoderReranker对每一查询文档对重打分。最终筛选出的Top-K文档送到大模型生成答案。若开启上下文压缩LLM在生成前还会对每个文档做精华提取仅保留最相关的句子。3.2 Cross-Encoder vs Bi-Encoder 对比Bi-Encoder典型如BGE-M3、OpenAI text-embedding-3的编码是大规模快速初筛的理想工具适合离线向量化建库与毫秒级初检但无法深度交互。Cross-Encoder如BGE-Reranker、Cohere Rerank适合对候选集做精排序用于RAG流程的“最后一公里”优化。实际生产中业界普遍采用Bi-Encoder负责初筛召回如Top-100Cross-Encoder在候选集上做精排。3.3 Contextual Compression检索器的包装链路高级压缩形式有两种LLMChainExtractor和CrossEncoderReranker提取式压缩LLMChainExtractor——将每个查询文档发给模型要求模型从中提取出与查询最相关的句子。这样冗余信息被滤掉返回的文档短小精悍。重排序压缩CrossEncoderReranker——调用Cross-Encoder对候选文档做二次评分按得分排序后截取Top-K输出。两者的设计都遵循LangChain统一的BaseDocumentCompressor接口可轻松注入ContextualCompressionRetriever。核心API/组件源码解读4.1 ContextualCompressionRetrieverfromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportLLMChainExtractor,CrossEncoderReranker# 基础检索器base_retrievervectorstore.as_retriever(search_kwargs{k:10})# 压缩器compressorLLMChainExtractor.from_llm(llm)# 包装compression_retrieverContextualCompressionRetriever(base_retrieverbase_retriever,base_compressorcompressor)4.2 CohereRerank 官方封装fromlangchain_cohereimportCohereRerank rerankCohereRerank(modelrerank-multilingual-v3.0,top_n3)# 在 ContextualCompressionRetriever 中使用retrieverContextualCompressionRetriever(base_retrieverbase_retriever,base_compressorrerank)Cohere的Rerank API返回按照查询相关性排序后的文档列表是工业级重排序实现的首选。4.3 使用BM25s构建关键词检索bm25s库实现高性能检索完全内存运行不依赖外部索引服务器importbm25sdefbuild_bm25_retriever(corpus:list[str])-bm25s.BM25:retrieverbm25s.BM25(corpuscorpus)retriever.index(bm25s.tokenize(corpus))returnretrieverdefbm25_search(retriever:bm25s.BM25,query:str,k:int5):results,scoresretriever.retrieve(bm25s.tokenize([query]),kk)returnresults[0]# 返回文档列表手把手项目实战教学实战一混合检索 RRF 融合打分构建一个小型演示库实现向量检索与BM25检索并行融合返回。importbm25sfromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain.retrieversimportEnsembleRetriever# 准备语料corpus[LangChain是一个开源的LLM应用框架,RAG通过外部知识库提升生成准确性,Spring Boot 3.5引入了新的自动配置特性,向量数据库用于存储海量文本向量]# 向量检索器embeddingsHuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2)vectorstoreFAISS.from_texts(corpus,embeddings)vector_retrievervectorstore.as_retriever(search_kwargs{k:10})# BM25检索器keyword_retrieverbm25s.BM25(corpuscorpus)keyword_retriever.index(bm25s.tokenize(corpus))# 使用 LangChain 的 EnsembleRetriever 进行融合ensemble_retrieverEnsembleRetriever(retrievers[vector_retriever,keyword_retriever],weights[0.5,0.5])querySpring Boot 3.5新特性docsensemble_retriever.invoke(query)print(f混合检索结果:{[doc.page_contentfordocindocs]})实战二重排序器与压缩检索器集成将CrossEncoderReranker组件直接接入ContextualCompressionRetriever。fromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportCrossEncoderRerankerfromsentence_transformersimportCrossEncoder# 加载重排序模型modelCrossEncoder(BAAI/bge-reranker-base)rerankerCrossEncoderReranker(modelmodel,top_n3)compression_retrieverContextualCompressionRetriever(base_retrievervector_retriever,base_compressorreranker)resultcompression_retriever.invoke(LangChain的核心组件)fordocinresult:print(doc.page_content[:80])实战三一站式链式优化混合检索重排序生成联动fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough promptChatPromptTemplate.from_template(基于上下文回答问题:\n{context}\n问题:{query})chain({context:compression_retriever|(lambdadocs:\n.join([d.page_contentfordindocs])),query:RunnablePassthrough()}|prompt|llm|StrOutputParser())print(chain.invoke(LangChain中链是什么概念))完整可运行Python代码将三大优化集成实现完整工业级RAG管道。#!/usr/bin/env python# -*- coding: utf-8 -*-LangChain 第22课RAG进阶优化完整示例混合检索引申重排序压缩importbm25sfromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain.retrieversimportEnsembleRetrieverfromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportCrossEncoderRerankerfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthroughfromsentence_transformersimportCrossEncoderfromdotenvimportload_dotenv load_dotenv()corpus[LangChain是构建LLM应用的开源框架。,RAG通过检索外部知识提升生成准确性。,Spring Boot 3.5引入了新特性。,向量数据库用于存储文本向量。,重排序通过Cross-Encoder提高检索精度。]embeddingsHuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2)vectorstoreFAISS.from_texts(corpus,embeddings)vector_retrievervectorstore.as_retriever(search_kwargs{k:5})bm25_retrieverbm25s.BM25(corpuscorpus)bm25_retriever.index(bm25s.tokenize(corpus))ensemble_retrieverEnsembleRetriever(retrievers[vector_retriever,bm25_retriever],weights[0.5,0.5])modelCrossEncoder(BAAI/bge-reranker-base)rerankerCrossEncoderReranker(modelmodel,top_n3)compression_retrieverContextualCompressionRetriever(base_retrieverensemble_retriever,base_compressorreranker)querySpring Boot 3.5新特性docscompression_retriever.invoke(query)print(f重排后最终检索到{len(docs)}个文档)fordocindocs:print(f-{doc.page_content[:80]})环境依赖安装命令# 激活虚拟环境sourcevenv/bin/activate# venv\Scripts\activate# 全量安装pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1 chromadb sentence-transformers langchain-text-splitters langchain-cohere bm25s rank_bm25 torch# 重排开源模型依赖pipinstalltransformers flagembedding请确保在.env文件中配置好COHERE_API_KEY若使用Cohere Rerank或预先下载BAAI/bge-reranker-base。常见报错坑点与避坑方案坑1混合检索时向量库用GPT Embedding但搜索出的文本张冠李戴原因嵌入模型可能在向量空间中过于近似导致乱匹配。方案改用领域微调嵌入模型或语义分割/混合检索补足。坑2BM25索引加载慢原因每次服务启动重建索引占用性能。方案持久化BM25索引利用bm25s内置save能力。坑3重排序模型过大原因BGE-Reranker-large占用显存超3GB不适合轻薄型部署。方案采用BGE-Reranker-base或轻量级ms-marco-MiniLM-L-6-v2。坑4RRF融合后仍召回不相关的文档原因BM25或向量检索初筛质量太差。方案增加初始召回数量或添加元数据预过滤。本节核心知识点总结混合检索通过向量检索BM25提升召回广度和专有名词匹配度是RAG系统的主流基石。重排序使用Cross-Encoder模型二次打分修正召回排序偏差是提升精度的核心组件。上下文压缩有效剔除冗余片段改善提示Token效率。EnsembleRetriever和ContextualCompressionRetriever封装了两阶段漏斗的标准实现。课后练习题向混合检索中加入第三个权重分配例如BM25与向量检索各占50%。解释为什么Cross-Encoder比向量检索更适合精排。Cohere Rerank和开源BGE-Reranker优缺点。参考答案第1题实现向量与BM25两部分权重相加融合。RRF用排名位置而非原始得分避免了归一化问题。第2题Bi-Encoder独立编码查询和文档信息交互不足Cross-Encoder拼接联合编码自注意力机制深度捕捉精确关联。第3题Cohere托管模型方便但成本较高BGE-Reranker完全免费适合本地部署与隐私场景。《30节课 LangChain 从入门到精通》系列课程导航去订阅 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见
第22课:LangChain|RAG进阶优化【重排序、上下文压缩、混合检索策略】
发布时间:2026/5/21 22:31:25
文章目录课程导读 学习目标前置知识与环境准备1.1 环境沿用1.2 依赖包安装1.3 上节课回顾与本课定位核心概念深度拆解2.1 为什么要混合检索两条腿走路2.2 标准混合检索架构与工程实证2.3 RRF融合算法详解2.4 为什么需要重排序底层运行原理剖析3.1 混合检索加全流程数据流3.2 Cross-Encoder vs Bi-Encoder 对比3.3 Contextual Compression检索器的包装链路核心API/组件源码解读4.1 ContextualCompressionRetriever4.2 CohereRerank 官方封装4.3 使用BM25s构建关键词检索手把手项目实战教学实战一混合检索 RRF 融合打分实战二重排序器与压缩检索器集成实战三一站式链式优化完整可运行Python代码环境依赖安装命令常见报错坑点与避坑方案坑1混合检索时向量库用GPT Embedding但搜索出的文本张冠李戴坑2BM25索引加载慢坑3重排序模型过大坑4RRF融合后仍召回不相关的文档本节核心知识点总结课后练习题参考答案《30节课 LangChain 从入门到精通》系列课程导航课程导读 学习目标在上一节课中我们手写实现了一个完整的RAG系统体验了从文档切片、向量化、检索到生成的标准化工作流。但在真实的生产环境中这个基础RAG往往面临三个“老大难”问题精确匹配失灵用户问“Spring Boot 3.5有什么特性”向量检索返回了Spring Boot 2.7的文档用户搜“CVE-2024-38819”系统捞出来一堆不相关的安全漏洞文档。检索结果顺位不准向量索引算法HNSW等存在一定的近似随机性导致真正相关的文档可能排在第3或第4位而非最前面。上下文太长为了检索全面你不得不设置较高的Top-K值结果送入大模型的提示词里塞进了成吨的无关片段既浪费Token又稀释了有效信息。本节课是RAG篇章的进阶优化课将深入剖析解决这些痛点的三大核心技术。重排序Re-ranking通过Cross-Encoder模型对检索结果精准再打分修正向量检索的排序偏差确保最相关的文档优先进入生成环节。上下文压缩Context Compression用LLM提取文档中的精华句段剔除噪音在保留关键信息的同时大幅缩短提示词长度。混合检索Hybrid Search融合BM25关键词检索与向量语义检索再配合RRF融合算法实现“语义理解”与“字面量精确匹配”的双重保障。学完本节课你将能够深入理解Cross-Encoder与Bi-Encoder的本质区别并掌握在LangChain中集成重排序算法BGE-Reranker、Cohere Rerank、RankLLM。熟练使用ContextualCompressionRetriever结合各种文档压缩器LLMChainExtractor、CrossEncoderReranker实现一次包装后检索即精排。掌握混合检索的标准落地方法BM25词频索引向量数据库并行召回通过加权融合RRF合并结果并注入重排序精排。前置知识与环境准备1.1 环境沿用继续使用前几课的langchain_course虚拟环境Python 3.10。本节课将用到额外依赖# 激活虚拟环境sourcevenv/bin/activate# Mac/Linux# venv\Scripts\activate # Windows# 升级pippipinstall--upgradepip1.2 依赖包安装# 基础依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1# 向量数据库与嵌入沿用之前pipinstallchromadb sentence-transformers langchain-text-splitters# 重排序相关pipinstalllangchain-cohere# Cohere Rerank APIpipinstallflagembedding bm25s# BM25关键词检索 # bm25s 是纯Python BM25实现性能优异pipinstallrank_bm25# 备选BM25库推荐使用bm25spipinstallunstructured[pdf,docx]# 用于复杂文档加载# 可选安装 BGE-Reranker 开源模型需要transformerspipinstalltorch transformers sentencepiece# 验证关键组件python-cfrom langchain.retrievers import ContextualCompressionRetriever; from langchain_cohere import CohereRerank; print(✓ 进阶检索组件导入成功)1.3 上节课回顾与本课定位在第21课中我们学习了RAG的四段式基本流程。然而基础RAG无法处理精确词汇匹配和长尾知识。本节课所讲的三大技术——将混合检索放在最前面因为它解决的是初筛阶段的全面性问题然后用重排序优化顺序最后用上下文压缩做后处理。三者可以串联构成“多路检索→重排序精排→压缩”的工业级检索漏斗。核心概念深度拆解2.1 为什么要混合检索两条腿走路纯向量检索擅长语义理解能泛化替代解释但对专有名词、版本号、错误码等字面量匹配的命中率极低。当你问“CVE-2024-38819”时向量模型偏向丢回任何与“安全漏洞”语义相近的文档而不是精准命中特定ID。同理BM25关键词检索擅长精确字符串匹配抓取配置键、API路径、error strings轻车熟路但对同义词泛化无能为力。最简单的混合检索方式是同时执行向量检索和关键词检索将两个结果列表通过融合算法合并取Top-K作为候选。这样既能覆盖语义上的相关性又能确保精确词汇的召回。2.2 标准混合检索架构与工程实证工业级RAG系统的混合检索通常采用两阶段漏斗架构召回阶段BM25关键词检索与向量语义检索并行执行各自召回Top-N通常N20~50候选融合阶段使用RRF算法融合两个列表按融合得分排序精排阶段将Top-MM1020送入重排序模型进行深度打分取最终Top-KK35送入大模型混合检索方案在实际业务场景中的数据表现惊人某头部企业的测试数据显示混合检索较单一检索方式准确率提升41%召回率提升28%。在金融领域的实践中混合检索使问答准确率从68%提升至89%核心业务场景覆盖率提高42%。Blended RAG、HyPA-RAG等前沿研究也一致表明关键词与向量检索的组合可使召回率提升3到3.5倍端到端答案准确率提高11%到15%。2026年的主流量产方案已经将混合检索与重排序视为RAG的标配组件。2.3 RRF融合算法详解两路检索的分数量纲不同BM25词频得分与余弦距离无法直接对比主流方案是用RRF算法来只看排名位置融合。RRF的核心思想是将两个排序列表中每个文档的排名转换为一个倒数分值加总后排序。候选公式如下score(d) Σ_{r in R} 1 / (k rank_r(d))其中k为平滑常数通常取60。某文档在某路排名第一得分1/(k1)约0.016排名第十得分约0.014差距不大说明RRF天然倾向于提升第一梯队排名而非拉大差距。用排名融合避免了不同检索模式得分归一化的问题极大简化了融合逻辑。2.4 为什么需要重排序向量检索使用的是Bi-Encoder双塔编码器查询和文档分别单独编码在向量空间中通过余弦距离近似判断相似性查询与文档之间没有深度交互。重排序的核心差异在于它使用了Cross-Encoder架构查询与文档拼接成单一序列送入模型进行联合编码。自注意力机制在两者间充分交换信息最终输出一个0到1之间的相关性分数。根据2026年主流评估Cross-Encoder重排序已经从“可选优化”彻底转变为“工业级RAG的必选组件”。向量索引算法存在一定的近似随机性导致除了第一条之外的其他结果往往不够准因此需要先用高召回率甚至牺牲精度召回较多候选文档再让重排序模型进行精排过滤。底层运行原理剖析3.1 混合检索加全流程数据流用户输入查询后以下流程串联多个技术组件查询进入系统被分发到两个平行的检索器。向量检索器通过嵌入模型生成向量在向量库中执行相似度搜索。BM25检索器对文档库执行关键词匹配根据词频-逆文档频率计算相关性得分。两个结果列表进入RRF融合器根据排名权重重新计算融合分数。融合后的结果排序交给ContextualCompressionRetriever该检索器先执行基础检索再调用CrossEncoderReranker对每一查询文档对重打分。最终筛选出的Top-K文档送到大模型生成答案。若开启上下文压缩LLM在生成前还会对每个文档做精华提取仅保留最相关的句子。3.2 Cross-Encoder vs Bi-Encoder 对比Bi-Encoder典型如BGE-M3、OpenAI text-embedding-3的编码是大规模快速初筛的理想工具适合离线向量化建库与毫秒级初检但无法深度交互。Cross-Encoder如BGE-Reranker、Cohere Rerank适合对候选集做精排序用于RAG流程的“最后一公里”优化。实际生产中业界普遍采用Bi-Encoder负责初筛召回如Top-100Cross-Encoder在候选集上做精排。3.3 Contextual Compression检索器的包装链路高级压缩形式有两种LLMChainExtractor和CrossEncoderReranker提取式压缩LLMChainExtractor——将每个查询文档发给模型要求模型从中提取出与查询最相关的句子。这样冗余信息被滤掉返回的文档短小精悍。重排序压缩CrossEncoderReranker——调用Cross-Encoder对候选文档做二次评分按得分排序后截取Top-K输出。两者的设计都遵循LangChain统一的BaseDocumentCompressor接口可轻松注入ContextualCompressionRetriever。核心API/组件源码解读4.1 ContextualCompressionRetrieverfromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportLLMChainExtractor,CrossEncoderReranker# 基础检索器base_retrievervectorstore.as_retriever(search_kwargs{k:10})# 压缩器compressorLLMChainExtractor.from_llm(llm)# 包装compression_retrieverContextualCompressionRetriever(base_retrieverbase_retriever,base_compressorcompressor)4.2 CohereRerank 官方封装fromlangchain_cohereimportCohereRerank rerankCohereRerank(modelrerank-multilingual-v3.0,top_n3)# 在 ContextualCompressionRetriever 中使用retrieverContextualCompressionRetriever(base_retrieverbase_retriever,base_compressorrerank)Cohere的Rerank API返回按照查询相关性排序后的文档列表是工业级重排序实现的首选。4.3 使用BM25s构建关键词检索bm25s库实现高性能检索完全内存运行不依赖外部索引服务器importbm25sdefbuild_bm25_retriever(corpus:list[str])-bm25s.BM25:retrieverbm25s.BM25(corpuscorpus)retriever.index(bm25s.tokenize(corpus))returnretrieverdefbm25_search(retriever:bm25s.BM25,query:str,k:int5):results,scoresretriever.retrieve(bm25s.tokenize([query]),kk)returnresults[0]# 返回文档列表手把手项目实战教学实战一混合检索 RRF 融合打分构建一个小型演示库实现向量检索与BM25检索并行融合返回。importbm25sfromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain.retrieversimportEnsembleRetriever# 准备语料corpus[LangChain是一个开源的LLM应用框架,RAG通过外部知识库提升生成准确性,Spring Boot 3.5引入了新的自动配置特性,向量数据库用于存储海量文本向量]# 向量检索器embeddingsHuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2)vectorstoreFAISS.from_texts(corpus,embeddings)vector_retrievervectorstore.as_retriever(search_kwargs{k:10})# BM25检索器keyword_retrieverbm25s.BM25(corpuscorpus)keyword_retriever.index(bm25s.tokenize(corpus))# 使用 LangChain 的 EnsembleRetriever 进行融合ensemble_retrieverEnsembleRetriever(retrievers[vector_retriever,keyword_retriever],weights[0.5,0.5])querySpring Boot 3.5新特性docsensemble_retriever.invoke(query)print(f混合检索结果:{[doc.page_contentfordocindocs]})实战二重排序器与压缩检索器集成将CrossEncoderReranker组件直接接入ContextualCompressionRetriever。fromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportCrossEncoderRerankerfromsentence_transformersimportCrossEncoder# 加载重排序模型modelCrossEncoder(BAAI/bge-reranker-base)rerankerCrossEncoderReranker(modelmodel,top_n3)compression_retrieverContextualCompressionRetriever(base_retrievervector_retriever,base_compressorreranker)resultcompression_retriever.invoke(LangChain的核心组件)fordocinresult:print(doc.page_content[:80])实战三一站式链式优化混合检索重排序生成联动fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough promptChatPromptTemplate.from_template(基于上下文回答问题:\n{context}\n问题:{query})chain({context:compression_retriever|(lambdadocs:\n.join([d.page_contentfordindocs])),query:RunnablePassthrough()}|prompt|llm|StrOutputParser())print(chain.invoke(LangChain中链是什么概念))完整可运行Python代码将三大优化集成实现完整工业级RAG管道。#!/usr/bin/env python# -*- coding: utf-8 -*-LangChain 第22课RAG进阶优化完整示例混合检索引申重排序压缩importbm25sfromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchain.retrieversimportEnsembleRetrieverfromlangchain.retrieversimportContextualCompressionRetrieverfromlangchain.retrievers.document_compressorsimportCrossEncoderRerankerfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthroughfromsentence_transformersimportCrossEncoderfromdotenvimportload_dotenv load_dotenv()corpus[LangChain是构建LLM应用的开源框架。,RAG通过检索外部知识提升生成准确性。,Spring Boot 3.5引入了新特性。,向量数据库用于存储文本向量。,重排序通过Cross-Encoder提高检索精度。]embeddingsHuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2)vectorstoreFAISS.from_texts(corpus,embeddings)vector_retrievervectorstore.as_retriever(search_kwargs{k:5})bm25_retrieverbm25s.BM25(corpuscorpus)bm25_retriever.index(bm25s.tokenize(corpus))ensemble_retrieverEnsembleRetriever(retrievers[vector_retriever,bm25_retriever],weights[0.5,0.5])modelCrossEncoder(BAAI/bge-reranker-base)rerankerCrossEncoderReranker(modelmodel,top_n3)compression_retrieverContextualCompressionRetriever(base_retrieverensemble_retriever,base_compressorreranker)querySpring Boot 3.5新特性docscompression_retriever.invoke(query)print(f重排后最终检索到{len(docs)}个文档)fordocindocs:print(f-{doc.page_content[:80]})环境依赖安装命令# 激活虚拟环境sourcevenv/bin/activate# venv\Scripts\activate# 全量安装pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1 chromadb sentence-transformers langchain-text-splitters langchain-cohere bm25s rank_bm25 torch# 重排开源模型依赖pipinstalltransformers flagembedding请确保在.env文件中配置好COHERE_API_KEY若使用Cohere Rerank或预先下载BAAI/bge-reranker-base。常见报错坑点与避坑方案坑1混合检索时向量库用GPT Embedding但搜索出的文本张冠李戴原因嵌入模型可能在向量空间中过于近似导致乱匹配。方案改用领域微调嵌入模型或语义分割/混合检索补足。坑2BM25索引加载慢原因每次服务启动重建索引占用性能。方案持久化BM25索引利用bm25s内置save能力。坑3重排序模型过大原因BGE-Reranker-large占用显存超3GB不适合轻薄型部署。方案采用BGE-Reranker-base或轻量级ms-marco-MiniLM-L-6-v2。坑4RRF融合后仍召回不相关的文档原因BM25或向量检索初筛质量太差。方案增加初始召回数量或添加元数据预过滤。本节核心知识点总结混合检索通过向量检索BM25提升召回广度和专有名词匹配度是RAG系统的主流基石。重排序使用Cross-Encoder模型二次打分修正召回排序偏差是提升精度的核心组件。上下文压缩有效剔除冗余片段改善提示Token效率。EnsembleRetriever和ContextualCompressionRetriever封装了两阶段漏斗的标准实现。课后练习题向混合检索中加入第三个权重分配例如BM25与向量检索各占50%。解释为什么Cross-Encoder比向量检索更适合精排。Cohere Rerank和开源BGE-Reranker优缺点。参考答案第1题实现向量与BM25两部分权重相加融合。RRF用排名位置而非原始得分避免了归一化问题。第2题Bi-Encoder独立编码查询和文档信息交互不足Cross-Encoder拼接联合编码自注意力机制深度捕捉精确关联。第3题Cohere托管模型方便但成本较高BGE-Reranker完全免费适合本地部署与隐私场景。《30节课 LangChain 从入门到精通》系列课程导航去订阅 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见