
纲要检索器概述Retriever在 RAG 中的核心角色统一接口invoke/ainvoke基础检索器与词法检索器向量数据库一键封装as_retriever()经典词法检索BM25Retriever查询重写多重查询原理将模糊问题改写为多个精准子问题实现MultiQueryRetriever与模拟模型查询重构自然语言转 SQL流程自然语言 → SQL → 执行 → 答案使用FakeListChatModel模拟 SQL 生成与回答检索策略对比与选型建议完整可运行代码无需 API Key引言在 RAG 系统中检索器Retriever负责将用户的自然语言问题与知识库中最相关的文档片段关联起来。LangChain 将检索器抽象为标准的Runnable组件不仅支持基础的向量相似度搜索还内置了查询重写、查询重构等高级策略以显著提升召回率和答案质量。本文将带你从最简单的as_retriever()起步逐步深入到多重查询MultiQuery和文本到 SQL 的查询重构并提供无需外部 API 即可运行的完整示例。检索器基础所有向量数据库都可以通过.as_retriever()方法一键转换为检索器并直接使用invoke进行查询。以下示例使用 Chroma 内存向量库和FakeEmbeddings模拟嵌入过程。fromlangchain_community.embeddings.fakeimportFakeEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.documentsimportDocument# 准备文档docs[Document(page_contentLangChain 是一个强大的 LLM 应用框架。),Document(page_contentRAG 结合检索与生成提升回答准确性。),Document(page_content向量数据库用于存储文档的高维向量表示。),]# 构建向量库embeddingsFakeEmbeddings(size128)vectorstoreChroma.from_documents(docs,embeddings,collection_nameintro)# 转换为检索器retrievervectorstore.as_retriever(search_kwargs{k:2})# 查询resultsretriever.invoke(什么是 RAG)fordocinresults:print(doc.page_content)词法检索器BM25BM25 是一种基于词频和逆文档频率的经典排序算法适合精准字面匹配。LangChain 提供了BM25Retriever。安装依赖pipinstalllangchain-community rank_bm25fromlangchain_community.retrieversimportBM25Retrieverfromlangchain_core.documentsimportDocument# 准备文档corpus[Document(page_contentLangChain 链式调用),Document(page_contentRAG 检索增强生成),Document(page_content向量数据库 Chroma 和 FAISS),Document(page_contentBM25 是一种词法检索算法),]# 创建 BM25 检索器bm25_retrieverBM25Retriever.from_documents(corpus)bm25_retriever.k2# 返回前 2 个# 检索resultsbm25_retriever.invoke(检索算法)fordocinresults:print(doc.page_content)查询重写多重查询MultiQueryRetriever用户的问题往往比较模糊多重查询技术会先用大模型将原始问题改写为多个更精确的子问题再对每个子问题分别检索最后合并结果。这样可以大幅提高召回率和答案的相关性。我们使用FakeListChatModel模拟大模型的改写能力无需真实 API。用户原始问题大模型改写子问题1子问题2子问题3向量检索合并去重返回相关文档fromlangchain_community.vectorstoresimportChromafromlangchain_community.embeddings.fakeimportFakeEmbeddingsfromlangchain_core.documentsimportDocumentfromlangchain.retrievers.multi_queryimportMultiQueryRetrieverfromlangchain_community.chat_models.fakeimportFakeListChatModel# 构建知识库docs[Document(page_contentLangChain 提供了丰富的组件用于构建 RAG 应用。),Document(page_content查询重写技术可以将一个笼统的问题拆解为多个子问题。),Document(page_contentMultiQueryRetriever 利用 LLM 生成多个查询变体。),Document(page_content向量检索基于余弦相似度或欧氏距离。),]embeddingsFakeEmbeddings(size128)vectorstoreChroma.from_documents(docs,embeddings,collection_namemq)# 基础检索器base_retrievervectorstore.as_retriever(search_kwargs{k:1})# 模拟大模型预设改写结果# MultiQueryRetriever 期望模型返回一个包含 queries 的 JSONfake_llmFakeListChatModel(responses[{queries: [如何提高检索准确性, 有哪些检索优化方法, MultiQueryRetriever 的工作原理]}])# 创建多重查询检索器multi_retrieverMultiQueryRetriever.from_llm(retrieverbase_retriever,llmfake_llm)# 查询resultsmulti_retriever.invoke(如何让搜索更准)fordocinresults:print(doc.page_content)运行后你会发现原始问题被扩展为多个子问题从而检索到更全面的相关文档。查询重构自然语言转 SQL另一种常见的检索优化是将自然语言问题重构为精确的 SQL 语句尤其适用于结构化数据查询。我们模拟一个简单场景用户问“销售额最高的员工”系统将其转为 SQL 并执行再将结果喂给模型生成最终答案。fromlangchain_community.chat_models.fakeimportFakeListChatModelfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnableLambda# 模拟数据库查询函数defexecute_sql(sql:str)-str:# 实际环境中连接数据库执行这里返回模拟结果if销售额insql:return员工A: 100万, 员工B: 80万return无数据# 模拟大模型第一次返回 SQL第二次返回自然语言答案fake_llmFakeListChatModel(responses[SELECT employee, revenue FROM sales ORDER BY revenue DESC LIMIT 2;,销售额最高的员工是员工A(100万)和员工B(80万)。])# 第一步生成 SQLsql_promptChatPromptTemplate.from_template(将以下问题转换为 SQL 语句仅返回 SQL:\n{question})sql_chainsql_prompt|fake_llm|StrOutputParser()# 第二步生成最终答案answer_promptChatPromptTemplate.from_template(根据 SQL 查询结果回答问题:\n问题: {question}\nSQL 结果: {result})answer_chainanswer_prompt|fake_llm|StrOutputParser()# 完整链自然语言 - SQL - 执行 - 答案deffull_chain(question:str):sqlsql_chain.invoke({question:question})resultexecute_sql(sql)answeranswer_chain.invoke({question:question,result:result})return{sql:sql,result:result,answer:answer}responsefull_chain(哪两位员工的销售额最高)print(生成的 SQL:,response[sql])print(执行结果:,response[result])print(最终答案:,response[answer])这个流程清晰地展示了查询重构如何将自然语言映射到结构化查询语言大大简化了数据访问。检索策略对比策略适用场景典型组件向量检索通用 RAG语义搜索vectorstore.as_retriever()词法检索BM25精准关键词匹配BM25Retriever多重查询用户问题模糊需拆解MultiQueryRetriever文本到 SQL结构化数据库查询自定义链 SQL 执行混合检索词法 向量兼顾精准与泛化需向量库支持如 Pinecone总结检索器是 RAG 系统的灵魂LangChain 不仅提供了统一的操作接口还封装了多种检索优化策略。从基础的向量检索到智能的查询重写与重构开发者可以根据业务需求灵活组合。通过本文的模拟示例你可以在没有外部 API 的情况下快速验证这些高级特性为真实项目打下坚实基础。