Retriever  Chain in LangChain 完整深度解读
Retriever Chain in LangChain 完整深度解读适配 LangChain 0.1 新版 API区分 legacyRetrievalQA与现代 LCEL 写法 核心定位RAG 的两大基础组件 ——Retriever检索器负责找文档Chain链路负责把检索结果 问题喂给大模型生成答案一、基础概念划分1. Retriever 检索器接口基类BaseRetriever职责接收字符串 query → 返回相关文档列表List[Document]python运行class BaseRetriever: def get_relevant_documents(self, query: str) - List[Document]: ... async def aget_relevant_documents(self, query: str) - List[Document]: ...常见实现VectorStoreRetriever最常用向量数据库包装器相似度检索FAISS/Chroma/PineconeMultiQueryRetriever扩写多条 query 做多路检索召回ParentDocumentRetriever小块检索、返回大块原文SelfQueryRetriever让 LLM 解析过滤条件带元数据筛选EnsembleRetriever多路检索结果融合BM25 向量混合检索ContextCompressionRetriever检索后压缩无用片段关键点Retriever只负责召回文档不调用 LLM不生成答案。2. Chain链路LangChain Chain 本质可执行的调用单元输入字典 → 输出字典旧版Chain基类 新版推荐LCEL — LangChain Expression Language|管道语法所有组件Prompt、LLM、Retriever、Parser统一实现Runnable接口。RAG 核心目标plaintext用户问题 → Retriever召回文档 → 组装Prompt(问题上下文) → LLM生成回答二、经典两种实现方案对比方案 A遗留风格 — RetrievalQA Chain不推荐新项目python运行from langchain.chains import RetrievalQA qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 四种文档拼接策略重点 retrievervectorstore.as_retriever(), return_source_documentsTrue )chain_type 四种模式核心考点stuff塞满模式所有检索文档一次性全部塞进 Prompt ✅ 简单、只调用一次 LLM ❌ 上下文窗口有限文档多时触发超限map_reducemap每份文档单独调用 LLM 摘要 reduce把所有摘要汇总再生成最终答案 ✅ 支持超长文档集合 ❌ LLM 调用量大成本高、速度慢map_rerank每份文档独立打分挑选最高分文档生成答案 适合 “只有一份文档包含答案” 场景refine先拿第一篇文档生成答案再依次传入剩余文档迭代优化答案 ✅ 上下文连续性好 ❌ 串行执行速度极慢⚠️ LangChain 官方建议新项目不要用RetrievalQA优先 LCEL。方案 B现代标准 — LCEL RAG Chain【生产首选】标准管道公式plaintext{question} | retriever # 输出 List[Document] | (把文档question灌入prompt模板) | llm | output_parser完整可运行最简模板python运行from langchain.vectorstores import Chroma from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough # 1. 初始化向量库 Retriever vectorstore Chroma.from_texts(..., embeddingOpenAIEmbeddings()) retriever vectorstore.as_retriever(search_kwargs{k: 4}) # 2. Prompt prompt ChatPromptTemplate.from_template( 基于下面上下文回答问题如果找不到答案如实说不知道。 上下文 {context} 问题{question} ) llm ChatOpenAI(modelgpt-3.5-turbo) # 工具函数Document列表拼接成字符串 def format_docs(docs): return \n\n.join(doc.page_content for doc in docs) # 3. LCEL 组装RAG链 rag_chain ( {context: retriever | format_docs, question: RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # 调用 resp rag_chain.invoke(你的问题) print(resp)管道拆解解释{context: retriever | format_docs, question: RunnablePassthrough()}输入字符串 questionquestion直接透传给 prompt 变量question 送入 retriever 拿到文档列表 → format_docs 转为文本上下文字典传入 prompt 模板填充变量送入 LLMStrOutputParser 把 AI 消息转为纯文本优势高度透明每一步可单独调试支持流式.stream()、异步.ainvoke()易于插入中间日志、缓存、重试、过滤器方便改造添加重排序、查询改写、自我检查三、Retriever 进阶核心机制1.search_kwargs参数VectorStoreRetrieverpython运行retriever vectorstore.as_retriever( search_typesimilarity, # 相似度检索 # search_typemmr, # MMR最大边际相关性去冗余 # search_typesimilarity_score_threshold # 阈值过滤 search_kwargs{ k: 4, # 返回top-k文档 score_threshold: 0.6, # 相似度阈值 filter: {source: doc1.pdf} # 元数据过滤 } )similarity单纯距离排序默认MMR召回同时保证相关性 多样性减少重复片段阈值检索低于阈值直接丢弃减少噪声2. 高级 Retriever 组合实战(1) MultiQueryRetriever 查询改写利用 LLM 把原始问题生成多条不同表述 query多路检索提升召回覆盖面python运行from langchain.retrievers.multi_query import MultiQueryRetriever mq_retriever MultiQueryRetriever.from_llm(retrieverbase_retriever, llmllm)(2) ContextCompressionRetriever 上下文压缩检索到文档后用 LLM 过滤掉无关段落减少 Prompt 占用 tokenpython运行from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor compressor LLMChainExtractor.from_llm(llm) compress_retriever ContextualCompressionRetriever(base_retrieverretriever, base_compressorcompressor)(3) EnsembleRetriever 混合检索向量 BM25稀疏检索 (BM25) 稠密向量检索融合大幅提升冷召回效果工业界标配python运行from langchain.retrievers import EnsembleRetriever ensemble_retriever EnsembleRetriever( retrievers[bm25_retriever, vector_retriever], weights[0.5, 0.5] )四、RAG 常见扩展 Chain 链路LCEL 扩展1. 带源文档返回LCEL 原生不像 RetrievalQA 自动返回 source_docs需要手动封装python运行from langchain_core.runnables import RunnableParallel rag_chain_with_source RunnableParallel( {context: retriever, question: RunnablePassthrough()} ).assign( answer (lambda x: {context: format_docs(x[context]), question: x[question]}) | prompt | llm | StrOutputParser() ) out rag_chain_with_source.invoke(问题) # out[context] → List[Document] # out[answer] → 回答文本2. 自校验 RAGSelf-RAG 思路简化版链路检索 → 判断文档是否相关 → 不相关则重新检索 / 直接拒绝回答3. 路由 Retriever多个知识库分流plaintext用户问题 → LLM路由判断属于哪个知识库 → 调用对应Retriever五、关键误区澄清❌ 混淆 Retriever ≠ VectorStore VectorStore存储 向量相似度计算 Retriever封装 VectorStore统一的检索接口一个 VectorStore 可以实例多个不同参数 Retriever❌ RetrievalQA RAG 标准实现 ✅ RetrievalQA 只是早期封装灵活性差LCEL 是官方现代标准❌ retriever 直接接收结构化对象 ✅ BaseRetriever 输入永远是字符串 query不能直接传复杂对象❌ stuff 模式能无限塞文档 ✅ 超出模型上下文窗口会报错 / 截断必须配合文档压缩、map_reduce 或者切分优化六、完整数据流全景图plaintextUser Query(str) ↓ 【Runnable字典分发】 ├─ question → 直接透传 └─ query → Retriever向量库/BM25等 ↓ List[Document] → format_docs → 上下文文本 ↓ PromptTemplate填充 {context} {question} ↓ ChatLLM ↓ OutputParser → 最终答案七、调试手段开发必备单独测试 Retriever先确认召回文档质量python运行docs retriever.get_relevant_documents(测试问题) for d in docs: print(d.page_content, d.metadata)RAG 效果差 70% 问题出在检索召回而不是 LLM 生成打印送入 LLM 完整 Prompt排查是否拼接错误使用.bind()设置温度、流式输出python运行rag_chain.stream(问题)八、生产优化方向调整k、MMR、相似度阈值平衡召回数量与噪声接入重排序器CrossEncoderReranker检索后精排增加查询改写、拼写纠错增加缓存相同 query 避免重复向量检索增加文档去重、长度过滤

相关新闻

解决C++项目编译错误:fatal error: google/protobuf/port_def.inc缺失

解决C++项目编译错误:fatal error: google/protobuf/port_def.inc缺失

1. 项目概述:当C遇上Protobuf的“拦路虎”如果你正在用C开发一个需要网络通信或数据序列化的项目,比如一个游戏服务器或者一个分布式计算框架,那么你大概率会引入Google的Protocol Buffers(简称Protobuf)这个强大的工具…

2026/7/24 6:53:41阅读更多 →
AI学术写作助手:智能选题与论文优化全流程解析

AI学术写作助手:智能选题与论文优化全流程解析

1. 项目概述:AI如何重塑学术写作体验作为一名在学术写作领域深耕多年的研究者,我见证了无数学生在课程论文写作中遇到的困境。从选题迷茫到文献梳理,从结构搭建到语言润色,每个环节都可能成为学术道路上的绊脚石。"书匠策AI&…

2026/7/24 6:53:41阅读更多 →
MSPM33 I/O控制核心:IOMUX与GPIO的低功耗唤醒与硬件事件管理实战

MSPM33 I/O控制核心:IOMUX与GPIO的低功耗唤醒与硬件事件管理实战

1. 项目概述:从引脚到系统,理解MSPM33的I/O控制核心在嵌入式开发领域,尤其是针对电池供电的物联网设备、便携式医疗仪器或智能传感器节点,我们常常面临一个核心矛盾:如何在有限的芯片引脚上实现尽可能多的功能&#xf…

2026/7/24 6:53:41阅读更多 →
基于CNN的水稻倒伏智能监测系统设计与实现

基于CNN的水稻倒伏智能监测系统设计与实现

1. 项目背景与核心价值水稻伏倒是农业生产中常见的灾害现象,当水稻茎秆因风雨、病虫害等原因发生倾斜或倒伏时,会导致产量下降20%-50%不等。传统的人工巡检方式效率低下且主观性强,而基于计算机视觉的自动化识别技术正逐渐成为农业监测领域的…

2026/7/24 11:24:30阅读更多 →
计算机毕业设计之基于SpringBoot的青少年编程线上比赛系统的设计与开发

计算机毕业设计之基于SpringBoot的青少年编程线上比赛系统的设计与开发

随着信息技术的飞速发展,编程教育在青少年群体中的普及程度日益提高,各类编程竞赛活动蓬勃兴起。然而,传统线下比赛模式受限于场地、时间及地域等因素,难以满足大规模、高效率的竞赛组织需求。青少年编程线上比赛系统应运而生&…

2026/7/24 11:24:30阅读更多 →
AI隐形化时代:人类经验价值的三大核心维度与资本化路径

AI隐形化时代:人类经验价值的三大核心维度与资本化路径

1. 为什么AI的"隐形化"正在重塑职场价值体系 上周调试代码时,我突然发现GitHub Copilot已经能自动补全整个函数逻辑。这个瞬间让我意识到:AI工具正在像电力一样融入工作环境,变得无处不在却又难以察觉。当AI逐渐"消失"在…

2026/7/24 11:24:30阅读更多 →
MSP430 CPUX指令集实战:从位操作到内存优化的嵌入式高效编程

MSP430 CPUX指令集实战:从位操作到内存优化的嵌入式高效编程

1. MSP430 CPUX指令集:从芯片手册到高效代码的实战指南如果你正在为MSP430系列微控制器编写底层驱动或对性能有极致要求的应用代码,那么绕不开的就是它的指令集。官方几百页的技术手册(比如SLAU272D)里密密麻麻的表格和描述&#…

2026/7/24 11:24:30阅读更多 →
Docker-Compose进阶:生产环境配置与优化指南

Docker-Compose进阶:生产环境配置与优化指南

1. 为什么需要深入学习docker-compose? 第一次接触docker-compose时,很多人会觉得它就是个简单的容器编排工具——写个YAML文件,把几个服务连起来就完事了。但真正在生产环境使用后,你会发现这就像以为会骑自行车就能参加环法大赛…

2026/7/24 11:24:30阅读更多 →
企业微信智能机器人LangBot的核心技术与应用实践

企业微信智能机器人LangBot的核心技术与应用实践

1. 项目概述:企业微信智能机器人的价值与定位LangBot是一款基于企业微信平台的智能对话机器人解决方案,专门针对企业内部沟通场景设计。不同于市面上通用的聊天机器人,它深度整合了企业微信的组织架构和权限体系,能够无缝对接企业…

2026/7/24 11:22:30阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →